クイック スタート: Bicep 拡張機能 Kubernetes プロバイダー (プレビュー) を使用して Azure Kubernetes Service (AKS) クラスターをデプロイする

Azure Kubernetes Service (AKS) は、クラスターをすばやくデプロイおよび管理することができる、マネージド Kubernetes サービスです。 このクイック スタートでは次の作業を行います。

  • Bicep 拡張機能 Kubernetes プロバイダー (プレビュー) を使用して AKS クラスターをデプロイする。
  • 小売シナリオをシミュレートするマイクロサービスのグループと、Web フロントエンドを使用して、サンプルのマルチコンテナー アプリケーションを実行します。

重要

Bicep Kubernetes プロバイダーは現在プレビュー段階です。 Bicep 構成ファイルからこの機能を有効にするには、次を追加します。

{
 "experimentalFeaturesEnabled": {
   "extensibility": true,
 }
}

Note

AKS クラスターの迅速なプロビジョニングを開始するため、この記事には、評価のみを目的とした既定の設定でクラスターをデプロイする手順が含まれています。 運用環境に対応したクラスターをデプロイする前に、ベースライン参照アーキテクチャを理解して、ビジネス要件にどの程度合致しているかを検討することをお勧めします。

開始する前に

このクイックスタートは、Kubernetes の基本的な概念を理解していることを前提としています。 詳細については、「Azure Kubernetes Services (AKS) における Kubernetes の中心概念」を参照してください。

