クイック スタート: Azure CLIを使用して AKS クラスター用の Azure Container Linux (ACL) をデプロイする

Azure CLIを使用して AKS クラスターをデプロイして、AKS 用の Azure Container Linux (ACL) の使用を開始します。

このクイック スタートでは、次の方法について説明します。

  • AKS の ACL を使用して AKS クラスターを作成します。
  • Azure CLIを使用してクラスターをデプロイします。
  • 小売シナリオをシミュレートするマイクロサービスと Web フロントエンドのグループを使用して、サンプルのマルチコンテナー アプリケーションを実行します。

Note

この記事では、評価のみを目的として既定の設定でクラスターをデプロイする手順について説明します。 運用環境に対応したクラスターをデプロイする前に、 ベースライン参照アーキテクチャ を理解して、それがビジネス要件にどのように適合するかを検討することをお勧めします。

Important

AKS で Azure Container Linux (ACL) を使用している場合は、次の考慮事項と制限事項を確認してください。

Prerequisites

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

  • Azure アカウントをお持ちでない場合は、開始する前に 無料アカウント を作成してください。

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Get started with Azure Cloud Shell」を参照してください。

  • CLI 参照コマンドをローカルで実行する場合は、 Azure CLIをインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用している場合は、az login コマンドを使用してAzure CLIにサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 他のサインインオプションについては、「Azure CLI を使用して Azure に認証する」を参照してください。
    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、「Azure CLI で拡張機能を使用および管理する」を参照してください。
    • バージョン 2.86.0 以降Azure CLI必要です。 az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、 az upgradeを実行します。
  • クラスターの作成に使用している ID に、適切な最小限のアクセス許可が与えられていることを確認します。 AKS のアクセスと ID の情報については、「Azure Kubernetes Service (AKS) でのアクセスと ID オプション」を参照してください。

  • 複数の Azure サブスクリプションがある場合は、 az account set コマンドを使用してリソースを課金する適切なサブスクリプション ID を選択します。 詳細については、Azure CLI で Azure サブスクリプションを管理する方法に関するページを参照してください。

  • Azure サブスクリプションによっては、vCPU クォータの引き上げを要求することが必要になる場合があります。 詳細については、「 VM ファミリの vCPU クォータを増やす」を参照してください。

必要なリソース プロバイダーを登録する

Azure サブスクリプションに必要なリソース プロバイダー (Microsoft.ContainerService など) を登録することが必要になる場合があります。

登録の状態を確認する

az provider show コマンドを使用して登録の状態を確認します。

az provider show --namespace Microsoft.ContainerService --query registrationState

リソース プロバイダーを登録する

必要に応じて、Microsoft.ContainerService コマンドを使用して、az provider register リソース プロバイダーを登録します。

az provider register --namespace Microsoft.ContainerService

環境変数を定義する

このクイック スタート全体で使用する次の環境変数を定義します。 必要に応じて、値を独自のカスタム名に置き換えることができます。

export RESOURCE_GROUP="myAKSResourceGroup"
export REGION="westus"
export CLUSTER_NAME="myAKSCluster"

リソース グループを作成します

Azure リソース グループは、Azure リソースが展開され管理される論理グループです。 リソース グループを作成する際は、場所の指定を求めるプロンプトが表示されます。 この場所は、リソース グループのメタデータが格納される場所です。また、リソースの作成時に別のリージョンを指定しない場合は、Azure でリソースが実行される場所でもあります。

az group create コマンドを使用して、リソース グループを作成します。

az group create \
  --name $RESOURCE_GROUP \
  --location $REGION

出力例:

