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

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

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

Note

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

開始する前に

このクイックスタートは、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. [基本] タブで次の設定を構成します。

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

        Note

        クラスターを作成するときに [Compare presets] (プリセットの比較) を選択し、別のオプションを選択することで、プリセットの構成を変更できます。 AKS クラスターの作成 - ポータルのプリセット オプションのスクリーンショット。

      • Kubernetes クラスター名: myAKSCluster などのクラスター名を入力します。

      • リージョン: "米国東部 2" などのリージョンを選択します。

      • 可用性ゾーン: [なし] を選択します。

      • AKS 価格レベル: [Free] を選択します。

      • 残りの設定は既定値のままにして、[次へ] を選択します。

        Azure portal で AKS クラスターを構成する方法を示すスクリーンショット。

  5. [ノード プール] タブで、以下の設定を構成します。

    • [ノード プールの追加] を選択し、nplinux などのノード プール名を入力します。

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

    • OS SKU: [Ubuntu Linux] を選択します。

    • 可用性ゾーン: [なし] を選択します。

    • [Azure スポット インスタンスを有効にする] チェック ボックスはオフのままにします。

    • ノード サイズ: [サイズの選択] を選択します。 [VM サイズの選択] ページで、[D2s_v3] を選択した後、[選択] を選択します。

    • 残りの設定は既定値のままにして、[追加] を選択します。

      Ubuntu Linux を実行するノード プールを作成する方法を示すスクリーンショット。

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

    AKS クラスターの作成には数分かかります。 デプロイが完了したら、[リソースに移動] を選択するか、AKS クラスター リソース グループを参照して AKS リソースを選択することで、リソースに移動します。

クラスターに接続する

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

Cloud Shell を使っている場合は、Azure portal の上部にある >_ ボタンを使って開きます。 PowerShell をローカルで使っている場合は、Connect-AzAccount コマンドを使って Azure に接続します。 Azure CLI をローカルで使っている場合は、az login コマンドを使って 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 のデプロイとサービスが含まれています。

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

  • ネットショップ: 顧客が製品を見て注文するための 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 マニフェスト」を参照してください。

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

  3. 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 サービスの [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 アドレスにアクセスします。

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

クラスターを削除する

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

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

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

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

    Note

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

次のステップ

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

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