Bicep は、宣言型の構文を使用して Azure リソースをデプロイするドメイン固有言語 (DSL) です。 簡潔な構文、信頼性の高いタイプ セーフ、およびコードの再利用のサポートが提供されます。 Bicep により、Azure のコード ソリューションとしてのインフラストラクチャに最適な作成エクスペリエンスが実現します。

  • Bicep の開発環境を設定するには、「Bicep ツールをインストールする」を参照してください。 これらの手順を完了すると、Visual Studio CodeBicep 拡張機能を利用できるようになります。 また、最新の Azure CLI バージョンまたは最新の Azure PowerShell モジュールもあります。
  • Bicep ファイルを使用して AKS クラスターを作成するには、SSH 公開キーを指定します。 このリソースが必要な場合は、次のセクションを参照してください。 それ以外の場合は、「Bicep ファイルを確認する」に進みます。
  • Bicep ファイルをデプロイするには、デプロイするリソースに対する書き込みアクセス権と、リソースの種類 Microsoft.Resources/deployments にあらゆる操作を実行するためのアクセス権が必要です。 たとえば、仮想マシンをデプロイするには、Microsoft.Compute/virtualMachines/write および Microsoft.Resources/deployments/* アクセス許可が必要です。 ロールとアクセス許可の一覧については、Azure の組み込みロールに関するページを参照してください。

SSH キー ペアの作成

  1. https://shell.azure.com にアクセスし、ブラウザーで Cloud Shell を開きます。

  2. az sshkey create Azure CLI コマンドまたは ssh-keygen コマンドを使用して SSH キーの組を作成します。

    # Create an SSH key pair using Azure CLI
    az sshkey create --name "mySSHKey" --resource-group "myResourceGroup"
    
    # Create an SSH key pair using ssh-keygen
    ssh-keygen -t rsa -b 4096
    

SSH キーの作成の詳細については、Azure での認証用の SSH キーの作成と管理に関するページを参照してください。

Bicep ファイルを確認する

AKS クラスターの作成に使用される Bicep ファイルは、Azure クイックスタート テンプレートからのものです。 他の AKS サンプルについては、「AKS クイック スタートのテンプレート」を参照してください。

@description('The name of the Managed Cluster resource.')
param clusterName string = 'aks101cluster'

@description('The location of the Managed Cluster resource.')
param location string = resourceGroup().location

@description('Optional DNS prefix to use with hosted Kubernetes API server FQDN.')
param dnsPrefix string

@description('Disk size (in GB) to provision for each of the agent pool nodes. This value ranges from 0 to 1023. Specifying 0 will apply the default disk size for that agentVMSize.')
@minValue(0)
@maxValue(1023)
param osDiskSizeGB int = 0

@description('The number of nodes for the cluster.')
@minValue(1)
@maxValue(50)
param agentCount int = 3

@description('The size of the Virtual Machine.')
param agentVMSize string = 'standard_d2s_v3'

@description('User name for the Linux Virtual Machines.')
param linuxAdminUsername string

@description('Configure all linux machines with the SSH RSA public key string. Your key should include three parts, for example \'ssh-rsa AAAAB...snip...UcyupgH azureuser@linuxvm\'')
param sshRSAPublicKey string

resource aks 'Microsoft.ContainerService/managedClusters@2024-02-01' = {
  name: clusterName
  location: location
  identity: {
    type: 'SystemAssigned'
  }
  properties: {
    dnsPrefix: dnsPrefix
    agentPoolProfiles: [
      {
        name: 'agentpool'
        osDiskSizeGB: osDiskSizeGB
        count: agentCount
        vmSize: agentVMSize
        osType: 'Linux'
        mode: 'System'
      }
    ]
    linuxProfile: {
      adminUsername: linuxAdminUsername
      ssh: {
        publicKeys: [
          {
            keyData: sshRSAPublicKey
          }
        ]
      }
    }
  }
}

output controlPlaneFQDN string = aks.properties.fqdn

Bicep ファイルで定義されているリソースは、Microsoft.ContainerService/managedClusters です。

ファイルのコピーを main.bicep としてローカル コンピューターに保存します。

アプリケーション定義を作成する

アプリケーションをデプロイするには、マニフェスト ファイルを使用して、AKS ストア アプリケーションの実行に必要なすべてのオブジェクトを作成します。 Kubernetes のマニフェスト ファイルでは、どのコンテナー イメージを実行するかなど、クラスターの望ましい状態を定義します。 マニフェストには、次の Kubernetes のデプロイとサービスが含まれています。

Azure Store サンプル アーキテクチャのスクリーンショット。

  • ネットショップ: 顧客が製品を見て注文するための Web アプリケーション。
  • 製品サービス: 製品情報が表示されます。
  • 注文サービス: 注文を行います。
  • Rabbit MQ: 注文キューのメッセージ キュー。

Note

運用環境の永続ストレージを使用せずに Rabbit MQ などのステートフル コンテナーを実行することはお勧めしません。 これらはわかりやすくするためにここで使用しますが、Azure CosmosDB や Azure Service Bus などのマネージド サービスを使用することをお勧めします。

  1. main.bicep と同じフォルダーに aks-store-quickstart.yaml という名前のファイルを作成し、そこに次のマニフェストをコピーします。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: rabbitmq
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: rabbitmq
      template:
        metadata:
          labels:
            app: rabbitmq
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: rabbitmq
            image: mcr.microsoft.com/mirror/docker/library/rabbitmq:3.10-management-alpine
            ports:
            - containerPort: 5672
              name: rabbitmq-amqp
            - containerPort: 15672
              name: rabbitmq-http
            env:
            - name: RABBITMQ_DEFAULT_USER
              value: "username"
            - name: RABBITMQ_DEFAULT_PASS
              value: "password"
            resources:
              requests:
                cpu: 10m
                memory: 128Mi
              limits:
                cpu: 250m
                memory: 256Mi
            volumeMounts:
            - name: rabbitmq-enabled-plugins
              mountPath: /etc/rabbitmq/enabled_plugins
              subPath: enabled_plugins
          volumes:
          - name: rabbitmq-enabled-plugins
            configMap:
              name: rabbitmq-enabled-plugins
              items:
              - key: rabbitmq_enabled_plugins
                path: enabled_plugins
    ---
    apiVersion: v1
    data:
      rabbitmq_enabled_plugins: |
        [rabbitmq_management,rabbitmq_prometheus,rabbitmq_amqp1_0].
    kind: ConfigMap
    metadata:
      name: rabbitmq-enabled-plugins            
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: rabbitmq
    spec:
      selector:
        app: rabbitmq
      ports:
        - name: rabbitmq-amqp
          port: 5672
          targetPort: 5672
        - name: rabbitmq-http
          port: 15672
          targetPort: 15672
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: order-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: order-service
      template:
        metadata:
          labels:
            app: order-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: order-service
            image: ghcr.io/azure-samples/aks-store-demo/order-service:latest
            ports:
            - containerPort: 3000
            env:
            - name: ORDER_QUEUE_HOSTNAME
              value: "rabbitmq"
            - name: ORDER_QUEUE_PORT
              value: "5672"
            - name: ORDER_QUEUE_USERNAME
              value: "username"
            - name: ORDER_QUEUE_PASSWORD
              value: "password"
            - name: ORDER_QUEUE_NAME
              value: "orders"
            - name: FASTIFY_ADDRESS
              value: "0.0.0.0"
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi
          initContainers:
          - name: wait-for-rabbitmq
            image: busybox
            command: ['sh', '-c', 'until nc -zv rabbitmq 5672; do echo waiting for rabbitmq; sleep 2; done;']
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: order-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3000
        targetPort: 3000
      selector:
        app: order-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: product-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: product-service
      template:
        metadata:
          labels:
            app: product-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: product-service
            image: ghcr.io/azure-samples/aks-store-demo/product-service:latest
            ports:
            - containerPort: 3002
            resources:
              requests:
                cpu: 1m
                memory: 1Mi
              limits:
                cpu: 1m
                memory: 7Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: product-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3002
        targetPort: 3002
      selector:
        app: product-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store-front
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: store-front
      template:
        metadata:
          labels:
            app: store-front
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: store-front
            image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
            ports:
            - containerPort: 8080
              name: store-front
            env: 
            - name: VUE_APP_ORDER_SERVICE_URL
              value: "http://order-service:3000/"
            - name: VUE_APP_PRODUCT_SERVICE_URL
              value: "http://product-service:3002/"
            resources:
              requests:
                cpu: 1m
                memory: 200Mi
              limits:
                cpu: 1000m
                memory: 512Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: store-front
    spec:
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: store-front
      type: LoadBalancer
    

    YAML マニフェスト ファイルの内訳については、「デプロイと YAML マニフェスト」を参照してください。

    YAML ファイルをローカルに作成して保存する場合は、[ファイルのアップロード/ダウンロード] ボタンを選択し、ローカル ファイル システムからファイルを選択することで、CloudShell の既定のディレクトリにマニフェスト ファイルをアップロードできます。

  2. Visual Studio Code で main.bicep を開きます。

  3. Ctrl + Shift + P キーを押してコマンド パレットを開きます。

  4. bicep を検索し、[Bicep: Import Kubernetes Manifest] を選択します。

    Visual Studio Code の import Kubernetes Manifest のスクリーンショット。

  5. プロンプトから aks-store-quickstart.yaml を選択します。 このプロセスによって同じフォルダーに aks-store-quickstart.bicep ファイルが作成されます。

  6. main.bicep を開き、新しく作成された aks-store-quickstart.bicep モジュールを参照するための次の Bicep をファイルの末尾に追加します。

    module kubernetes './aks-store-quickstart.bicep' = {
      name: 'buildbicep-deploy'
      params: {
        kubeConfig: aks.listClusterAdminCredential().kubeconfigs[0].value
      }
    }
    
  7. main.bicepaks-store-quickstart.bicep の両方を保存します。

Bicep ファイルをデプロイする

  1. az group create コマンドを使って Azure リソース グループを作成します。

    az group create --name myResourceGroup --location eastus
    
  2. az deployment group create コマンドを使って Bicep ファイルをデプロイします。

    az deployment group create --resource-group myResourceGroup --template-file main.bicep --parameters clusterName=<cluster-name> dnsPrefix=<dns-previs> linuxAdminUsername=<linux-admin-username> sshRSAPublicKey='<ssh-key>'
    

コマンドには次の値を指定します。

  • [クラスター名] : AKS クラスターの一意の名前 (myAKSCluster など) を入力します。
  • [DNS プレフィックス] : クラスターの一意の DNS プレフィックス (myakscluster など) を入力します。
  • [Linux Admin Username](Linux 管理者ユーザー名) : SSH を使用して接続するためのユーザー名 (azureuser など) を入力します。
  • [SSH RSA Public Key](SSH RSA 公開キー) : SSH キー ペアの "公開" 部分 (既定では、 ~/.ssh/id_rsa.pub の内容) をコピーして貼り付けます。

AKS クラスターの作成には数分かかります。 クラスターが正常にデプロイされるのを待ってから、次の手順に進みます。

Bicep デプロイを検証する

  1. Azure portal にサインインします。

  2. Azure portal メニュー上または [ホーム] ページから、AKS クラスターに移動します。

  3. [Kubernetes リソース] で、[サービスとイングレス] を選択します。

  4. ストア フロント サービスを見つけて、外部 IP の値をコピーします。

  5. Azure Store アプリが動作していることを確認するには、Web ブラウザーを開いてサービスの外部 IP アドレスにアクセスします。

    AKS Store サンプル アプリケーションのスクリーンショット。

クラスターを削除する

AKS チュートリアル」を実行しない場合は、Azure の課金を回避するために不要なリソースをクリーンアップします。

az group delete コマンドを使用して、リソース グループ、コンテナー サービス、すべての関連リソースを削除します。

az group delete --name myResourceGroup --yes --no-wait

Note

AKS クラスターは、本クイックスタートの既定の ID オプションであるシステム割り当てマネージド ID を使用して作成されています。 この ID はプラットフォームによって管理されるため、手動で削除する必要はありません。

次のステップ

このクイック スタートでは、Kubernetes クラスターをデプロイし、シンプルな複数コンテナー アプリケーションをそこにデプロイしました。 このサンプル アプリケーションはデモ専用であり、Kubernetes アプリケーションのすべてのベスト プラクティスを表すわけではありません。 実稼動用に AKS を使用した完全なソリューションを作成するうえでのガイダンスについては、AKS ソリューション ガイダンスに関する記事を参照してください。

AKS の詳細を確認し、完全なコードからデプロイの例までを確認するには、Kubernetes クラスターのチュートリアルに進んでください。