演習 - AKS にデプロイする GitHub アクションを作成する
この演習では、次のタスクを完了します。
- デプロイ ジョブを含むように既存の GitHub アクションを強化する。
- 変更が Azure Kubernetes Service (AKS) クラスターにデプロイされていることを確認する。
- デプロイをロールバックする。
Kubernetes マニフェストを更新する
eShop 製品サービスの新しいバージョンをデプロイするために、product.yml ファイルを編集して、前のユニットで使用した Azure Container Registry (ACR) を指すようにします。
フォークされたリポジトリで、code tab を選び、次に product.yml ファイルを選びます。
ファイルを編集するために、編集アイコン (鉛筆) を選びます。
次の行を編集します。
containers: - image: [replace with your ACR name].azurecr.io/productservice:latest
[replace with your ACR name]
を ACR の名前 (例: acseshop186748394) に置き換えます。右上の [変更のコミット...] を選択し、ダイアログで、[変更のコミット] を選択します。
デプロイ アクションを作成する
YAML コードで、次の GitHub ステップを追加します。
新しいイメージをデプロイする 1 つのステップがあります。 ubuntu-latest
ランナーの手順を次に示します。
- このファイルが含まれているリポジトリをチェックアウトします。
- Azure Login で、サービス プリンシパルの資格情報を使用した Azure へのサインインを実行します。
- Set up kubelogin for non-interactive login で、kubeconfig ファイルを Azure 認証用に構成します。
- Get K8s context で、ランナーの .kube/config ファイルに Azure Kubernetes Service (AKS) 資格情報を設定するコンテキストを設定します。
- Deploys application で、前の手順でビルドしたイメージと先ほど編集した 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
ブラウザーで [製品] ページを更新すると、新しいテナントは表示されなくなります。
Note
実際のシナリオでは、ビルドの成果物を複数の環境にデプロイします。 たとえば、開発、テスト、ステージングなどの各環境を使用できます。 PR のマージなどのイベントによってデプロイ ワークフローをトリガーできます。 関係者による PR 承認など、品質または承認に関するゲートを追加して、運用環境への予期しないデプロイを防ぐことができます。