クラウドネイティブ アプリを Azure Kubernetes Service に手動でデプロイする
Web サイトのデプロイを自動化する前に、既存の eShop アプリを Azure Kubernetes Service (AKS) に手動でデプロイする必要があります。 Azure リソースを作成し、Azure CLI コマンドと bash スクリプトを使用してアプリを AKS にデプロイします。 最後に、Azure Active Directory (Azure AD) サービス プリンシパルを作成して、GitHub Actions を AKS と Azure Container Registry にデプロイできるようにします。
このコマンドは、更新されたバージョンの eShop アプリをデプロイするための次のリソースを作成します。
- Azure Container Registry (ACR) をプロビジョニングし、レジストリにイメージをプッシュします。
- AKS クラスターをプロビジョニングし、コンテナーをクラスターにデプロイします。
- デプロイをテストします。
- サービス プリンシパルを作成して、GitHub Actions を AKS と Azure Container Registry にデプロイできるようにします。
重要
開始する前に 、前提条件 が完了していることを確認してください。
開発環境を開く
演習をホストする GitHub codespace を使うか、Visual Studio Code でローカルで演習を完了するかを選択できます。
GitHub Codespaces のセットアップ
https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops リポジトリを独自の GitHub アカウントにフォークします。 次に、新しいフォークで次の手順を実行します。
- [コード] を選択します。
- [ コードスペース ] タブを選択します。
- + アイコンを選択してコードスペースを作成します。
GitHub では、コードスペースの作成と構成に数分かかります。 プロセスが完了すると、演習のコード ファイルが表示されます。
省略可能: Visual Studio Code のセットアップ
Visual Studio Code を使用するには、https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops リポジトリを独自の GitHub アカウントにフォークし、ローカルに複製します。 その後、以下を実行します。
- Visual Studio Code で Dev Container を実行するためのシステム要件をインストールします。
- Docker が動作していることを確認します。
- 新しい Visual Studio Code ウィンドウで、クローンされたリポジトリのフォルダーを開きます
- Ctrl+Shift+P キーを押して、コマンド パレットを開きます。
- 検索: >開発コンテナ: コンテナーで再構築して再度開く
- Visual Studio Code により、ローカルで開発コンテナーが作成されます。
コンテナーをビルドする
ターミナル ウィンドウで、次の dotnet CLI コマンドを実行します。
dotnet publish /p:PublishProfile=DefaultContainer
Azure リソースの作成
ターミナル ウィンドウで、次の Azure CLI コマンドを使用して Azure にサインインします。
az login --use-device-code
選択した Azure サブスクリプションを表示します。
az account show -o table
間違ったサブスクリプションが選択されている場合は、 az account set コマンドを使用して正しいサブスクリプションを選択します。
次の Azure CLI コマンドを実行して、Azure リージョンの一覧と、それに関連付けられている名前を取得します。
az account list-locations -o table
あなたに最も近いリージョンを選び、
[Closest Azure region]
を置き換えて次のステップで使用してください。次の bash ステートメントを実行します。
export LOCATION=[Closest Azure region] export RESOURCE_GROUP=rg-eshop export CLUSTER_NAME=aks-eshop export ACR_NAME=acseshop$SRANDOM
前のコマンドでは、次の Azure CLI コマンドで使用する環境変数を作成します。 LOCATION を、自分の近くの Azure リージョン (eastus など) に変更する必要があります。 リソース グループ、AKS クラスター、または ACR に別の名前を付ける場合は、それらの値を変更します。 Azure portal で新しいリポジトリを表示するには、コンテナー レジストリのアクセス制御 (IAM) で自分を App Compliance Automation 管理者として割り当てます。
次の Azure CLI コマンドを実行します。
az group create --name $RESOURCE_GROUP --location $LOCATION az acr create --resource-group $RESOURCE_GROUP --name $ACR_NAME --sku Basic az acr login --name $ACR_NAME
az acr login --name $ACR_Name
の実行時に認証エラーが発生した場合は、Azure で新しく作成したコンテナー レジスタの [設定 - アクセス キー] で管理者ユーザーを有効にする必要があります。 続行するには、これらの資格情報を入力するように求められます。 また、az login --use-device-code
で再認証が必要になる場合もあります。これらのコマンドは、Azure リソース、イメージの ACR を含むリソース グループを作成し、ACR にログインします。 この出力が表示されるまで数分かかる場合があります。
... }, "status": null, "systemData": { "createdAt": "2023-10-19T09:11:51.389157+00:00", "createdBy": "", "createdByType": "User", "lastModifiedAt": "2023-10-19T09:11:51.389157+00:00", "lastModifiedBy": "", "lastModifiedByType": "User" }, "tags": {}, "type": "Microsoft.ContainerRegistry/registries", "zoneRedundancy": "Disabled" } Login Succeeded
イメージにタグを付け、作成した ACR にプッシュするには、次のコマンドを実行します。
docker tag store $ACR_NAME.azurecr.io/storeimage:v1 docker tag products $ACR_NAME.azurecr.io/productservice:v1 docker push $ACR_NAME.azurecr.io/storeimage:v1 docker push $ACR_NAME.azurecr.io/productservice:v1
次のコマンドを使用して、イメージのプッシュが正常に完了したことを確認できます。
az acr repository list --name $ACR_NAME --output table
AKS を作成し、次のコマンドを使用して ACR に接続します。
az aks create --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --node-count 1 --generate-ssh-keys --node-vm-size Standard_B2s --network-plugin azure --attach-acr $ACR_NAME az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP
このコマンドは、単一ノードの AKS クラスターを作成し、それを ACR に接続してから、ローカル コンピューターを AKS クラスターに接続します。 コマンドの完了には数分かかる場合があります。
次のコマンドを使用して、新しい AKS が ACR からイメージをプルできることを確認します。
az aks check-acr --acr $ACR_NAME.azurecr.io --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP
次のメッセージと同様の出力が表示されます。
[2023-10-19T13:33:09Z] Loading azure.json file from /etc/kubernetes/azure.json [2023-10-19T13:33:09Z] Checking managed identity... [2023-10-19T13:33:09Z] Cluster cloud name: AzurePublicCloud [2023-10-19T13:33:09Z] Kubelet managed identity client ID: 00001111-aaaa-2222-bbbb-3333cccc4444 [2023-10-19T13:33:09Z] Validating managed identity existance: SUCCEEDED [2023-10-19T13:33:09Z] Validating image pull permission: SUCCEEDED [2023-10-19T13:33:09Z] Your cluster can pull images from acseshop1251599299.azurecr.io!
新しい AKS クラスターに対して kubectl コマンドを実行できるようになりました。 出力から完全な ACR URL をコピーします。たとえば、URL の上には acseshop1251599299 があります。
AKS クラスターの状態を確認します。
kubectl get nodes -A
次のメッセージと同様の出力が表示されます。
NAME STATUS ROLES AGE VERSION aks-nodepool1-37200563-vmss000000 Ready agent 3h44m v1.26.6
Kubernetes 配置マニフェストを構成する
これで、eShop イメージが ACR に含まれるので、これらの新しいイメージを使用するように AKS 配置マニフェストを更新できます。
Visual Studio Code または Codespaces のエクスプローラー パネルで、プロジェクトのルートにある deployment.yml ファイルを選択します。
17 行目で置き換えます。
- image: [replace with your ACR name].azurecr.io/storeimage:v1
前の手順でコピーした ACR 名を貼り付けます。行は次の yaml のようになります。
- image: acseshop1251599299.azurecr.io/storeimage:v1
65 行目で次の手順を繰り返します。
- image: [replace with your ACR name].azurecr.io/productservice:v1
CtrlS +を使用してファイルを保存します。
ターミナル ウィンドウで、次の kubernetes コマンドを使用して NGINX イングレス コントローラーをデプロイします。
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.3/deploy/static/provider/cloud/deploy.yaml
kubectl
コマンドは、AKS クラスターへのイングレスを許可するサービスとコンポーネントを追加します。 次の kubernetes コマンドを使用して、イングレスを実行する準備ができていることを確認します。kubectl get services --namespace ingress-nginx
次のメッセージと同様の出力が表示されます。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller LoadBalancer 10.0.135.51 20.26.154.64 80:32115/TCP,443:32254/TCP 58s ingress-nginx-controller-admission ClusterIP 10.0.137.137 <none> 443/TCP 58s
次のコマンドを使用して eShop アプリをデプロイします。
kubectl apply -f deployment.yml
kubectl
apply コマンドは、eShop アプリ、フロントエンド Blazor Web アプリとバックエンド REST API 製品サービス、およびトラフィックを AKS クラスターに正しいサービスにルーティングするイングレス ルールをデプロイします。 デプロイでエラーが発生した場合は、このコマンドを再実行します。次のメッセージと同様の出力が表示されます。
deployment.apps/storeimage created service/eshop-website created deployment.apps/productservice created service/eshop-backend created ingress.networking.k8s.io/eshop-ingress created
次のコマンドを使用して、2 つのマイクロサービスがデプロイされていることを確認します。
kubectl get pods -A
次のメッセージと同様の出力が表示されます。
NAMESPACE NAME READY STATUS RESTARTS AGE default productservice-7569b8c64-vfbfz 1/1 Running 0 3m56s default storeimage-6c7c999d7c-zsnxd 1/1 Running 0 3m56s ingress-nginx ingress-nginx-admission-create-szb8l 0/1 Completed 0 4m4s ingress-nginx ingress-nginx-admission-patch-czdbv 0/1 Completed 0 4m4s ingress-nginx ingress-nginx-controller-58bf5bf7dc-nwtsr 1/1 Running 0 4m4s
次のコマンドを使用して、デプロイされた eShop を表示します。
echo "http://$(kubectl get services --namespace ingress-nginx ingress-nginx-controller --output jsonpath='{.status.loadBalancer.ingress[0].ip}')"
このコマンドは、Web アプリの外部 IP アドレスを返します。 Ctrl キーを押しながらリンクをクリックすると、新しいタブでアプリが開きます。
GitHub からデプロイするためのサービス プリンシパルを作成する
GitHub Actions では、コンテナー イメージを Azure Container Registry に発行できます。 そのため、GitHub ランナーには、Azure に接続するためのアクセス許可が必要です。 次の手順では、Azure 内で GitHub Actions ID として機能する Azure AD サービス プリンシパルを作成します。
環境変数にサブスクリプション ID を保存するには、ターミナルで次のコマンドを実行します。
export SUBS=$(az account show --query 'id' --output tsv)
GitHub からのアクセスを許可する Azure AD サービス プリンシパルを作成するには、次のコマンドを実行します。
az ad sp create-for-rbac --name "eShop" --role contributor --scopes /subscriptions/$SUBS/resourceGroups/$RESOURCE_GROUP --json-auth
次に示す出力の一例が表示されます。
Creating 'Contributor' role assignment under scope '/subscriptions/ffffffff-aaaa-bbbb-6666-777777777777' The output includes credentials that you must protect. Be sure that you do not include these credentials in your code or check the credentials into your source control. For more information, see https://aka.ms/azadsp-cli { "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444", "clientSecret": "abc1A~abc123ABC123abc123ABC123abc123ABC1", "subscriptionId": "00000000-0000-0000-0000-000000000000", "tenantId": "00000000-0000-0000-0000-000000000000", "activeDirectoryEndpointUrl": "https://login.microsoftonline.com", "resourceManagerEndpointUrl": "https://management.azure.com/", "activeDirectoryGraphResourceId": "https://graph.windows.net/", "sqlManagementEndpointUrl": "https://management.core.windows.net:8443/", "galleryEndpointUrl": "https://gallery.azure.com/", "managementEndpointUrl": "https://management.core.windows.net/" }
次のステップで使用する JSON 出力と括弧をコピーします。
GitHub シークレットを作成する
GitHub Actions ランナーは、資格情報を使用して Container Registry と AKS と対話します。 サービス プリンシパルとコンテナー レジストリの資格情報は機密情報です。 機密情報を暗号化された シークレット として安全な場所に格納することをお勧めします。 GitHub には、シークレットやその他の変数を格納するための組み込みの場所が用意されています。
機密情報を環境変数としてリポジトリに安全に格納するには、次の手順を実行します。 リポジトリ管理者は、GitHub Actions ランナーがアクセスできるシークレットを管理する必要があります。
フォークした GitHub リポジトリで、 Settings>Secrets and variables>Actionsに移動します。
[ Actions secrets and variables ] ページで、[ New repository secret] を選択します。
[ New secret ] ページの [ Name] に 「AZURE_CREDENTIALS」と入力し、 Secretの下にターミナルからコピーした JSON 出力を入力します。
設定は次のスクリーンショットのようになります。
[Add secret] を選択します。
この GitHub シークレットは、次のセクションで使用して、コンテナー イメージをビルドする GitHub アクションを作成します。