クイック スタート: Azure portal を使用して Azure Kubernetes Service (AKS) クラスターをデプロイする

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

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

Note

このサンプル アプリケーションはデモ用であり、Kubernetes アプリケーションのすべてのベスト プラクティスを表しているわけではありません。

開始する前に

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

Note

Azure Linux ノード プールが一般提供 (GA) になりました。 利点とデプロイの手順については、AKS 用 Azure Linux コンテナー ホストの概要に関する記事を参照してください。

AKS クラスターを作成する

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

  2. Azure portal のホーム ページで [リソースの作成] を選択します。

  3. [カテゴリ] セクションで、[コンテナー]>[Azure Kubernetes Service (AKS)] を選択します。

  4. [基本] タブで次のオプションを構成します。

    • [プロジェクトの詳細] で 次の手順を実行します
      • Azure のサブスクリプションを選択します
      • Azure リソース グループを作成します (myResourceGroup など)。 既存のリソース グループを選択することもできますが、テストまたは評価目的の場合は、これらのリソースを一時的にホストし、運用ワークロードや開発ワークロードに影響を与えないようにリソース グループを作成することをお勧めします。
    • [クラスターの詳細] で 、次の手順を実行します。
      • クラスター プリセット構成Dev/Test設定します。 プリセットの構成の詳細については、Azure portal の「クラスター構成プリセット」を参照してください。

        Note

        クラスターの作成時にプリセット構成を変更するには、[プリセットの比較] を選択し、別のオプションを選択します。 Screenshot of Create AKS cluster - portal preset options.

      • Kubernetes クラスター名 (たとえば、myAKSCluster) を入力します。

      • AKS クラスターの [リージョン] を選択します。

      • [可用性ゾーン] 設定を [なし] に設定します

      • AKS 価格レベルFree設定します。

      • Kubernetes バージョンは既定値を選択したままにします。

      • [自動アップグレード] 設定は、推奨される値 (パッチで有効) のままにします。

      • [認証と承認] 設定は、Kubernetes RBAC を使用するローカル アカウントに設定したままにします。

        Screenshot showing how to configure an AKS cluster in Azure portal.

  5. [次へ] を選択します。 [ノード プール] タブで、新しいノード プールを追加します。

    • [ノード プールの追加] を選択します。

    • nplinux などのノード プール名を入力します

    • [モード][ユーザー] を選択します。

    • OS SKU の場合は、Ubuntu Linux を選択します

    • [可用性ゾーン] 設定を [なし] に設定します

    • [Enable Azure Spot instances]\(Azure スポット インスタンスを有効にする\) チェックボックスはチェックのままにします。

    • [ノード サイズ] で、[サイズの選択] を選択します [VM サイズの選択] ページで、D2s_v3選択し、[選択] ボタンを選択します。

    • [スケール] メソッド設定は [自動スケール] のままにします

    • [最小ノード数] フィールドと [最大ノード数] フィールドは既定の設定のままにします。

      Screenshot showing how to create a node pool running Ubuntu Linux.

  6. 他のタブのすべての設定は既定値のままにします。

  7. [確認と作成] を選択して、クラスター構成で検証を実行します。 検証が完了したら、[作成] を選択して AKS クラスターを作成します。

AKS クラスターの作成には数分かかります。 デプロイが完了したら、次のいずれかの方法でリソースに移動します。

  • [リソースに移動] を選択します。
  • AKS クラスター リソース グループを参照し、AKS リソースを選択します。 この例では、myResourceGroup を参照し、リソース myAKSCluster を選択します。

クラスターに接続する

Kubernetes クラスターを管理するには、Kubernetes のコマンドライン クライアントである kubectl を使います。 Azure Cloud Shell を使用している場合、kubectl は既にインストールされています。 Cloud Shell について初めて学ぶ場合は、「Azure Cloud Shell の概要」を確認してください。

  1. Azure portal の上部にある >_ ボタンを使用して Cloud Shell を開きます。

    Note

    ローカル インストールのシェルでこれらの操作を実行するには、次のようにします。

    1. Azure CLI または Azure PowerShell がインストールされていることを確認します。
    2. az login または Connect-AzAccount のコマンドを使用して Azure に接続します。
  1. az aks get-credentials コマンドを使用して、Kubernetes クラスターに接続するように kubectl を構成します。 このコマンドは、資格情報をダウンロードし、それを使用するように Kubernetes CLI を構成します。

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  2. クラスター ノードの一覧を返す kubectl get を使用して、クラスターへの接続を確認します。

    kubectl get nodes
    

    次の出力例は、前の手順で作成した単一ノードを示しています。 ノードの状態が [Ready] であることを確認してください。

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-31718369-0   Ready    agent   6m44s   v1.15.10
    

アプリケーションの配置

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

Screenshot of Azure Store sample architecture.

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

Note

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

  1. Cloud Shell でエディターを開き、aks-store-quickstart.yaml という名前のファイルを作成します。

  2. 次のマニフェストをエディターに貼り付けます。

    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 マニフェスト」を参照してください。

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

  4. 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 の状態にします。

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

    kubectl get service store-front --watch
    

    store-front サービスの [EXTERNAL-IP] の出力は、最初は 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. Azure Store アプリが動作していることを確認するには、Web ブラウザーを開いてサービスの外部 IP アドレスにアクセスします。

    Screenshot of AKS Store sample application.

クラスターを削除する

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

  1. Azure portal で、AKS クラスター リソース グループに移動します。

  2. [リソース グループの削除] を選択します。

  3. 削除するリソース グループの名前を入力し、[削除>] を選択します。

    Note

    AKS クラスターは、システム割り当てマネージド ID を使用して作成されました。 この ID はプラットフォームによって管理され、削除は必要ありません。

次のステップ

このクイック スタートでは、Kubernetes クラスターをデプロイし、シンプルな複数コンテナー アプリケーションをそこにデプロイしました。

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