演習 - AKS にデプロイする GitHub アクションを作成する

完了

このユニットでは、次のタスクを行います。

  • デプロイ パイプラインを実装する GitHub アクションを作成する
  • Helm チャートでクーポン サービスのバージョンをインクリメントする
  • 変更内容が AKS クラスターに展開されたことを確認する
  • デプロイをロールバックします。

デプロイ アクションを作成する

次の手順に従って、クーポン サービスをデプロイするための GitHub アクションを作成します。

  1. [Actions](アクション) タブをもう一度選択し、[New workflow](新しいワークフロー) ボタンを選択して、[set up a workflow yourself](ワークフローを自分で設定する) リンクを選択します。

  2. エディターで、YAML を次の YAML に置き換えます。

    name: eShop deploy
    
    on:
      push:
        paths:
        - 'deploy/k8s/helm-simple/coupon/*'
        branches: [ main ]
    
    jobs:
      deploy-to-aks:
        runs-on: ubuntu-latest
        steps:
        - name: Azure Kubernetes set context
          uses: Azure/aks-set-context@v1
          with:
            creds: ${{ secrets.AZURE_CREDENTIALS }}
            resource-group: 'eshop-learn-rg'
            cluster-name: 'eshop-learn-aks'
    
        - name: Get code from the repository
          uses: actions/checkout@v1
          with:
            ref: main
    
        - name: Helm tool installer
          uses: Azure/setup-helm@v1
    
        - name: Azure Login
          uses: Azure/login@v1.1
          with:
            creds: ${{ secrets.AZURE_CREDENTIALS }}
    
        - name: Deploy
          run: >
            helm upgrade 
            --install eshoplearn-coupon
            --namespace=default 
            --set registry=${{ secrets.REGISTRY_LOGIN_SERVER }} 
            --set imagePullPolicy=Always 
            --set host=${{ secrets.IP_ADDRESS }} 
            --set protocol=http './deploy/k8s/helm-simple/coupon'
    

    前の YAML によって、次のような GitHub アクションが定義されます。

    • main ブランチでクーポン サービスの Helm チャートに対してコミットがプッシュされたときにトリガーされます。
    • 新しいイメージをデプロイする、deploy-to-aks という名前の 1 つのジョブがあります。 このジョブは ubuntu-latest ランナーで実行され、5 つのステップがあります。
      1. Azure Kubernetes set context によって、ランナーの .kube/config ファイルの AKS 資格情報が設定されます。
      2. Get code from the repository によって、リポジトリからコードがチェックアウトされます。
      3. Helm tool installer によって、Kubernetes 用のオープンソース パッケージ マネージャーである Helm がインストールされます。
      4. Azure Login によって、サービス プリンシパルの資格情報を使用した Azure へのログインが実行されます。
      5. Deploy によって helm upgrade コマンドが実行され、ACR インスタンス名が registry パラメーターとして渡されます。 このパラメーターを指定すると、Helm ではパブリック コンテナー レジストリではなく指定した ACR インスタンスが使用されます。
  3. main.yml という既定のワークフロー ファイル名を deploy.yml に置き換えます。

  4. deploy.yml ワークフロー ファイルを main ブランチに直接コミットします。

これら 2 つの GitHub アクション定義は、リポジトリの .github/workflows ディレクトリに格納されます。 変更を加えるには、ローカルで適切なファイルを更新し、main ブランチにプッシュします。 または、pull request (PR) を作成します。 PR を作成する場合、main にマージするとアクションがトリガーされます。

デプロイをトリガーする

デプロイをトリガーするには、クーポン サービスの Helm チャートで appVersion をインクリメントします。 Helm チャートは、YAML テンプレート形式でサービス仕様を定義するために使用されます。

  1. [Code](コード) タブから、編集アイコンをクリックして deploy/k8s/helm-simple/coupon/Chart.yaml ファイルを編集します。 appVersion プロパティの値を 1.1.0 に更新します。

    apiVersion: v2
    name: coupon
    
    # YAML omitted for brevity
    
    # This is the version number of the application being deployed. This version number should be
    # incremented each time you make changes to the application.
    appVersion: 1.1.0
    

    Helm チャートでアプリのバージョンを更新することが重要です。 この変更により、helm upgrade によってチャートが AKS にデプロイされると、ポッドが置き換えられます。

  2. この変更内容を main ブランチにコミットしてプッシュします。

    デプロイ ワークフローは自動的にトリガーされます。 アプリは数分後にデプロイされます。

