DigitalOcean KubernetesでSpinnakerを使用してCDパイプラインをセットアップする方法

著者は、Write for DOnationsプログラムの一部として寄付を受け取るためにFree and Open Source Fundを選択しました。

前書き

Spinnakerは、強力でカスタマイズ可能なパイプラインシステムを使用して、高速で安全かつ反復可能な展開を実現するオープンソースのリソース管理および継続的デリバリーアプリケーションです。 Spinnakerを使用すると、DigitalOcean Kubernetesを含む多くのプラットフォームへのアプリケーションの自動展開が可能になります。 デプロイするとき、独自のデプロイメント戦略を作成するオプションを使用して、HighlanderやRed / blackなどの組み込みのdeployment strategiesを使用するようにSpinnakerを構成できます。 JenkinsやTravisCIなどの他のDevOpsツールと統合でき、GitHubリポジトリとDockerレジストリを監視するように構成できます。

Spinnakerは、さまざまなプラットフォームにSpinnakerを構成および展開するために特別に構築されたツールであるHalyardによって管理されます。 Spinnakerでは、アプリケーションの設定とパイプラインを永続化するためにexternal storageが必要です。 DigitalOcean Spacesなど、このタスクのさまざまなプラットフォームをサポートします。

このチュートリアルでは、Halyardを使用して、DigitalOcean Spacesをバックエンドストレージとして、SpinnakerをDigitalOcean Kubernetesにデプロイします。 また、Spinnakerを目的のドメインで使用できるように設定し、Let's Encrypt TLS証明書を使用して保護します。 次に、Spinnakerでサンプルアプリケーションを作成し、パイプラインを作成して、Hello WorldアプリをKubernetesクラスターにデプロイします。 テスト後、GitHub Organizationsを介して認証と承認を導入します。 最終的に、Kubernetesクラスターに安全で動作するSpinnaker展開ができます。

[.note]#Note:このチュートリアルは、Spinnaker1.13.5
で特別にテストされています#

前提条件

  • official instructionsに従って、ローカルマシンにインストールされたハリヤード。 16.04以降のUbuntuバージョンでHalyardを使用することはサポートされていないことに注意してください。 このような場合は、via Dockerを使用できます。

  • 接続がkubectlのデフォルトとして構成されたDigitalOceanKubernetesクラスター。 クラスターには、少なくとも8GBのRAMとSpinnakerで使用可能な4つのCPUコアが必要です(より重い使用の場合はさらに多く必要です)。 kubectlを構成する方法の説明は、クラスターの作成時に表示されるConnect to your Clusterステップの下に表示されます。 DigitalOceanでKubernetesクラスターを作成するには、Kubernetes Quickstartを参照してください。

  • クラスタにインストールされたNginx Ingress Controllerおよびcert-manager。 これを行う方法のガイドについては、How to Set Up an Nginx Ingress with Cert-Manager on DigitalOcean Kubernetesを参照してください。

  • APIキー(アクセスおよびシークレット)を持つDigitalOcean Space。 DigitalOcean SpaceおよびAPIキーを作成するには、How To Create a DigitalOcean Space and API Keyを参照してください。

  • イングレスが使用するDigitalOceanロードバランサーを指す3つのDNS Aレコードを持つドメイン名。 DigitalOceanを使用してドメインのDNSレコードを管理している場合は、How to Create DNS Recordsを参照してAレコードを作成してください。 このチュートリアルでは、Aレコードをspinnaker.example.comspinnaker-api.example.com、およびhello-world.example.comと呼びます。

  • GitHubアカウント。管理者権限と公開表示を使用して、GitHub組織に追加されます。 アカウントは、組織内のチームのメンバーでもある必要があります。 これは、ステップ5を完了するために必要です。

[[step-1 -—- adding-a-kubernetes-account-with-halyard]] ==ステップ1—HalyardでKubernetesアカウントを追加する

このセクションでは、Halyardを介してKubernetesアカウントをSpinnakerに追加します。 アカウントは、Spinnakerの用語では、クラウドプロバイダーへのアクセスに使用する名前付きの資格情報です。

前提条件の一部として、テスト目的でecho1およびecho2サービスとecho_ingress入力を作成しました。このチュートリアルではこれらは必要ないため、削除できます。

次のコマンドを実行して、イングレスを削除することから始めます。

