Spinnaker と Kubernetes Engine を使用した継続的デリバリー パイプライン

このチュートリアルでは、Kubernetes Engine、Cloud Source Repositories、Cloud Build、Resource Manager、Spinnaker を使用して継続的デリバリー パイプラインを作成する方法を説明します。サンプル アプリケーションを作成した後、これらのサービスを自動的にビルド、テスト、デプロイするように構成します。アプリケーション コードを変更すると、継続的デリバリー パイプラインがトリガーされ、新しいバージョンが自動的に再ビルド、再テスト、再デプロイされます。

パイプライン アーキテクチャ

パイプライン アーキテクチャ

アプリケーション更新を継続的にユーザーに配布するには、ソフトウェアを確実にビルド、テスト、更新する自動プロセスが必要です。コード変更は、アーティファクトの作成、単体テスト、機能テスト、本番環境ロールアウトで構成されたパイプラインを自動的に通過する必要があります。場合によっては、コード更新をユーザーベース全体に配布する前にユーザーのサブセットにのみ適用し、実際の動作を確認したいケースもあるでしょう。これらのカナリアテストのいずれかで不十分なことが判明した場合は、ソフトウェア変更を自動的な手順ですばやくロールバックできる必要があります。

Kubernetes Engine と Spinnaker を使用すると、堅牢な継続的デリバリー フローを作成できます。これにより、ソフトウェアを開発して検証したらすぐに出荷できるようになります。迅速な繰り返しが最終目標ですが、各アプリケーション リビジョンが本番環境ロールアウトの候補になる前に、必ず一連の自動検証を通過する必要があります。特定の変更を自動化によって検査してから、アプリケーションを手動で検証し、さらにプレリリース テストを実施することもできます。

アプリケーションが本番環境用として準備が整ったとチームが判断したら、チームメンバーの 1 人が本番環境デプロイメント用として承認できます。

アプリケーション デリバリー パイプライン

このチュートリアルでは、次の図に示す継続的デリバリー パイプラインを構築します。

アプリケーション デリバリー パイプライン

目標

  • Cloud Shell を起動して、Kubernetes Engine クラスタを作成し、ID とユーザー管理スキームを構成することによって、環境をセットアップします。
  • サンプル アプリケーションをダウンロードして、Git リポジトリを作成してから、Cloud Source Repositories のリポジトリにアップロードします。
  • Helm を使用して Spinnaker を Kubernetes Engine にデプロイします。
  • Docker イメージをビルドします。
  • アプリケーションが変更されたときに Docker イメージを作成するためのトリガーを作成します。
  • アプリケーションを Kubernetes Engine に確実かつ継続的にデプロイするように Spinnaker パイプラインを設定します。
  • コード変更をデプロイし、パイプラインをトリガーし、本番環境へのロールアウトを監視します。

料金

このチュートリアルでは、以下を含む Google Cloud Platform(GCP)の課金対象コンポーネントを使用します。

  • Kubernetes Engine
  • Cloud Load Balancing
  • Cloud Build
  • Resource Manager

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。

GCP を初めてご利用の場合には、無料トライアルをご利用いただけます。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP プロジェクトを選択または作成します。

    [リソースの管理] ページに移動

  3. プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

  4. Kubernetes Engine、Cloud Build、Resource Manager API を有効にします。

    APIを有効にする

環境の設定

このセクションでは、チュートリアルを実行するために必要なインフラストラクチャと ID を構成します。

Cloud Shell インスタンスを開始して、Kubernetes Engine クラスタを作成する

このチュートリアルでは、Cloud Shell からすべての端末コマンドを実行します。

  1. Cloud Shell を開きます。

    Cloud Shell を開く

  2. 次のコマンドを使用して、Spinnaker とサンプル アプリケーションをデプロイするための Kubernetes Engine クラスタを作成します。

    gcloud config set compute/zone us-central1-f
    
    gcloud container clusters create spinnaker-tutorial \
        --machine-type=n1-standard-2
    

Identity and Access Management の構成