{
  "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myAKSResourceGroup",
  "location": "westus",
  "managedBy": null,
  "name": "myAKSResourceGroup",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

AKS クラスターを作成する

az aks create コマンドを使用して、AKS クラスターを作成します。 --os-sku AzureContainerLinux パラメーターは、ACL をノード OS として使用するようにシステム ノード プールを構成します。 次の例では、1 つのノードでクラスターを作成し、システム割り当てマネージド ID を有効にします。

az aks create \
  --resource-group $RESOURCE_GROUP \
  --name $CLUSTER_NAME \
  --os-sku AzureContainerLinux \
  --node-count 1 \
  --generate-ssh-keys

Note

新しいクラスターを作成すると、AKS リソースを保存するための 2 つ目のリソース グループが自動的に作成されます。 詳細については、「AKS と一緒にリソース グループが 2 つ作成されるのはなぜでしょうか?」を参照してください。

クラスターに接続する

Kubernetes クラスターを管理するには、Kubernetes のコマンドライン クライアントである kubectl を使います。 Azure Cloud Shell を使用している場合、kubectl は既にインストールされています。 kubectl をローカルにインストールするには、az aks install-cli コマンドを使用します。

  1. kubectl コマンドを使用して、Kubernetes クラスターに接続するように az aks get-credentials を構成します。 このコマンドは、資格情報をダウンロードし、それを使用するように Kubernetes CLI を構成します。

    az aks get-credentials \
      --resource-group $RESOURCE_GROUP \
      --name $CLUSTER_NAME
    
  2. kubectl get コマンドを使用して、ご利用のクラスターへの接続を確認します。 このコマンドでは、クラスター ノードの一覧が返されます。

    kubectl get nodes
    

アプリケーションをデプロイする

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

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

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

Note

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

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

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: rabbitmq
    spec:
      serviceName: rabbitmq
      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
            startupProbe:
              httpGet:
                path: /health
                port: 3000
              failureThreshold: 5
              initialDelaySeconds: 20
              periodSeconds: 10
            readinessProbe:
              httpGet:
                path: /health
                port: 3000
              failureThreshold: 3
              initialDelaySeconds: 3
              periodSeconds: 5
            livenessProbe:
              httpGet:
                path: /health
                port: 3000
              failureThreshold: 5
              initialDelaySeconds: 3
              periodSeconds: 3
          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
            env:
            - name: AI_SERVICE_URL
              value: "http://ai-service:5001/"
            resources:
              requests:
                cpu: 1m
                memory: 1Mi
              limits:
                cpu: 2m
                memory: 20Mi
            readinessProbe:
              httpGet:
                path: /health
                port: 3002
              failureThreshold: 3
              initialDelaySeconds: 3
              periodSeconds: 5
            livenessProbe:
              httpGet:
                path: /health
                port: 3002
              failureThreshold: 5
              initialDelaySeconds: 3
              periodSeconds: 3
    ---
    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
            startupProbe:
              httpGet:
                path: /health
                port: 8080
              failureThreshold: 3
              initialDelaySeconds: 5
              periodSeconds: 5
            readinessProbe:
              httpGet:
                path: /health
                port: 8080
              failureThreshold: 3
              initialDelaySeconds: 3
              periodSeconds: 3
            livenessProbe:
              httpGet:
                path: /health
                port: 8080
              failureThreshold: 5
              initialDelaySeconds: 3
              periodSeconds: 3
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: store-front
    spec:
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: store-front
      type: LoadBalancer
    

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

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

  2. kubectl apply コマンドを使用してアプリケーションをデプロイし、ご利用の YAML マニフェストの名前を指定します。

    kubectl apply -f aks-store-quickstart.yaml
    

    次の出力例は、デプロイとサービスを示しています。

    deployment.apps/rabbitmq created
    service/rabbitmq created
    deployment.apps/order-service created
    service/order-service created
    deployment.apps/product-service created
    service/product-service created
    deployment.apps/store-front created
    service/store-front created
    

アプリケーションをテストする

アプリケーションを実行すると、Kubernetes サービスによってアプリケーション フロントエンドがインターネットに公開されます。 このプロセスが完了するまでに数分かかることがあります。

  1. kubectl get pods コマンドを使用して、デプロイされたポッドの状態を確認します。 続行する前に、すべてのポッドが Running されていることを確認します。

    kubectl get pods
    
  2. store-front アプリケーションのパブリック IP アドレスを確認します。 kubectl get service コマンドと --watch 引数を使用して、進行状況を監視します。

    kubectl get service store-front --watch
    

    サービスの store-front の出力は、最初は pending と表示されます。

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   <pending>     80:30025/TCP   4h4m
    

    EXTERNAL-IP アドレスが保留中から実際のパブリック IP アドレスに変わったら、CTRL-C を使用して kubectl ウォッチ プロセスを停止します。

    次の出力例は、サービスに割り当てられている有効なパブリック IP アドレスを示しています。

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   20.62.159.19   80:30025/TCP   4h5m
    
  3. サービスの外部 IP アドレスに対して Web ブラウザーを開き、Azure Store アプリの動作を確認します。

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

クラスターを削除する

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

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

az group delete --name $RESOURCE_GROUP

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

このクイック スタートでは、Azure CLIを使用して AKS 用の ACL を持つ AKS クラスターをデプロイしました。 AKS 向け ACL の詳細については、Azure Kubernetes Service (AKS) 向け Azure Container Linux (ACL) を参照してください。