kubectl delete -f echo_ingress.yaml

次に、2つのテストサービスを削除します。

kubectl delete -f echo1.yaml && kubectl delete -f echo2.yaml

kubectl deleteコマンドは、-fパラメーターが渡されると、削除するファイルを受け入れます。

次に、ローカルマシンから、ワークスペースとして機能するフォルダーを作成します。

mkdir ~/spinnaker-k8s

次のコマンドを実行して、ワークスペースに移動します。

cd ~/spinnaker-k8s

HalyardはSpinnakerの展開先をまだ知りません。 次のコマンドでKubernetesプロバイダーを有効にします。

hal config provider kubernetes enable

次の出力が表示されます。

Output+ Get current deployment
  Success
+ Edit the kubernetes provider
  Success
Problems in default.provider.kubernetes:
- WARNING Provider kubernetes is enabled, but no accounts have been
  configured.

+ Successfully enabled kubernetes

HalyardはKubernetesプロバイダーを有効にするために行ったすべての手順を記録し、アカウントがまだ定義されていないことを警告しました。

次に、RBACとともにSpinnakerのKubernetesservice accountを作成します。 サービスアカウントは、単一の名前空間にスコープされるアカウントの一種です。 これはソフトウェアによって使用され、クラスター内のさまざまなタスクを実行できます。 RBAC(Role Based Access Control)は、Kubernetesクラスター内のリソースへのアクセスを規制する方法です。 重要な構成がクラスターで不注意に変更されないように、アカウントのアクションの範囲を制限します。

ここでは、Spinnakerにcluster-admin権限を付与して、クラスター全体を制御できるようにします。 より制限の厳しい環境を作成したい場合は、official Kubernetes documentation on RBACを参照してください。

まず、次のコマンドを実行して、spinnaker名前空間を作成します。

kubectl create ns spinnaker

出力は以下のようになります。

Outputnamespace/spinnaker created

次のコマンドを実行して、spinnaker-service-accountという名前のサービスアカウントを作成します。

kubectl create serviceaccount spinnaker-service-account -n spinnaker

-nフラグを使用して、kubectlspinnaker名前空間にサービスアカウントを作成するように指定しました。 出力は次のようになります。

Outputserviceaccount/spinnaker-service-account created

次に、それをcluster-adminロールにバインドします。

kubectl create clusterrolebinding spinnaker-service-account --clusterrole cluster-admin --serviceaccount=spinnaker:spinnaker-service-account

次の出力が表示されます。

Outputclusterrolebinding.rbac.authorization.k8s.io/spinnaker-service-account created

Halyardはローカルのkubectlを使用してクラスターにアクセスします。 Spinnakerを展開する前に、新しく作成したサービスアカウントを使用するように設定する必要があります。 Kubernetesアカウントは、ユーザー名とトークンを使用して認証します。 サービスアカウントが作成されると、Kubernetesは新しいシークレットを作成し、アカウントトークンを設定します。 spinnaker-service-accountのトークンを取得するには、最初にシークレットの名前を取得する必要があります。 次のコマンドを実行して、TOKEN_SECRETという名前のコンソール変数にフェッチできます。

TOKEN_SECRET=$(kubectl get serviceaccount -n spinnaker spinnaker-service-account -o jsonpath='{.secrets[0].name}')

これは、名前空間spinnakerからspinnaker-service-accountに関する情報を取得し、JSONパスを渡すことによって含まれる最初のシークレットの名前をフェッチします。

次のコマンドを実行して、シークレットの内容をTOKENという名前の変数にフェッチします。

TOKEN=$(kubectl get secret -n spinnaker $TOKEN_SECRET -o jsonpath='{.data.token}' | base64 --decode)

これで、環境変数TOKENで使用できるトークンができました。 次に、kubectlでサービスアカウントの認証情報を設定する必要があります。

kubectl config set-credentials spinnaker-token-user --token $TOKEN

次の出力が表示されます。

OutputUser "spinnaker-token-user" set.

次に、次のコマンドを実行して、現在のコンテキストのユーザーを新しく作成されたspinnaker-token-userに設定する必要があります。

kubectl config set-context --current --user spinnaker-token-user

現在のユーザーをspinnaker-token-userに設定することにより、kubectlはspinnaker-service-accountを使用するように構成されますが、Halyardはそれについて何も知りません。 次を実行して、Kubernetesプロバイダーにアカウントを追加します。