Cloud Identity Access Management(Cloud IAM)サービス アカウントを作成して Spinnaker に権限を委任し、Cloud Storage にデータを保存できるようにします。Spinnaker は、パイプライン データを Cloud Storage に保存することで、信頼性と復元力を確保します。Spinnaker のデプロイメントが予期せず失敗した場合は、オリジナルと同じパイプライン データへのアクセス権を持つ同じデプロイメントを数分で作成できます。

  1. サービス アカウントを作成します。

    gcloud iam service-accounts create  spinnaker-storage-account \
        --display-name spinnaker-storage-account
    

  2. 後のコマンドで使用するために、サービス アカウントのメールアドレスと現在のプロジェクト ID を環境変数に格納します。

    export SA_EMAIL=$(gcloud iam service-accounts list \
        --filter="displayName:spinnaker-storage-account" \
        --format='value(email)')
    export PROJECT=$(gcloud info --format='value(config.project)')
    

  3. storage.admin 役割をサービス アカウントにバインドします。

    gcloud projects add-iam-policy-binding \
        $PROJECT --role roles/storage.admin --member serviceAccount:$SA_EMAIL
    

  4. サービス アカウントキーをダウンロードします。このキーは、後で Spinnaker をインストールしてこのキーを Kubernetes Engine にアップロードするときに必要になります。

    gcloud iam service-accounts keys create spinnaker-sa.json --iam-account $SA_EMAIL
    

Helm を使用した Spinnaker のデプロイ

このセクションでは、Helm を使用して Charts リポジトリから Spinnaker をデプロイします。Helm は、Kubernetes アプリケーションの構成とデプロイに使用可能なパッケージ マネージャです。

Helm をインストールする

  1. helm バイナリをダウンロードしてインストールします。

    wget https://storage.googleapis.com/kubernetes-helm/helm-v2.7.2-linux-amd64.tar.gz
    

  2. ファイルをローカル システムに解凍します。

    tar zxfv helm-v2.7.2-linux-amd64.tar.gz
    
    cp linux-amd64/helm .
    

  3. Helm のサーバー側である Tiller に、クラスタの cluster-admin 役割を付与します。

    kubectl create clusterrolebinding user-admin-binding --clusterrole=cluster-admin --user=$(gcloud config get-value account)
    kubectl create serviceaccount tiller --namespace kube-system
    kubectl create clusterrolebinding tiller-admin-binding --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
    

  4. Spinnaker に cluster-admin 役割を付与し、すべての名前空間にリソースをデプロイできるようにします。

    kubectl create clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:default spinnaker-admin
    

  5. Helm を初期化して、クラスタに Tiller をインストールします。

    ./helm init --service-account=tiller
    ./helm update

  6. 次のコマンドを実行して、Helm が正しくインストールされていることを確認します。Helm が正しくインストールされている場合は、クライアントとサーバーの両方に v2.7.2 が表示されます。

    ./helm version

    Client: &version.Version{SemVer:"v2.7.2",
    GitCommit:"8478fb4fc723885b155c924d1c8c410b7a9444e6",
    GitTreeState:"clean"}Server: &version.Version{SemVer:"v2.7.2",
    GitCommit:"8478fb4fc723885b155c924d1c8c410b7a9444e6",
    GitTreeState:"clean"}
    

Spinnaker を設定する

  1. Spinnaker でパイプライン構成を保存するためのバケットを作成します。

    export PROJECT=$(gcloud info \
        --format='value(config.project)')
    export BUCKET=$PROJECT-spinnaker-config
    gsutil mb -c regional -l us-central1 gs://$BUCKET

  2. 構成ファイルを作成します。

    export SA_JSON=$(cat spinnaker-sa.json)
    export PROJECT=$(gcloud info --format='value(config.project)')
    export BUCKET=$PROJECT-spinnaker-config
    cat > spinnaker-config.yaml <<EOF
    storageBucket: $BUCKET
    gcs:
      enabled: true
      project: $PROJECT
      jsonKey: '$SA_JSON'

    # Disable minio as the default minio: enabled: false

    # Configure your Docker registries here accounts: - name: gcr address: https://gcr.io username: _json_key password: '$SA_JSON' email: 1234@5678.com EOF

