GKE Standard クラスタで Autopilot ワークロードを実行する

クラスタ管理者とアプリケーション オペレーターは、Standard モードのクラスタで、Google Kubernetes Engine(GKE)Autopilot のメリット(料金や事前構成された設定など)を利用できます。このページでは、ComputeClasses を使用して Standard クラスタに Autopilot ワークロードをデプロイする方法について説明します。次のコンセプトに精通している必要があります。

Autopilot ComputeClass について

GKE は、他の Kubernetes リソースと同様にクラスタにデプロイできる ComputeClasses という名前の Kubernetes カスタム リソースを提供します。ComputeClass は、マシンタイプや Spot VM などのノード構成のリストを定義します。ワークロードで ComputeClass を選択すると、新しいノードがリスト内の構成のいずれかを使用するように GKE に指示されます。

ワークロードが autopilot フィールドが有効になっている ComputeClass を選択すると、GKE は Pod を Autopilot モードで実行します。GKE が作成するノードは Google によって管理され、デフォルトの Autopilot 機能とセキュリティ設定の多くが含まれています。Standard クラスタで Autopilot ワークロードを実行する場合の影響(ワークロードのデプロイ時に発生する可能性のある違いなど)については、GKE Standard での Autopilot モードのワークロードについてをご覧ください。

Autopilot ComputeClass のタイプ

GKE には、ほとんどの汎用ワークロードで使用できる組み込みの Autopilot ComputeClass が用意されています。Autopilot モードを使用するように、新しいカスタム ComputeClass または既存のカスタム ComputeClass を構成することもできます。使用する Autopilot ComputeClass のタイプは、ワークロードに特定のハードウェアが必要かどうかによって次のように異なります。

  • 汎用ワークロード: 組み込みの Autopilot ComputeClass のいずれかを使用します。これにより、Pod がコンテナ最適化コンピューティング プラットフォームに配置されます。
  • 特定のハードウェアを必要とするワークロード: カスタム ComputeClass の Autopilot モードを有効にし、その ComputeClass をクラスタにデプロイして、ワークロードでその ComputeClass を選択します。

これらのオプション、使用するタイミング、各オプションの料金の詳細については、Autopilot ComputeClasses でのハードウェアの選択をご覧ください。

料金

GKE Autopilot の料金は、Autopilot ComputeClass を使用するワークロードとノードに適用されます。適用される料金モデルは、組み込みの Autopilot ComputeClass を使用するか、カスタムの Autopilot ComputeClass を使用するかによって異なります。詳細については、「GKE Standard での Autopilot モードのワークロードについて」の料金をご覧ください。

始める前に

作業を始める前に、次のタスクが完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。
  • バージョン 1.33.1-gke.1107000 以降を実行し、Rapid リリース チャンネルに登録されている GKE Standard クラスタを使用します。新しいクラスタを作成するには、リージョン クラスタの作成をご覧ください。
  • ワークロードが拒否されないように、Autopilot の要件とセキュリティ制約について学習します。詳細については、Autopilot ノードの事前定義された設定をご覧ください。

要件

  • クラスタ内の少なくとも 1 つのノードプールにノード taint がない必要があります。

    このノードプールは、GKE がノードに追加する taint が原因で Standard クラスタの Autopilot ノードで実行できない GKE Standard システム Pod を実行するために必要です。

  • シールドされた GKE ノードは必須で、デフォルトで有効になっています。

  • VPC ネイティブ クラスタを使用する必要があります。

制限事項

  • Rapid リリース チャンネルのみがサポートされています。
  • クラスタ内の既存の ComputeClass リソースを更新して Autopilot モードを使用するには、更新された仕様で ComputeClass を再作成する必要があります。詳細については、既存のカスタム ComputeClass で Autopilot を有効にするをご覧ください。
  • 独自の ComputeClass で podFamily 優先度ルールを使用することはできません。このルールは、組み込みの Autopilot ComputeClass でのみ使用できます。
  • 組み込みの Autopilot ComputeClass では、クラスタ全体で Confidential GKE Node を有効にすることはできません。クラスタで Confidential GKE Node を有効にすると、組み込みの Autopilot ComputeClass を選択する新しい Pod は、Pending 状態のままになります。

必要なロールと権限

ComputeClass をデプロイするために必要な権限を取得するには、クラスタまたはプロジェクトに対する Kubernetes Engine デベロッパー roles/container.developer)IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

ワークロードで Autopilot ComputeClass を選択する

ワークロードで Autopilot ComputeClass を選択するには、cloud.google.com/compute-class ラベルのノードセレクタを使用します。これは、GKE で他の ComputeClass を選択するために使用するラベルと同じです。次の手順では、ComputeClass を選択する Deployment の例を作成し、Pod が Autopilot モードで実行されていることを確認する方法を示します。

  1. 次の Deployment の例を autopilot-cc-deployment.yaml として保存します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: helloweb
      labels:
        app: hello
    spec:
      selector:
        matchLabels:
          app: hello
      template:
        metadata:
          labels:
            app: hello
        spec:
          nodeSelector:
            # Replace with the name of a compute class
            cloud.google.com/compute-class: COMPUTE_CLASS 
          containers:
          - name: hello-app
            image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
            ports:
            - containerPort: 8080
            resources:
              requests:
                cpu: "250m"
                memory: "4Gi"

    COMPUTE_CLASS は、使用するコンピューティング クラスの名前に置き換えます。この値は、次のいずれかになります。

  2. ワークロードをデプロイします。

    kubectl apply -f autopilot-cc-deployment.yaml
    
  3. Pod が Autopilot を使用していることを確認するには、ホストノードの名前を確認します。

    kubectl get pods -l=app=hello -o wide
    

    出力は次のようになります。

    NAME                       READY   STATUS    RESTARTS   AGE     IP             NODE                                         NOMINATED NODE   READINESS GATES
    helloweb-79b9f6f75-5wwc9   1/1     Running   0          152m    10.102.1.135   gk3-cluster-1-nap-10abc8ya1-f66c6cef-wg5g   <none>           <none>
    helloweb-79b9f6f75-9skb9   1/1     Running   0          4d3h    10.102.0.140   gk3-cluster-1-nap-10abc8ya1-632bac02-hjl6   <none>           <none>
    helloweb-79b9f6f75-h7bdv   1/1     Running   0          152m    10.102.1.137   gk3-cluster-1-nap-10abc8ya1-f66c6cef-wg5g   <none>           <none>
    

    この出力では、[ノード] 列の gk3- 接頭辞は、ノードが Autopilot によって管理されていることを示します。

