演習 - Azure Kubernetes Service クラスターでアプリケーションをデプロイする

完了

この演習では、会社の Web サイトをテスト アプリとして Azure Kubernetes Service (AKS) にデプロイします。 この Web サイトは、HTML、CSS、JavaScript の基になるテクノロジ スタックを使用する静的 Web サイトです。 これは、他のサービスと同じ数の要求を受信することはなく、デプロイ オプションを安全にテストする方法を提供します。

注意

ソース コードをさらに調べる必要がある場合は、この GitHub リポジトリで Web アプリのコードを入手できます。 また、このサンプル アプリは Linux ノード プールにのみデプロイされます。

重要

この演習を行うには、独自の Azure サブスクリプションが必要です。また、料金が発生することがあります。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

配置マニフェストを作成する

アプリケーションをデプロイするには配置マニフェスト ファイルを作成します。 マニフェスト ファイルを使用すると、デプロイするリソースの種類と、ワークロードに関するすべての詳細を定義できます。

Kubernetes によって、インテリジェンスがないポッドという論理構造にコンテナーがグループ化されます。 デプロイにより、欠落しているインテリジェンスが追加されてアプリケーションが作成されます。 デプロイ ファイルを作成してみましょう。

  1. Azure Cloud Shell にサインインします。

  2. Cloud Shell で、統合エディターを使用して、deployment.yaml という Kubernetes デプロイ用のマニフェスト ファイルを作成します。

    touch deployment.yaml
    
  3. code .」と入力して、Cloud Shell で統合エディターを開きます。

  4. deployment.yaml ファイルを開き、YAML の次のコード セクションを追加します。

    # deployment.yaml
    apiVersion: apps/v1 # The API resource where this workload resides
    kind: Deployment # The kind of workload we're creating
    metadata:
      name: contoso-website # This will be the name of the deployment
    

    このコードでは、作成するマニフェストの apiVersionkind を Kubernetes に指示するために、最初の 2 つのキーを追加しました。 name は、デプロイの名前です。 これは、kubectl を使用してデプロイの情報の識別やクエリを行うときに使用します。

    ヒント

    apiVersion およびこのキーに配置する値の詳細については、公式の Kubernetes に関するドキュメントを参照してください。 リンクは、このモジュールの最後にあります。

  5. デプロイにより、ポッドがラップされます。 テンプレート定義を利用して、マニフェスト ファイル内でポッド情報を定義します。 テンプレートは、マニフェスト ファイルのデプロイ仕様セクションの下に配置されます。

    次の YAML と一致するように deployment.yaml ファイルを更新します。

    # deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: contoso-website
    spec:
      template: # This is the template of the pod inside the deployment
        metadata: # Metadata for the pod
          labels:
            app: contoso-website
    

    ポッドでは、デプロイと同じ名前は使用されません。 ポッドの名前は、末尾にランダムな ID が追加されたデプロイの名前の組み合わせです。

    labels キーの使用に注目してください。 labels キーを追加すると、デプロイでポッドを見つけてグループ化できるようになります。

  6. ポッドにより、1 つまたは複数のコンテナーがラップされます。 すべてのポッドに、そのポッド内のコンテナーを定義できる仕様セクションがあります。

    次の YAML と一致するように deployment.yaml ファイルを更新します。

    # deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: contoso-website
    spec:
      template: # This is the template of the pod inside the deployment
        metadata:
          labels:
            app: contoso-website
        spec:
          containers: # Here we define all containers
            - name: contoso-website
    

    containers キーはコンテナー仕様の配列です。これは、ポッドに 1 つまたは複数のコンテナーを含めることができるためです。 仕様により、コンテナーに関する imagenameresourcesports、その他の重要な情報が定義されます。

    実行中のすべてのポッドの名前は contoso-website-<UUID> に従っています。ここで UUID は、すべてのリソースを一意に識別するために生成される ID です。

  7. アプリでクラスターから使用できるリソースの最小量と最大量を定義することをお勧めします。 この情報を指定するには、resources キーを使用します。

    次の YAML と一致するように deployment.yaml ファイルを更新します。

    # deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: contoso-website
    spec:
      template: # This is the template of the pod inside the deployment
        metadata:
          labels:
            app: contoso-website
        spec:
          containers:
            - image: mcr.microsoft.com/mslearn/samples/contoso-website
              name: contoso-website
              resources:
                requests: # Minimum amount of resources requested
                  cpu: 100m
                  memory: 128Mi
                limits: # Maximum amount of resources requested
                  cpu: 250m
                  memory: 256Mi
    

    リソース セクションで、要求として最小リソース量、制限として最大リソース量をどのように指定できるかに注目してください。

  8. 最後の手順では、このコンテナーにより、ports キーを介して外部に公開されるポートを定義します。 ports キーはオブジェクトの配列です。これは、ポッド内のコンテナーにより、複数の名前を持つ複数のポートを公開できることを意味します。

    次の YAML と一致するように deployment.yaml ファイルを更新します。

    # deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: contoso-website
    spec:
      template: # This is the template of the pod inside the deployment
        metadata:
          labels:
            app: contoso-website
        spec:
          nodeSelector:
            kubernetes.io/os: linux
          containers:
            - image: mcr.microsoft.com/mslearn/samples/contoso-website
              name: contoso-website
              resources:
                requests:
                  cpu: 100m
                  memory: 128Mi
                limits:
                  cpu: 250m
                  memory: 256Mi
              ports:
                - containerPort: 80 # This container exposes port 80
                  name: http # We named that port "http" so we can refer to it later
    

    name キーを使用して、ポートにどのように名前を付けるかに注目してください。 名前付けポートを使用すると、そのポートを参照するファイルを変更することなく、公開されているポートを変更できます。

  9. 最後に、セレクター セクションを追加して、デプロイによって管理されるワークロードを定義します。 selector キーは、マニフェスト ファイルのデプロイ仕様セクション内に配置されます。 matchLabels キーを使用して、デプロイによって管理されるすべてのポッドのラベルを一覧表示します。

    次の YAML と一致するように deployment.yaml ファイルを更新します。

    # deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: contoso-website
    spec:
      selector: # Define the wrapping strategy
        matchLabels: # Match all pods with the defined labels
          app: contoso-website # Labels follow the `name: value` template
      template: # This is the template of the pod inside the deployment
        metadata:
          labels:
            app: contoso-website
        spec:
          nodeSelector:
            kubernetes.io/os: linux
          containers:
            - image: mcr.microsoft.com/mslearn/samples/contoso-website
              name: contoso-website
              resources:
                requests:
                  cpu: 100m
                  memory: 128Mi
                limits:
                  cpu: 250m
                  memory: 256Mi
              ports:
                - containerPort: 80
                  name: http
    

    注意

    複数のノード プール (Linux と Windows) を含む AKS クラスターでは、上記の配置マニフェスト ファイルに、Linux コンテナーを実行できるノードでサンプル アプリケーションのポッドを実行するように AKS クラスターに指示する nodeSelector も定義されています。

    Linux ノードでは Windows コンテナーを実行できず、その逆も同様です。

  10. マニフェスト ファイルを保存して、エディターを閉じます。

マニフェストを適用する

  1. Cloud Shell で kubectl apply コマンドを実行して、配置マニフェストをクラスターに送信します。

    kubectl apply -f ./deployment.yaml
    

    コマンドにより、次の例のような結果が出力されるはずです。

    deployment.apps/contoso-website created
    
  2. kubectl get deploy コマンドを実行して、デプロイが成功したかどうかを確認します。

    kubectl get deploy contoso-website
    

    コマンドにより、次の例のようなテーブルが出力されるはずです。

    NAME              READY   UP-TO-DATE   AVAILABLE   AGE
    contoso-website   0/1     1            0           16s
    
  3. kubectl get pods コマンドを実行して、ポッドが実行されているかどうかを確認します。

    kubectl get pods
    

    コマンドにより、次の例のようなテーブルが出力されるはずです。

    NAME                               READY   STATUS    RESTARTS   AGE
    contoso-website-7c58c5f699-r79mv   1/1     Running   0          63s