Spinnaker チャートをデプロイする

  1. Helm コマンドライン インターフェースを使用して、設定セットとともにチャートをデプロイします。このコマンドは完了するまでに 5 〜 10 分程度かかります。

    ./helm install -n cd stable/spinnaker -f spinnaker-config.yaml --timeout 600 \
        --version 0.3.1

  2. コマンドが完了したら、次のコマンドを実行して、Cloud Shell から Spinnaker UI へのポート転送をセットアップします。

    export DECK_POD=$(kubectl get pods --namespace default -l "component=deck" \
        -o jsonpath="{.items[0].metadata.name}")
    kubectl port-forward --namespace default $DECK_POD 8080:9000 >> /dev/null &
    

  3. Spinnaker ユーザー インターフェースを開くには、Cloud Shell で [ウェブでプレビュー] をクリックし、[ポート 8080 でプレビュー] をクリックします。

    port8080

  4. ようこそ画面が表示されてから、Spinnaker UI が表示されるはずです。

    hello

    spinui

Docker イメージのビルド

このセクションでは、アプリケーション ソースコードの変更を検出して Docker イメージをビルドしてから、Container Registry に push するように Cloud Build を構成します。

ソースコード リポジトリを作成する

  1. ソースコードをダウンロードします。

    wget https://gke-spinnaker.storage.googleapis.com/sample-app.tgz
    

  2. ソースコードを解凍します。

    tar xzfv sample-app.tgz
    

  3. ディレクトリをソースコードに変更します。

    cd sample-app
    

  4. このリポジトリの Git commit にユーザー名とメールアドレスを設定します。[EMAIL_ADDRESS] を Git メールアドレスに置き換え、[USERNAME] を Git ユーザー名に置き換えます。

    git config --global user.email "[EMAIL_ADDRESS]"
    git config --global user.name "[USERNAME]"
    

  5. ソースコード リポジトリへの最初の commit を行います。

    git init
    git add .
    git commit -m "Initial commit"
    

  6. コードをホストするリポジトリを作成します。

    gcloud source repos create sample-app
    git config credential.helper gcloud.sh
    

  7. 新しく作成したリポジトリをリモートとして追加します。

    export PROJECT=$(gcloud info --format='value(config.project)')
    git remote add origin https://source.developers.google.com/p/$PROJECT/r/sample-app
    

  8. コードを新しいリポジトリのマスター ブランチに push します。

    git push origin master

  9. コンソールにソースコードが表示されることを確認します。

    [ソースコード] ページに移動

ビルドトリガーを構成する

このセクションでは、Git タグがソース リポジトリに push されるたびに Docker イメージをビルドして push するように Cloud Build を構成します。Cloud Build はソースコードを自動的にチェックアウトして、リポジトリ内の Dockerfile から Docker イメージをビルドし、そのイメージを Container Registry に push します。

Spinnaker のワークフロー

  1. GCP Console の [Container Registry] セクションで [ビルドトリガー] をクリックします。

    ビルドトリガー ページに移動

  2. [Cloud Source Repository] を選択し、[続行] をクリックします。

  3. リストから新しく作成した sample-app リポジトリを選択し、[続行] をクリックします。
  4. 次のトリガー設定を指定します。

    • 名前: sample-app-tags
    • トリガーの種類: タグ
    • タグ(正規表現): v.*
    • ビルド設定: cloudbuild.yaml
    • cloudbuild.yaml の場所: /cloudbuild.yaml

  5. [トリガーを作成] をクリックします。

    トリガーを作成する

これ以降、文字 "v" が先頭に付いている Git タグをソースコード リポジトリに push すると、Cloud Build が自動的にアプリケーションをビルドして、Docker イメージとして Container Registry に push します。

イメージをビルドする