hal config provider kubernetes account add spinnaker-account --provider-version v2

出力は次のようになります。

Output+ Get current deployment
  Success
+ Add the spinnaker-account account
  Success
+ Successfully added account spinnaker-account for provider
  kubernetes.

このコマンドは、spinnaker-accountという名前のKubernetesアカウントをHalyardに追加し、サービスアカウントとしてマークします。

一般に、Spinnakerは、分散インストールまたはローカルインストールの2つの方法で展開できます。 Distributedのインストールは、このチュートリアルで完了しているものです。つまり、クラウドにデプロイします。 一方、Localのインストールは、Halyardが実行されているマシンにSpinnakerがダウンロードされてインストールされることを意味します。 SpinnakerをKubernetesにデプロイするため、次のようにデプロイメントをdistributedとしてマークする必要があります。

hal config deploy edit --type distributed --account-name spinnaker-account

Spinnakerデプロイメントはイメージを構築するため、Spinnakerでartifactsを有効にする必要があります。 次のコマンドを実行して、それらを有効にできます。

hal config features edit --artifacts true

ここでは、artifactsを有効にして、Spinnakerが作成するオブジェクトに関するより多くのメタデータを保存できるようにしました。

Halyardを介してSpinnakerにKubernetesアカウントを追加しました。 Kubernetesプロバイダーを有効にし、RBACロールを構成し、現在のkubectl構成をSpinnakerに追加して、プロバイダーにアカウントを追加しました。 次に、バックエンドストレージをセットアップします。

[[step-2 -—- configuring-the-space-as-the-underlying-storage]] ==ステップ2—スペースを基礎となるストレージとして構成する

このセクションでは、スペースをSpinnakerデプロイメントの基礎となるストレージとして構成します。 SpinnakerはSpaceを使用して、その構成とパイプライン関連のデータを保存します。

HalyardでS3ストレージを構成するには、次のコマンドを実行します。

hal config storage s3 edit --access-key-id your_space_access_key --secret-access-key --endpoint spaces_endpoint_with_region_prefix --bucket space_name --no-validate

your_space_access_keyをスペースアクセスキーに置き換え、spaces_endpoint_with_region_prefixをスペースのエンドポイントに置き換えることを忘れないでください。 これは通常region-id.digitaloceanspaces.comであり、region-idはスペースの領域です。 space_nameをスペースの名前に置き換えることができます。 --no-validateフラグは、DigitalOcean Spaces検証がサポートされていないため、指定された設定をすぐに検証しないようにHalyardに指示します。

このコマンドを実行すると、Halyardはシークレットアクセスキーを要求します。 入力して続行すると、次の出力が表示されます。

Output+ Get current deployment
  Success
+ Get persistent store
  Success
+ Edit persistent store
  Success
+ Successfully edited persistent store "s3".

s3ストレージを構成したので、次のコマンドを実行して、デプロイメントがこれをストレージとして使用することを確認します。

hal config storage edit --type s3

出力は次のようになります。

Output+ Get current deployment
  Success
+ Get persistent storage settings
  Success
+ Edit persistent storage settings
  Success
+ Successfully edited persistent storage.

Spinnakerのインスタンスが使用する基礎となるストレージとしてSpaceを設定しました。 次に、SpinnakerをKubernetesクラスターにデプロイし、Nginx Ingress Controllerを使用してドメインで公開します。

[[step-3 -—- deploying-spinnaker-to-your-cluster]] ==ステップ3—Spinnakerをクラスターにデプロイする

このセクションでは、Halyardを使用してSpinnakerをクラスターにデプロイし、Nginx Ingressを使用してドメインのUIおよびAPIコンポーネントを公開します。 まず、ドメインURLを構成します。1つはSpinnakerのユーザーインターフェイス用で、もう1つはAPIコンポーネント用です。 次に、目的のバージョンのSpinnakerを選択し、Halyardを使用して展開します。 最後に、イングレスを作成し、Nginxコントローラーとして構成します。

最初に、HalyardでSpinnakerのUIとAPI URLの構成値を編集し、目的のドメインに設定する必要があります。 APIエンドポイントを目的のドメインに設定するには、次のコマンドを実行します。