展開を監視する

  1. リポジトリの [Actions](アクション) タブを選択して、デプロイの進行状況を監視します。

  2. eShop deploy ワークフローに対して一覧表示されている最新のワークフロー実行を選択します。 前の手順で使用したコミット メッセージが実行の名前になります。

    ワークフロー ページに一覧表示された eShop deploy ワークフロー

  3. [deploy-to-aks] タスクを選択します。

    完了したビルドとデプロイを示す [アクション] タブ

    上の図では、この特定のワークフロー実行に関する deploy-to-aks ジョブの詳細を確認できます。 Set up job および Complete job ステップが表示されています。 これら 2 つのステップの間には、deploy-to-aks ジョブ内で定義されたカスタム ステップがあります。

  4. もう一度 [Actions](アクション) タブをクリックします。 デプロイが完了すると、次のような画面が表示されます。

    完了したビルドとデプロイを示す [アクション] タブ

  5. コマンド シェルに戻り、次のコマンドを実行して、AKS クラスター内のクーポン サービス ポッドを監視します。

    kubectl get pods --selector service=coupon --watch
    

    上記のコマンドでは次のことが行われます。

    • --selector フラグによって、クーポン サービスのポッドだけを対象として一覧がフィルター処理されます。 このため、クラスター内の他のサービスのポッドは表示されません。
    • --watch フラグによって、変更を監視するように kubectl に指示します。 変更が検出されると、コマンド シェルの出力に新しいテーブル行が追加されます。 既存のポッドと新しくデプロイされたポッドの状態がリアルタイムで表示されます。

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

    NAME                              READY   STATUS              RESTARTS   AGE
    coupon-5b9597995-7s4hh            1/1     Running             1          31m
    coupon-74fd48bbd-rqgfd            0/1     ContainerCreating   0          22s
    

    上記の出力では、新しい coupon ポッドが作成されていることがわかります。 古いポッドがまだ実行されていて、新しいポッドの準備が整うと、古いものが終了します。 このプロセスにより、新しいバージョンへの移行が可能な限りスムーズになります。

  6. 新しいポッドの [Ready](準備) 状態に対して 1/1 が表示されたら、Ctrl + C キーを押して kubectl のウォッチ モードを停止します。

  7. 次のコマンドを実行して、クーポン サービスのデプロイ履歴を確認します。

    helm history eshoplearn-coupon
    

    履歴には、新しいバージョンのクーポン サービスがデプロイされたことが示されています。

    REVISION        UPDATED                         STATUS          CHART           APP VERSION     DESCRIPTION
    1               Thu Sep 10 19:19:31 2020        superseded      coupon-0.1.0    1.0.0           Install complete
    2               Thu Sep 10 19:51:10 2020        deployed        coupon-0.1.0    1.1.0           Upgrade complete
    

デプロイを検証する

次の手順を実行して、変更内容がデプロイされていることを確認します。

  1. 次のコマンドをコマンド シェルで実行します。

    cat ~/clouddrive/aspnet-learn-temp/deployment-urls.txt
    
  2. [Web SPA application](Web SPA アプリケーション) の URL を選択してアプリを起動します。

  3. [LOGIN](ログイン) ページからログインします。

  4. 画像を選択して、お気に入りの商品をショッピング カートに追加します。

  5. 右上にあるショッピング カート アイコンを選択して、[CHECKOUT](精算) を選択します。

  6. 5 USD の割引が適用されるコード「DISC-5」を [HAVE A DISCOUNT CODE?](割引コードをお持ちですか?) テキスト ボックスに入力して、[APPLY](適用) を選択します。

  7. [PLACE ORDER](注文する) を選択して購入を完了します。

  8. コマンド シェルに戻り、[Centralized logging](ログの一元化) の URL を選択します。

  9. Seq ログの検索テキスト ボックスに「Applying coupon DISC-5」と入力して、Enter キーを押します。

    ログがフィルター処理されて、次のエントリが表示されます。

    Seq ログの出力の画面キャプチャ

デプロイをロールバックする

運用上の問題が発生しているとき、一般的な軽減策の 1 つは、デプロイを既知の正常なデプロイに戻すことです。 次のコマンドを使用して、バージョン 1.1.0 から 1.0.0 にロールバックします。

helm rollback eshoplearn-coupon

デプロイ履歴によって、すべてが正常に戻っていることを確認できます。

Rollback was a success! Happy Helming!

注意

実際のシナリオでは、ビルドの成果物をデプロイできる環境が複数あります。 たとえば、開発、テスト、ステージングなどの各環境を使用できます。 デプロイ ワークフローは、PR のマージなどのイベントによってトリガーできます。 関係者による PR 承認など、品質または承認に関するゲートを追加して、運用環境への予期しないデプロイを防ぐことができます。

このユニットでは、クーポン サービスを AKS にデプロイする GitHub アクションを作成しました。 デプロイ ワークフローをテストするために、その Helm チャートでクーポン サービスのバージョンをインクリメントしました。 デプロイ ワークフローの実行が完了した後、Seq ログを検索して、割引コード引き換えのメッセージが存在していることを確認しました。 最後に、AKS のクーポン サービスをバージョン 1.0.0 に戻しました。