次の手順で最初のイメージを push します。

  1. Cloud Shell でソースコード フォルダに移動します。
  2. Git タグを作成します。

    git tag v1.0.0

  3. タグを push します。

    git push --tags

  4. [Container Registry] で、[ビルド履歴] をクリックして、ビルドがトリガーされたことを確認します。トリガーされていない場合は、前のセクションでトリガーが正しく設定されていることを確認します。

    ビルド履歴に移動

    ビルド履歴

デプロイメント パイプラインの設定

これでイメージが自動的にビルドされるようになりました。それらは Kubernetes クラスタにデプロイする必要があります。

統合テストのためにスケールダウンされた環境にデプロイします。統合テストに合格したら、コードを本番環境サービスにデプロイするための変更を手動で承認する必要があります。

デプロイメント パイプラインを構成する

アプリケーションの作成

  1. Spinnaker UI で、[アクション] をクリックしてから、[アプリケーションを作成] をクリックします。

    アプリケーションの作成

  2. [新しいアプリケーション] ダイアログで、次のフィールドを入力します。

    • 名前: sample
    • オーナーのメールアドレス: [あなたのメールアドレス]

  3. [作成] をクリックします。

    アプリケーションを作成する

サービス ロードバランサを作成する

UI で手動で情報を入力する必要がないようにするには、Kubernetes コマンドライン インターフェースを使用してサービス用のロードバランサを作成します。または、Spinnaker UI でこのオペレーションを実行することもできます。

Cloud Shell で、sample-app ルート ディレクトリから次のコマンドを実行します。

kubectl apply -f k8s/services

デプロイメント パイプラインを作成する

次に、継続的デリバリー パイプラインを作成します。このチュートリアルでは、"v" という接頭辞が付いた Docker イメージが Container Registry に到着したことを検出するようにパイプラインが構成されます。

  1. Cloud Shell の新しいタブで、ソースコード ディレクトリで次のコマンドを実行し、パイプラインの例を Spinnaker インスタンスにアップロードします。

    export PROJECT=$(gcloud info --format='value(config.project)')
    sed s/PROJECT/$PROJECT/g spinnaker/pipeline-deploy.json | curl -d@- -X \
        POST --header "Content-Type: application/json" --header \
        "Accept: /" http://localhost:8080/gate/pipelines
    

  2. Spinnaker UI で、上部ナビゲーション バーの [パイプライン] をクリックします。

    Spinnaker パイプライン

  3. Deploy パイプラインで [構成] をクリックします。

    パイプラインの構成

    継続的デリバリー パイプラインの設定が UI に表示されます。

    継続的デリバリー パイプライン

パイプラインを手動で実行する

作成したばかりの設定には、接頭辞の "v" が付いた新しい Git タグが push されたときにパイプラインを開始するトリガーが含まれています。このチュートリアルのこのセクションでは、パイプラインを手動で実行してテストします。次のセクションでは、Git タグを push し、パイプラインが自動的に実行されるのを観察することによってテストします。

  1. [パイプライン] をクリックして、パイプライン ページに戻ります。
  2. [手動実行を開始] をクリックします。

    手動開始

  3. [タグ] プルダウン リストから v1.0.0 タグを選択し、[実行] をクリックします。

    実行

  4. パイプラインが開始したら、[詳細] をクリックして、ビルドの進捗状況の詳細を表示します。このセクションでは、デプロイメント パイプラインのステータスとその手順を示します。青色のステップは現在実行中、緑色のステップは正常に完了、赤色のステップは失敗を示します。ステージをクリックすると、その詳細が表示されます。

    3 〜 5 分後に統合テストフェーズが完了し、パイプラインがデプロイメントを続行するための手動承認を要求します。

  5. 黄色の「人物」アイコンにカーソルを合わせ、[続行] をクリックします。

    本番環境に push する

    ロールアウトが本番環境フロントエンドと本番環境バックエンドのデプロイメントに進みます。これは数分後に完了します。

  6. アプリケーションを表示するには、Spinnaker UI の右上にある [ロードバランサ] をクリックします。

    ロードバランサ

  7. ロードバランサのリストをスクロール ダウンし、[sample-frontend-prod] の下で [デフォルト] をクリックします。

    デフォルトのロードバランサ

  8. 右側の詳細ウィンドウをスクロール ダウンし、Ingress IP 上のクリップボード ボタンをクリックして、アプリケーションの IP アドレスをコピーします。

    アプリの IP アドレスをコピーする

  9. アドレスをブラウザに貼り付けると、アプリケーションの本番環境バージョンが表示されます。

    バックエンド

    これで、アプリケーションをビルド、テスト、デプロイするためのパイプラインを手動でトリガーしました。