hal config security api edit --override-base-url https://spinnaker-api.example.com

出力は以下のようになります。

Output+ Get current deployment
  Success
+ Get API security settings
  Success
+ Edit API security settings
  Success
...

SpinnakerにアクセスするドメインにUIエンドポイントを設定するには、次を実行します。

hal config security ui edit --override-base-url https://spinnaker.example.com

出力は以下のようになります。

Output+ Get current deployment
  Success
+ Get UI security settings
  Success
+ Edit UI security settings
  Success
+ Successfully updated UI security settings.

spinnaker-api.example.comspinnaker.example.comをドメインに置き換えることを忘れないでください。 これらは、Nginx Ingress Controllerの前提条件で作成したロードバランサーをポイントしたドメインです。

SpinnakerのKubernetesアカウントを作成して保護し、Spaceを基盤となるストレージとして設定し、UIとAPIエンドポイントをドメインに設定しました。 これで、使用可能なSpinnakerバージョンをリストできます。

hal version list

出力には、使用可能なバージョンのリストが表示されます。 この記事を書いている時点では、1.13.5が最新バージョンでした。

Output+ Get current deployment
  Success
+ Get Spinnaker version
  Success
+ Get released versions
  Success
+ You are on version "", and the following are available:
 - 1.11.12 (Cobra Kai):
   Changelog: https://gist.GitHub.com/spinnaker-release/29a01fa17afe7c603e510e202a914161
   Published: Fri Apr 05 14:55:40 UTC 2019
   (Requires Halyard >= 1.11)
 - 1.12.9 (Unbreakable):
   Changelog: https://gist.GitHub.com/spinnaker-release/7fa9145349d6beb2f22163977a94629e
   Published: Fri Apr 05 14:11:44 UTC 2019
   (Requires Halyard >= 1.11)
 - 1.13.5 (BirdBox):
   Changelog: https://gist.GitHub.com/spinnaker-release/23af06bc73aa942c90f89b8e8c8bed3e
   Published: Mon Apr 22 14:32:29 UTC 2019
   (Requires Halyard >= 1.17)

インストールするバージョンを選択するには、次のコマンドを実行します。

hal config version edit --version 1.13.5

何らかのリグレッションが発生しない限り、常に最新バージョンを選択することをお勧めします。

次の出力が表示されます。

Output+ Get current deployment
  Success
+ Edit Spinnaker version
  Success
+ Spinnaker has been configured to update/install version "version".
  Deploy this version of Spinnaker with `hal deploy apply`.

これで、Spinnakerの展開を完全に構成できました。 次のコマンドでデプロイします:

hal deploy apply

このコマンドが完了するまでに数分かかる場合があります。

最終的な出力は次のようになります。

Output+ Get current deployment
  Success
+ Prep deployment
  Success
+ Preparation complete... deploying Spinnaker
+ Get current deployment
  Success
+ Apply deployment
  Success
+ Deploy spin-redis
  Success
+ Deploy spin-clouddriver
  Success
+ Deploy spin-front50
  Success
+ Deploy spin-orca
  Success
+ Deploy spin-deck
  Success
+ Deploy spin-echo
  Success
+ Deploy spin-gate
  Success
+ Deploy spin-rosco
  Success
...

Halyardは、Spinnakerの各マイクロサービスの展開ステータスを表示しています。 舞台裏では、kubectlを呼び出してインストールします。

Kubernetesは、すべてのコンテナを起動するのに、特に初めての場合、平均して10分かかります。 次のコマンドを実行して、進行状況を監視できます。

kubectl get pods -n spinnaker -w

SpinnakerをKubernetesクラスターにデプロイしましたが、クラスターを超えてアクセスすることはできません。

入力構成をspinnaker-ingress.yamlという名前のファイルに保存します。 テキストエディターを使用して作成します。

nano spinnaker-ingress.yaml

次の行を追加します。

spinnaker-ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: spinnaker-ingress
  namespace: spinnaker
  annotations:
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
  - hosts:
    - spinnaker-api.example.com
    - spinnaker.example.com
    secretName: spinnaker
  rules:
  - host: spinnaker-api.example.com
    http:
      paths:
      - backend:
          serviceName: spin-gate
          servicePort: 8084
  - host: spinnaker.example.com
    http:
      paths:
      - backend:
          serviceName: spin-deck
          servicePort: 9000

