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

完了

この演習では、次のタスクを完了します。

  • デプロイ ジョブを含むように既存の GitHub アクションを強化する。
  • 変更が Azure Kubernetes Service (AKS) クラスターにデプロイされていることを確認する。
  • デプロイをロールバックする。

Kubernetes マニフェストを更新する

eShop 製品サービスの新しいバージョンをデプロイするために、product.yml ファイルを編集して、前のユニットで使用した Azure Container Registry (ACR) を指すようにします。

  1. フォークされたリポジトリで、code tab を選び、次に product.yml ファイルを選びます。

  2. ファイルを編集するために、編集アイコン (鉛筆) を選びます。

  3. 次の行を編集します。

    containers:
      - image: [replace with your ACR name].azurecr.io/productservice:latest
    

    [replace with your ACR name] を ACR の名前 (例: acseshop186748394) に置き換えます。

  4. 右上の [変更のコミット...] を選択し、ダイアログで、[変更のコミット] を選択します。

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

YAML コードで、次の GitHub ステップを追加します。

新しいイメージをデプロイする 1 つのステップがあります。 ubuntu-latest ランナーの手順を次に示します。

  1. このファイルが含まれているリポジトリをチェックアウトします。
  2. Azure Login で、サービス プリンシパルの資格情報を使用した Azure へのサインインを実行します。
  3. Set up kubelogin for non-interactive login で、kubeconfig ファイルを Azure 認証用に構成します。
  4. Get K8s context で、ランナーの .kube/config ファイルに Azure Kubernetes Service (AKS) 資格情報を設定するコンテキストを設定します。
  5. Deploys application で、前の手順でビルドしたイメージと先ほど編集した Kubernetes マニフェスト ファイルを使用して、アプリケーションを AKS にデプロイします。

クーポン サービスをデプロイする GitHub アクションを作成するには、次の手順を行います。

  1. フォークされたリポジトリの [code tab] で、[.github/workflows] タブを選択します。

  2. [azure-kubernetes-service.yml] を選択します。

  3. ファイルを編集するために、編集アイコン (鉛筆) を選びます。

  4. ファイルの下部にある次の YAML コードをエディターに貼り付けます。

    
      deploy:
        permissions:
          actions: read
          contents: read
          id-token: write
        runs-on: ubuntu-latest
        needs: [buildImage]
        steps:
          # Checks out the repository this file is in
          - uses: actions/checkout@v3
    
          # Logs in with your Azure credentials
          - name: Azure login
            uses: azure/login@v1.4.6
            with:
              creds: '${{ secrets.AZURE_CREDENTIALS }}'
    
          # Use kubelogin to configure your kubeconfig for Azure auth
          - name: Set up kubelogin for non-interactive login
            uses: azure/use-kubelogin@v1
            with:
              kubelogin-version: 'v0.0.25'
    
          # Retrieves your Azure Kubernetes Service cluster's kubeconfig file
          - name: Get K8s context
            uses: azure/aks-set-context@v3
            with:
              resource-group: ${{ env.RESOURCE_GROUP }}
              cluster-name: ${{ env.CLUSTER_NAME }}
              admin: 'false'
              use-kubelogin: 'true'
    
          # Deploys application based on given manifest file
          - name: Deploys application
            uses: Azure/k8s-deploy@v4
            with:
              action: deploy
              manifests: ${{ env.DEPLOYMENT_MANIFEST_PATH }}
              images: |
                ${{ env.AZURE_CONTAINER_REGISTRY }}.azurecr.io/${{ env.CONTAINER_NAME }}:${{ github.sha }}
              pull-images: false
    
    
  5. 右上の [変更のコミット...] を選び、次にダイアログで、[変更のコミット] を選びます。

デプロイをトリガーする

azure-kubernetes-service.yml ファイルを更新して変更をコミットすると、別のデプロイが自動的にトリガーされます。 次は、コード変更を行うと、別のデプロイがトリガーされることを確認します。

マーケティング チームがカタログに追加したい新しい製品があります。

  1. フォークされたリポジトリの [code tab] で、[Products] フォルダーを選択します。

  2. Data フォルダーを選択します。

  3. ProductDataContext.c ファイルを選択します。

  4. ファイルを編集するために、編集アイコン (鉛筆) を選びます。

  5. ファイルの下部にある products 配列に新しい製品を追加します。

    new Product {  Name = "Camping Tent 2", Description = "This updated tent is improved and cheaper, perfect for your next trip.", Price = 79.99m, ImageUrl = "product9.png" },
    
  6. 右上の [変更のコミット...] を選択し、ダイアログで、[変更のコミット] を選択します。

展開を監視する

  1. デプロイの進行状況を監視するには、[Actions] タブを選択します。

  2. Build and deploy an app to AKS ワークフローに対して一覧表示されている最新のワークフロー実行を選択します。 実行の名前は、前の手順で使用したコミット メッセージです。

  3. [deploy] ジョブを選択して、このワークフロー実行の詳細を確認します。

    Screenshot that shows the deploy job selected with a list of all the steps.

  4. ターミナルで、次のコマンドを実行して、AKS クラスター内のクーポン サービス ポッドを監視します。 --selector フラグではクーポン サービスのポッドのみになるようにリストをフィルター処理し、--watch フラグでは変更をウォッチするように kubectl に指示します。

    kubectl get pods --selector=app=productservice --watch
    

    デプロイ中に、次のような出力が表示されます。

    NAME                             READY   STATUS    RESTARTS   AGE
    productservice-7979d4c47-xlcrr   1/1     Running   0          17m
    productservice-ff98b6d8d-7wmsh   0/1     Pending   0          0s
    productservice-ff98b6d8d-7wmsh   0/1     Pending   0          0s
    productservice-ff98b6d8d-7wmsh   0/1     ContainerCreating   0          0s
    productservice-ff98b6d8d-7wmsh   1/1     Running             0          4s
    productservice-7979d4c47-xlcrr   1/1     Terminating         0          19m
    

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

アプリを確認する

アプリが引き続き動作することを確認するには、次の手順を行います。

  • ターミナルで次のコマンドを実行して、デプロイされた eShop を表示します。

    echo "http://$(kubectl get services --namespace ingress-nginx ingress-nginx-controller --output jsonpath='{.status.loadBalancer.ingress[0].ip}')"
    

    上記のコマンドでは、Web アプリの外部 IP アドレスが返されます。 Ctrl キーを押しながらリンクを選択して、新しいタブでアプリを開きます。

[製品] ページに移動して、ページの下部に一覧表示されている新しいテナントを表示します。

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

運用上の問題の一般的な軽減策の 1 つは、既知の正常なデプロイに戻すことです。 Kubernetes にはデプロイ履歴が保持されており、それを使用して、アプリの以前のバージョンにロールバックすることができます。

ターミナルで、次のコマンドを実行して、Web サイトに追加したばかりの新しいテナントを削除します。

kubectl rollout undo deployment/productservice

次のコンソール メッセージが表示されます。

deployment.apps/productservice rolled back

ブラウザーで [製品] ページを更新すると、新しいテナントは表示されなくなります。

Note

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

自分の知識をチェックする

1.

GitHub Actions の資格情報などの機密情報を格納するのに最適な場所は何ですか?

2.

GitHub Actions で使用するために Azure Active Directory サービス プリンシパルを作成する目的は何ですか?

3.

アップグレードのデプロイ中に、古いコンテナーがまだ実行されている間に AKS によって新しいものが作成されるのはなぜですか?