演習 - AKS にデプロイする GitHub アクションを作成する
- 10 分
この演習では、次のタスクを行います。
- デプロイ ジョブを含むように既存の GitHub アクションを強化します。
- 変更が Azure Kubernetes Service (AKS) クラスターにデプロイされていることを確認します。
- デプロイをロールバックする。
製品サービスの Kubernetes マニフェストを更新する
eShop 製品サービスの新しいバージョンをデプロイするには、前のユニットで使用した Azure Container Registry (ACR) をポイントするように product.yml ファイルを編集します。
フォークしたリポジトリで、 code tabを選択し、 product.yml ファイルを選択します。
ファイルを編集するには、編集アイコン (鉛筆) を選択します。
次の行を編集します。
containers: - image: [replace with your ACR name].azurecr.io/productservice:latest
[replace with your ACR name]
を、acseshop186748394 などの ACR の名前に置き換えます。右上の [ 変更のコミット...] を選択し、ダイアログで [ 変更のコミット] を選択します。
デプロイ アクションを作成する
YAML コードは、新しいイメージをデプロイする 1 つのステップを含む GitHub ステップを追加します。 次のステップはubuntu-latest
ランナーにおいて以下の通りです。
- このファイルが含まれているリポジトリをチェックアウトします。
- Azure Login は 、サービス プリンシパルの資格情報を使用して Azure にサインインします。
- 非対話型ログイン用に kubelogin を設定 すると、Azure 認証用に kubeconfig ファイルが構成されます。
- K8s コンテキストを取得し、そのコンテキストを設定すると、ランナーの .kube/config ファイル内で Azure Kubernetes Service (AKS) の資格情報が設定されます。
- 前の 手順でビルドしたイメージと、前に編集した Kubernetes マニフェスト ファイルを使用して、アプリケーションを AKS にデプロイします。
クーポン サービスをデプロイする GitHub アクションを作成するには、次の手順を実行します。
フォークしたリポジトリの code tabで、[ .github/workflows ] タブを選択します。
[azure-kubernetes-service.yml] を選択します。
ファイルを編集するには、編集アイコン (鉛筆) を選択します。
ファイルの下部に、次の 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
右上の [ 変更のコミット...] を選択し、ダイアログで [ 変更のコミット] を選択します。
デプロイをトリガーする
azure-kubernetes-service.yml ファイルを更新し、変更をコミットすると、別のデプロイが自動的にトリガーされます。 次に、コード変更を行って別のデプロイをトリガーする方法を確認します。
マーケティング チームがカタログに追加する新しい製品がある。
フォークしたリポジトリの code tabで、 Products フォルダーを選択します。
Data フォルダーを選択します。
ProductDataContext.c ファイルを選択します。
ファイルを編集するには、編集アイコン (鉛筆) を選択します。
ファイルの下部にある 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" },
右上の [ 変更のコミット...] を選択し、ダイアログで [ 変更のコミット] を選択します。
デプロイを監視する
デプロイの進行状況を監視するには、[ Actions ] タブを選択します。
Build and deploy an app to AKS ワークフローの一覧にある最新のワークフロー実行を選択します。 実行の名前は、前の手順で使用したコミット メッセージです。
deploy ジョブを選択すると、このワークフロー実行の詳細が表示されます。
ターミナルで次のコマンドを実行して、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
ブラウザーの [製品] ページを更新すると、新しいテントが一覧に表示されなくなります。
注
実際のシナリオでは、ビルドの成果物を複数の環境にデプロイします。 たとえば、開発、テスト、ステージングの環境があるとします。 PR のマージなどのイベントによって、デプロイ ワークフローをトリガーできます。 品質ゲートや承認ゲート (利害関係者の PR 承認など) を追加して、運用環境への予期しない展開を防ぐことができます。