spinnaker-api.example.comをAPIドメインに、spinnaker.example.comをUIドメインに置き換えることを忘れないでください。

構成ファイルは、spinnaker-ingressと呼ばれる入力を定義します。 注釈は、この入力のコントローラーがNginxコントローラーになること、およびletsencrypt-prodクラスター発行者が前提条件のチュートリアルで定義されているTLS証明書を生成することを指定します。

次に、TLSがUIおよびAPIドメインを保護することを指定します。 APIドメインをspin-gateサービス(SpinnakerのAPIコンテナー)に転送し、UIドメインを適切なポート8084spin-deckサービス(SpinnakerのUIコンテナー)に転送することでルーティングを設定します。 9000

ファイルを保存して閉じます。

次を実行して、KubernetesにIngressを作成します。

kubectl create -f spinnaker-ingress.yaml

次の出力が表示されます。

Outputingress.extensions/spinnaker-ingress created

Let’s EncryptがTLS証明書をプロビジョニングするまで数分待ってから、ブラウザでUIドメインspinnaker.example.comに移動します。 Spinnakerのユーザーインターフェースが表示されます。

Spinnaker’s home page

Spinnakerをクラスターに展開し、ドメインでUIおよびAPIコンポーネントを公開し、動作するかどうかをテストしました。 次に、Spinnakerでアプリケーションを作成し、パイプラインを実行してHello Worldアプリをデプロイします。

[[ステップ-4 -—-アプリケーションの作成とパイプラインの実行]] ==ステップ4—アプリケーションの作成とパイプラインの実行

このセクションでは、ドメインのSpinnakerへのアクセスを使用して、アプリケーションを作成します。 次に、パイプラインを作成して実行し、paulbouwer/hello-kubernetesにあるHello Worldアプリをデプロイします。 後でアプリにアクセスします。

SpinnakerのUIを公開したドメインに移動します。 右上隅で、Actionsを押してから、Create Applicationを選択します。 New Applicationフォームが表示されます。

Creating a new Application in Spinnaker

名前としてhello-worldを入力し、メールアドレスを入力して、Createを押します。

ページが読み込まれたら、トップメニューの最初のタブをクリックしてPipelinesに移動します。 パイプラインがまだ定義されていないことがわかります。

No pipelines defined in Spinnaker

Configure a new pipelineを押すと、新しいフォームが開きます。

Creating a new Pipeline in Spinnaker

パイプラインの名前としてDeploy Hello World Applicationを入力し、Createを押します。

次のページで、Add Stageボタンをクリックします。 Typeとして、指定したKubernetesマニフェストのデプロイに使用されるDeploy (Manifest)を選択します。 Stage Nameには、Deploy Hello Worldと入力します。 下にスクロールし、Manifest Configurationの下のテキストボックスに次の行を入力します。

マニフェストの構成

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hello-world-ingress
  namespace: spinnaker
  annotations:
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
  - hosts:
    - hello-world.example.com
    secretName: hello-world
  rules:
  - host: hello-world.example.com
    http:
      paths:
      - backend:
          serviceName: hello-kubernetes
          servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: hello-kubernetes
  namespace: spinnaker
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: hello-kubernetes
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-kubernetes
  namespace: spinnaker
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-kubernetes
  template:
    metadata:
      labels:
        app: hello-kubernetes
    spec:
      containers:
      - name: hello-kubernetes
        image: paulbouwer/hello-kubernetes:1.5
        ports:
        - containerPort: 8080

hello-world.example.comをドメインに置き換えることを忘れないでください。ドメインもロードバランサーを指しています。

この構成では、paulbouwer/hello-kubernetes:1.5イメージの3つのレプリカで構成されるDeploymentを定義します。 また、アクセスできるようにServiceを定義し、ドメインでServiceを公開するためにIngressを定義します。

画面の右下隅にあるSave Changesを押します。 終了したら、Pipelinesに戻ります。 右側で、作成したパイプラインを選択し、Start Manual Executionリンクを押します。 確認を求められたら、Runを押します。

このパイプラインは完了するまでに少し時間がかかります。 正常に終了すると、進行状況バーが完了します。

Successfully ran a Pipeline

これで、構成で定義したドメインに移動できます。 SpinnakerがデプロイしたばかりのHello Worldアプリが表示されます。

