クラウドネイティブ アプリを 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 アカウントにフォークします。 次に、新しいフォークで次の手順を実行します。

  1. [コード] を選択します。
  2. [ コードスペース ] タブを選択します。
  3. + アイコンを選択してコードスペースを作成します。

GitHub では、コードスペースの作成と構成に数分かかります。 プロセスが完了すると、演習のコード ファイルが表示されます。

省略可能: Visual Studio Code のセットアップ

Visual Studio Code を使用するには、https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops リポジトリを独自の GitHub アカウントにフォークし、ローカルに複製します。 その後、以下を実行します。

  1. Visual Studio Code で Dev Container を実行するためのシステム要件をインストールします。
  2. Docker が動作していることを確認します。
  3. 新しい Visual Studio Code ウィンドウで、クローンされたリポジトリのフォルダーを開きます
  4. Ctrl+Shift+P キーを押して、コマンド パレットを開きます。
  5. 検索: >開発コンテナ: コンテナーで再構築して再度開く
  6. Visual Studio Code により、ローカルで開発コンテナーが作成されます。

コンテナーをビルドする

  1. ターミナル ウィンドウで、次の dotnet CLI コマンドを実行します。

    dotnet publish /p:PublishProfile=DefaultContainer 
    

Azure リソースの作成

  1. ターミナル ウィンドウで、次の Azure CLI コマンドを使用して Azure にサインインします。

    az login --use-device-code
    
  2. 選択した Azure サブスクリプションを表示します。

    az account show -o table
    

    間違ったサブスクリプションが選択されている場合は、 az account set コマンドを使用して正しいサブスクリプションを選択します。

  3. 次の Azure CLI コマンドを実行して、Azure リージョンの一覧と、それに関連付けられている名前を取得します。

    az account list-locations -o table
    

    あなたに最も近いリージョンを選び、[Closest Azure region] を置き換えて次のステップで使用してください。

  4. 次の 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 管理者として割り当てます。

  5. 次の 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
    
  6. イメージにタグを付け、作成した 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
    
  7. 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 クラスターに接続します。 コマンドの完了には数分かかる場合があります。

  8. 次のコマンドを使用して、新しい 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 があります

  9. AKS クラスターの状態を確認します。

    kubectl get nodes -A
    

    次のメッセージと同様の出力が表示されます。

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-37200563-vmss000000   Ready    agent   3h44m   v1.26.6
    

Kubernetes 配置マニフェストを構成する

これで、eShop イメージが ACR に含まれるので、これらの新しいイメージを使用するように AKS 配置マニフェストを更新できます。

  1. Visual Studio Code または Codespaces のエクスプローラー パネルで、プロジェクトのルートにある deployment.yml ファイルを選択します。

  2. 17 行目で置き換えます。

    - image: [replace with your ACR name].azurecr.io/storeimage:v1
    

    前の手順でコピーした ACR 名を貼り付けます。行は次の yaml のようになります。

    - image: acseshop1251599299.azurecr.io/storeimage:v1
    
  3. 65 行目で次の手順を繰り返します。

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

    CtrlS +を使用してファイルを保存します

  4. ターミナル ウィンドウで、次の 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
    
  5. 次のコマンドを使用して 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
    
  6. 次のコマンドを使用して、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
    
  7. 次のコマンドを使用して、デプロイされた eShop を表示します。

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

    このコマンドは、Web アプリの外部 IP アドレスを返します。 Ctrl キーを押しながらリンクをクリックすると、新しいタブでアプリが開きます。

    eShop Web アプリのホーム ページのスクリーンショット。

GitHub からデプロイするためのサービス プリンシパルを作成する

GitHub Actions では、コンテナー イメージを Azure Container Registry に発行できます。 そのため、GitHub ランナーには、Azure に接続するためのアクセス許可が必要です。 次の手順では、Azure 内で GitHub Actions ID として機能する Azure AD サービス プリンシパルを作成します。

  1. 環境変数にサブスクリプション ID を保存するには、ターミナルで次のコマンドを実行します。

    export SUBS=$(az account show --query 'id' --output tsv)
    
  2. 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/"
    }
    
  3. 次のステップで使用する JSON 出力と括弧をコピーします。

GitHub シークレットを作成する

GitHub Actions ランナーは、資格情報を使用して Container Registry と AKS と対話します。 サービス プリンシパルとコンテナー レジストリの資格情報は機密情報です。 機密情報を暗号化された シークレット として安全な場所に格納することをお勧めします。 GitHub には、シークレットやその他の変数を格納するための組み込みの場所が用意されています。

機密情報を環境変数としてリポジトリに安全に格納するには、次の手順を実行します。 リポジトリ管理者は、GitHub Actions ランナーがアクセスできるシークレットを管理する必要があります。

  1. フォークした GitHub リポジトリで、 Settings>Secrets and variables>Actionsに移動します。

  2. [ Actions secrets and variables ] ページで、[ New repository secret] を選択します。

  3. [ New secret ] ページの [ Name] に 「AZURE_CREDENTIALS」と入力し、 Secretの下にターミナルからコピーした JSON 出力を入力します。

    設定は次のスクリーンショットのようになります。

    GitHub で環境変数シークレットを設定する [新しいシークレット] ページのスクリーンショット。

  4. [Add secret] を選択します。

この GitHub シークレットは、次のセクションで使用して、コンテナー イメージをビルドする GitHub アクションを作成します。