クラウドネイティブ アプリを Azure Kubernetes Service に手動でデプロイする

完了

Web サイトのデプロイを自動化する前に、既存の eShop アプリを Azure Kubernetes Service (AKS) に手動でデプロイする必要があります。 Azure CLI コマンドと bash スクリプトを使って、Azure リソースを作成し、アプリを 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. [Codespaces] タブを選択します。
  3. + アイコンを選択して codespace を作成します。

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

省略可能: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. 検索: >Dev Containers:コンテナーでリビルドして再度開く
  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)] 内でご自身を [アプリ コンプライアンス オートメーション管理者] として割り当ててください。

  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 の [設定] - [アクセス キー] で新しく作成したコンテナー レジスタ[管理者ユーザー] を有効にする必要があります。 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: 71588cd0-9229-4914-9c8e-1dc229d775c8
    [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 の [エクスプローラー] パネルから、プロジェクトのルートにある 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
    

    CTRL+S キーでファイルを保存します。

  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/00000000-0000-0000-0000-000000000000'
    
    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": "00000000-0000-0000-0000-000000000000",
      "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 アクションを作成します。