Hello World App

Spinnakerでアプリケーションを作成し、パイプラインを実行してHello Worldアプリをデプロイし、それにアクセスしました。 次のステップでは、GitHub Organizations認証を有効にしてSpinnakerを保護します。

[[step-5 -—- enableing-role-based-access-with-github-organizations]] ==ステップ5—GitHub組織での役割ベースのアクセスの有効化

このセクションでは、GitHub OAuth認証とGitHub Organizations認証を有効にします。 GitHub OAuth認証を有効にすると、SpinnakerユーザーはGitHub経由でログインするように強制されるため、匿名アクセスが防止されます。 GitHub Organizationsを介した承認は、組織内のユーザーのみにアクセスを制限します。 GitHub組織にはTeams(メンバーの名前付きグループ)を含めることができます。これを使用して、Spinnakerのリソースへのアクセスをさらに制限できます。

OAuth認証を機能させるには、最初に承認コールバックURLを設定する必要があります。これは、承認後にユーザーがリダイレクトされる場所です。 これは、/loginで終わるAPIドメインです。 Spinnakerや他のサービスが推測するのを防ぐために、これを手動で指定する必要があります。 これを構成するには、次のコマンドを実行します。

hal config security authn oauth2 edit --pre-established-redirect-uri https://spinnaker-api.example.com/login

次の出力が表示されます。

Output+ Get current deployment
  Success
+ Get authentication settings
  Success
+ Edit oauth2 authentication settings
  Success
+ Successfully edited oauth2 method.

GitHubでOAuth認証を設定するには、組織のOAuthアプリケーションを作成する必要があります。 これを行うには、GitHubで組織に移動し、Settingsに移動し、Developer Settingsをクリックして、左側のメニューからOAuth Appsを選択します。 その後、右側のNew OAuth Appボタンをクリックします。 Register a new OAuth applicationフォームが表示されます。

Creating a new OAuth App on GitHub

名前としてspinnaker-authを入力します。 Homepage URLにはhttps://spinnaker.example.comと入力し、Authorization callback URLにはhttps://spinnaker-api.example.com/loginと入力します。 次に、Register Applicationを押します。

新しいOAuthアプリの設定ページにリダイレクトされます。 Client IDClient Secretの値に注意してください。次のコマンドで必要になります。

OAuthアプリを作成したら、次のコマンドを実行して、OAuthアプリを使用するようSpinnakerを構成できます。

hal config security authn oauth2 edit --client-id client_id --client-secret client_secret --provider GitHub

client_idclient_secretをGitHub設定ページに表示されている値に置き換えることを忘れないでください。

出力は次のようになります。

Output+ Get current deployment
  Success
+ Get authentication settings
  Success
+ Edit oauth2 authentication settings
  Success
Problems in default.security.authn:
- WARNING An authentication method is fully or partially
  configured, but not enabled. It must be enabled to take effect.

+ Successfully edited oauth2 method.

OAuthアプリを使用するようにSpinnakerを構成しました。 今、それを有効にするには、次を実行します:

hal config security authn oauth2 enable

出力は以下のようになります。

Output+ Get current deployment
  Success
+ Edit oauth2 authentication settings
  Success
+ Successfully enabled oauth2

GitHub OAuth認証を構成して有効にしました。 これで、ユーザーはSpinnakerにアクセスするためにGitHub経由でのログインを強制されます。 ただし、現時点では、GitHubアカウントを持っているすべてのユーザーがログインできますが、これは望みのものではありません。 これを克服するには、目的の組織のメンバーへのアクセスを制限するようにSpinnakerを構成します。

Halyardにはこれを設定するコマンドがまだないため、ローカルの設定ファイルを使用してこれを半手動で設定する必要があります。 デプロイ中、Halyardはローカル構成ファイルを使用して、生成された構成をオーバーライドします。

Halyardは、~/.hal/default/profiles/の下でカスタム構成を探します。 service-name-*.ymlという名前のファイルは、Halyardによって取得され、特定のサービスの設定を上書きするために使用されます。 オーバーライドするサービスはgateと呼ばれ、Spinnaker全体のAPIゲートウェイとして機能します。

gate-local.ymlという名前の~/.hal/default/profiles/の下にファイルを作成します。

nano ~/.hal/default/profiles/gate-local.yml