コードの変更によるパイプラインのトリガー

このセクションでは、コードの変更、Git タグの push、レスポンスでのパイプライン実行の監視を通して、パイプラインをエンドツーエンドでテストします。"v" で始まる Git タグを push すると、新しい Docker イメージをビルドして Container Registry に push するための Cloud Build がトリガーされます。Spinnaker は新しいイメージタグが "v" で始まることを検出すると、イメージをカナリアにデプロイしてテストを実行し、同じイメージをデプロイメント内のすべてのポッドにロールアウトするためのパイプラインをトリガーします。

  1. アプリケーションの色をオレンジ色から青色に変更します。

    sed -i 's/orange/blue/g' cmd/gke-info/common-service.go
    

  2. 変更にタグを付け、ソースコード リポジトリに push します。

    git commit -a -m "Change color to blue"
    git tag v1.0.1
    git push --tags
    

  3. 新しいビルドが Cloud Build のビルド履歴に表示されます。

  4. [パイプライン] をクリックして、パイプラインがイメージのデプロイを開始するのを監視します。

  5. カナリア デプロイメントを観察します。デプロイメントが一時停止され、本番環境へのロールアウトを待機している間に、アプリケーションを含むタブの更新を開始します。9 つのバックエンドがアプリケーションの以前のバージョンを実行していますが、1 つのバックエンドだけがカナリアを実行しています。10 回更新するごとにアプリケーションの新しい青色バージョンが表示されるはずです。

  6. テストが完了したら、[Spinnaker] タブに戻り、デプロイメントを承認します。

  7. パイプラインが完了すると、アプリケーションが次のスクリーンショットのようになります。コードが変更されたために色が青に変わったことと、[バージョン] フィールドに v1.0.1 と表示されていることに注意してください。

    アプリケーション バックエンド

    これで、アプリケーションを本番環境全体に正常にロールアウトできました。

  8. 必要に応じて、前回の commit を元に戻して、この変更をロールバックすることができます。ロールバックすると新しいタグ (v1.0.2) が追加され、v1.0.1 をデプロイするときに使用したのと同じパイプラインを通してタグが戻されます。

    git revert v1.0.1
    git tag v1.0.2
    git push --tags

クリーンアップ

このチュートリアルで使用するリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

  1. Spinnaker のインストールを削除します。

    ../helm delete --purge cd
    

  2. サンプル アプリケーション サービスを削除します。

    kubectl delete -f k8s/services
    

  3. サービス アカウントを削除します。

    export SA_EMAIL=$(gcloud iam service-accounts list \
        --filter="displayName:spinnaker-storage-account" --format='value(email)')
    gcloud iam service-accounts delete $SA_EMAIL
    

  4. Kubernetes Engine クラスタを削除します。

    gcloud container clusters delete spinnaker-tutorial
    

  5. リポジトリを削除します。

    gcloud source repos delete sample-app
    

  6. バケットを削除します。

    export PROJECT=$(gcloud info --format='value(config.project)')
    export BUCKET=$PROJECT-spinnaker-config
    gsutil -m rm -r gs://$BUCKET
    

  7. コンテナ イメージを削除します。

    export PROJECT=$(gcloud info --format='value(config.project)')
    gcloud container images delete gcr.io/$PROJECT/sample-app:v1.0.0
    gcloud container images delete gcr.io/$PROJECT/sample-app:v1.0.1
    

  8. 上記のオプションのロールバック ステップで v1.0.2 を作成した場合は、そのコンテナ イメージを削除します。

    gcloud container images delete gcr.io/$PROJECT/sample-app:v1.0.2
    

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...