カスタム Autopilot ComputeClass を構成する

Autopilot を使用するようにカスタム ComputeClass を構成できます。ワークロードで GPU や特定の Compute Engine マシンシリーズなど、最適な実行に特定のハードウェアが必要な場合は、カスタム Autopilot ComputeClass を使用します。

ワークロードに特定のハードウェアが必要ない場合は、組み込みの Autopilot ComputeClass のいずれかを使用することをおすすめします。組み込みの Autopilot ComputeClass を選択するには、前のワークロードで Autopilot ComputeClass を選択するセクションをご覧ください。

新しいカスタム Autopilot ComputeClass を作成する

  1. 次の ComputeClass マニフェストの例を autopilot-n2-class.yaml として保存します。

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: autopilot-n2-class
    spec:
      autopilot:
        enabled: true
      priorities:
      - machineFamily: n2
        spot: true
        minCores: 64
      - machineFamily: n2
        spot: true
      - machineFamily: n2
        spot: false
      activeMigration:
        optimizeRulePriority: true
      whenUnsatisfiable: DoNotScaleUp
    

    このマニフェストには次のフィールドがあります。

    • autopilot: ComputeClass の Autopilot モードを有効にします。Autopilot クラスタにデプロイする ComputeClass でこのフィールドを指定すると、GKE はこのフィールドを無視します。
    • priorities: 3 つの異なる N2 マシン ファミリー構成の配列を定義します。
    • activeMigration: リソースが使用可能になったときに、GKE が Pod を優先度の高い構成に移行できるようにします。
    • whenUnsatisfiable: このフィールドの DoNotScaleUp の値により、GKE は新しいノードに priorities フィールドのルールのいずれかを必ず使用します。これらの優先度ルールのいずれも満たされない場合、GKE はリソースが使用可能になるまで Pod を Pending 状態のままにします。DoNotScaleUp は、このフィールドのデフォルト値であり、推奨値です。
  2. ComputeClass をデプロイします。

    kubectl apply -f autopilot-n2-class.yaml
    
  3. ComputeClass が存在することを確認します。

    kubectl get computeclasses
    

    出力は次のようになります。

    NAME                  AGE
    autopilot-n2-class    3s
    

既存のカスタム ComputeClass で Autopilot を有効にする

Standard クラスタにあり、仕様の nodePoolAutoCreation.enabled フィールドが true に設定されている既存のカスタム ComputeClass で Autopilot を有効にできます。Autopilot クラスタ内のコンピューティング クラスで Autopilot を有効にしても、クラスタ全体で Autopilot モードが使用されるため、効果はありません。

既存の ComputeClass で Autopilot を有効にすると、GKE は Autopilot を使用して、ComputeClass を選択する新しい Pod を実行します。Autopilot ComputeClass を選択する Standard ノードに既存の Pod がある場合、これらの Pod は再作成された場合にのみ Autopilot を使用します。

既存のカスタム ComputeClass を更新して Autopilot モードを使用するには、次の操作を行います。

  1. テキスト エディタで、既存の ComputeClass のマニフェスト ファイルを更新して、spec.autopilot フィールドを追加します。

    spec:
      autopilot:
        enabled: true
    
  2. Kubernetes API の既存の ComputeClass リソースを更新された仕様に置き換えます。

    kubectl replace --force -f PATH_TO_UPDATED_MANIFEST
    

    PATH_TO_UPDATED_MANIFEST は、更新されたマニフェスト ファイルのパスに置き換えます。

  3. 新しいノードの作成をトリガーするには、コンピューティング クラスを使用するワークロードを再作成します。

更新されたマニフェストを適用すると、GKE がこの ComputeClass 用に作成する新しいノードはすべて Autopilot を使用します。GKE は、更新前に作成された既存のノードを変更しません。

ワークロードで Autopilot が使用されていることを確認する

  • kubectl get コマンドを使用して、クラスタ内の Pod のリストを取得します。

    kubectl get pods --output=custom-columns=Pod:.metadata.name,Node:.spec.nodeName
    

    出力は次のようになります。

    Pod                         Node
    helloweb-84c865764b-nzhxt   gk3-cluster-1-pool-3-68fc8dca-t54b
    # lines omitted for clarity
    

    ノード名の gk3- 接頭辞は、Pod が Autopilot モードで実行されていることを示します。

デフォルトで Autopilot ComputeClass を適用する

GKE では、ComputeClass を Namespace のデフォルトとして設定できます。Namespace のデフォルト クラスは、別の ComputeClass を明示的に選択していないその Namespace 内のすべての Pod に適用されます。Autopilot ComputeClass をデフォルトとして設定すると、ワークロードが別のオプションを選択しない限り、Namespace 内のすべての Pod をデフォルトで Autopilot モードで実行できます。

詳細については、Namespace のデフォルトの ComputeClass を構成するをご覧ください。

次のステップ