次の行を追加します。

gate-local.yml

security:
 oauth2:
   providerRequirements:
     type: GitHub
     organization: your_organization_name

your_organization_nameをGitHub組織の名前に置き換えます。 ファイルを保存して閉じます。

この少しの構成では、GitHub組織のメンバーのみがSpinnakerにアクセスできます。

[.note]#Note:メンバーシップがPublicに設定されているGitHub組織のメンバーのみが、Spinnakerにログインできます。 この設定は、組織のメンバーリストページで変更できます。

次に、Spinnakerをさらに特定のアクセスルールソリューションであるGitHub Teamsと統合します。 これにより、アプリケーションなど、Spinnakerで作成されたリソースにアクセスするチームを指定できます。

これを実現するには、組織の管理者アカウント用のGitHubパーソナルアクセストークンが必要です。 作成するには、Personal Access Tokensにアクセスし、Generate New Tokenボタンを押します。 次のページで、選択した内容を説明し、admin:orgの下にあるread:orgスコープを必ず確認してください。 完了したら、Generate tokenを押して、表示されたらメモします。再び表示することはできません。

SpinnakerでGitHub Teamsの役割の承認を構成するには、次のコマンドを実行します。

hal config security authz github edit --accessToken access_token --organization organization_name --baseUrl https://api.github.com

必ずaccess_tokenを生成した個人用アクセストークンに置き換え、organization_nameを組織の名前に置き換えてください。

出力は次のようになります。

Output+ Get current deployment
  Success
+ Get GitHub group membership settings
  Success
+ Edit GitHub group membership settings
  Success
+ Successfully edited GitHub method.

GitHubグループの設定を更新しました。 次のコマンドを実行して、認証プロバイダーをGitHubに設定します。

hal config security authz edit --type github

出力は以下のようになります。

Output+ Get current deployment
  Success
+ Get group membership settings
  Success
+ Edit group membership settings
  Success
+ Successfully updated roles.

これらの設定を更新したら、次を実行して有効にします。

hal config security authz enable

次の出力が表示されます。

Output+ Get current deployment
  Success
+ Edit authorization settings
  Success
+ Successfully enabled authorization

すべての変更が完了したら、実行中のSpinnakerデプロイメントに変更を適用できます。 これを行うには、次のコマンドを実行します。

hal deploy apply

終了したら、Kubernetesが変更を伝播するのを待ちます。 これにはかなり時間がかかる場合があります。次のコマンドを実行して、進行状況を確認できます。

kubectl get pods -n spinnaker -w

すべてのポッドの状態がRunningおよび可用性1/1になったら、SpinnakerUIドメインに移動します。 GitHubにリダイレクトされ、まだログインしていない場合はログインするよう求められます。 ログインしたアカウントが組織のメンバーである場合、Spinnakerにリダイレクトされてログインし直します。 そうしないと、次のようなメッセージでアクセスが拒否されます。

{"error":"Unauthorized", "message":"Authentication Failed: User's provider info does not have all required fields.", "status":401, "timestamp":...}

GitHub Teams統合の効果は、Spinnakerがそれらをrolesに変換することです。 Spinnakerでこれらのrolesを使用して、特定のチームのメンバーのアクセスに対する追加の制限を組み込むことができます。 別のアプリケーションを追加しようとすると、そのアプリケーションのアクセスレベル(読み取り専用または読み取りと書き込み)とロールを組み合わせたアクセス許可も指定できるようになります。

GitHubの認証と承認を設定しました。 また、組織のメンバーへのアクセスを制限するようにSpinnakerを構成し、役割と権限について学習し、Spinnakerと統合する際のGitHubチームの場所を検討しました。

結論

SpinnakerをDigitalOcean Kubernetesクラスターに正常に構成およびデプロイしました。 クラウドリソースを中央の場所からより簡単に管理および使用できるようになりました。 トリガーを使用して、パイプラインを自動的に開始できます。たとえば、新しいDockerイメージがレジストリに追加されたとき。 Spinnakerの用語とアーキテクチャの詳細については、official documentationにアクセスしてください。 イメージを保持するためにプライベートDockerレジストリをクラスターにデプロイする場合は、How To Set Up a Private Docker Registry on Top of DigitalOcean Spaces and Use It with DO Kubernetesにアクセスします。

Related