GKE Pod を特定のゾーンに配置する


このページでは、ゾーントポロジを使用して、特定の Trusted Cloud by S3NS ゾーンのノードで Pod を実行するように Google Kubernetes Engine(GKE)に指示する方法について説明します。このタイプの配置は、次のような状況で役立ちます。

  • Pod がゾーンの Compute Engine 永続ディスクに保存されているデータにアクセスする必要がある場合。
  • Pod が Cloud SQL インスタンスなどの他のゾーンリソースとともに実行する必要がある場合。

また、ゾーンへの配置とトポロジ対応のトラフィック ルーティングを使用して、クライアントとワークロード間のレイテンシを短縮することもできます。トポロジ対応のトラフィック ルーティングの詳細については、トポロジ対応ルーティングをご覧ください。

ゾーントポロジを使用して Pod の配置を制御する方法は、Pod を特定のゾーンで実行する必要がある場合にのみ使用する高度な Kubernetes メカニズムです。ほとんどの本番環境では、GKE のデフォルトであるリージョン リソースを使用することをおすすめします。

ゾーンへの配置方法

ゾーントポロジは、topology.kubernetes.io/zone: ZONE ノードラベルを使用して Kubernetes に組み込まれます。Pod を特定のゾーンに配置するように GKE に指示するには、次のいずれかの方法を使用します。

  • nodeAffinity: Pod 仕様で 1 つ以上の Trusted Cloud ゾーンの nodeAffinity ルールを指定します。この方法は、Pod を複数のゾーンに配置できるため、nodeSelector よりも柔軟性があります。
  • nodeSelector: 単一の Trusted Cloud ゾーンの Pod 仕様で nodeSelector を指定します。

  • コンピューティング クラス: GKE コンピューティング クラスを使用するように Pod を構成します。このアプローチでは、 Trusted Cloud ゾーンのセットの優先順位付きリストを定義できます。これにより、ゾーンでノードが使用可能になると、ワークロードをゾーンの最も望ましいセットに動的に移動できます。詳細については、カスタム コンピューティング クラスについてをご覧ください。

考慮事項

ゾーントポロジを使用してゾーンに Pod を配置する場合は、次の点を考慮してください。

  • クラスタは、リクエストされたゾーンと同じ Trusted Cloud リージョンにある必要があります。
  • Standard クラスタの場合、ノード自動プロビジョニングを使用するか、リクエストされたゾーンにノードがあるようにノードプールを作成する必要があります。Autopilot クラスタの場合、このプロセスは自動的に管理されます。
  • Standard クラスタは、リージョン クラスタである必要があります。

料金

ゾーントポロジは Kubernetes のスケジューリング機能であり、GKE では追加料金なしで提供されます。

料金の詳細については、GKE の料金をご覧ください。

始める前に

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

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。
  • 既存の GKE クラスタが、Pod を配置するゾーンと同じTrusted Cloud リージョンにあることを確認します。新しいクラスタを作成するには、Autopilot クラスタの作成をご覧ください。

nodeAffinity を使用して Pod を複数のゾーンに配置する

Kubernetes nodeAffinity は、複数のラベルセレクタと論理演算子をサポートする柔軟なスケジューリング制御メカニズムです。一連のゾーンのいずれか(たとえば、us-central1-a または us-central1-f)で Pod を実行させる場合は、nodeAffinity を使用します。

  1. 次のマニフェストを multi-zone-affinity.yaml として保存します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx-multi-zone
      template:
        metadata:
          labels:
            app: nginx-multi-zone
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: topology.kubernetes.io/zone
                    operator: In
                    values:
                    - us-central1-a
                    - us-central1-f
    

    このマニフェストは、3 つのレプリカを持つ Deployment を作成し、ノードの可用性に応じて Pod を us-central1-a または us-central1-f に配置します。

    クラスタが us-central1 リージョンにあることを確認します。クラスタが別のリージョンにある場合は、マニフェストの値フィールドのゾーンをクラスタ リージョン内の有効なゾーンに変更します。

  2. Deployment を作成します。

    kubectl create -f multi-zone-affinity.yaml
    

    GKE は、指定されたゾーンのいずれかにあるノードに Pod を作成します。同じノードで複数の Pod が実行されることもあります。必要に応じて、Pod のアンチアフィニティを使用して、各 Pod を個別のノードに配置するように GKE に指示できます。

nodeSelector を使用して Pod を単一ゾーンに配置する

Pod を単一ゾーンに配置するには、Pod 仕様で nodeSelector を使用します。nodeSelector は、単一ゾーンが指定された requiredDuringSchedulingIgnoredDuringExecution nodeAffinity ルールと同等です。

  1. 次のマニフェストを single-zone-selector.yaml として保存します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-singlezone
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx-singlezone
      template:
        metadata:
          labels:
            app: nginx-singlezone
        spec:
          nodeSelector:
            topology.kubernetes.io/zone: "us-central1-a"
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
    

    このマニフェストは、すべてのレプリカを us-central1-a ゾーンの Deployment に配置するように GKE に指示します。

  2. Deployment を作成します。

    kubectl create -f single-zone-selector.yaml
    

コンピューティング クラスを使用して、選択したゾーンでの Pod の配置に優先順位をつける

GKE コンピューティング クラスは、ノード構成の優先順位のリストを定義できる制御メカニズムを提供します。ゾーンの優先度を使用すると、GKE で Pod を配置するゾーンを定義できます。コンピューティング クラスでゾーン設定を定義するには、GKE バージョン 1.33.1-gke.1545000 以降が必要です。

次の例では、Pod に望ましいゾーンのリストを指定するコンピューティング クラスを作成します。

これらの手順では、クラスタが us-central1 リージョンにあることを前提としています。クラスタが別のリージョンにある場合は、マニフェストのゾーンの値をクラスタ リージョン内の有効なゾーンに変更します。

  1. 次のマニフェストを zones-custom-compute-class.yaml として保存します。

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: zones-custom-compute-class
    spec:
      priorities:
      - location:
        zones: [us-central1-a, us-central1-b]
      - location:
        zones: [us-central1-c]
      activeMigration:
        optimizeRulePriority: true
      nodePoolAutoCreation:
        enabled: true
      whenUnsatisfiable: ScaleUpAnyway
    

    このコンピューティング クラスのマニフェストは、次のようにスケーリング動作を変更します。

    1. GKE は、Pod を us-central1-a または us-central1-b に配置しようとします。
    2. us-central1-aus-central1-b に使用可能な容量がない場合、GKE は Pod を us-central1-c に配置しようとします。
    3. us-central1-c に使用可能な容量がない場合、whenUnsatisfiable: ScaleUpAnyway フィールドにより、GKE は Pod をリージョン内の使用可能なゾーンに配置します。
    4. コンピューティング クラスで優先順位の高いゾーンが後で使用可能になると、activeMigration.optimizeRulePriority: true フィールドにより、GKE は優先順位の低いゾーンからそのゾーンに Pod を移動します。この移行では、Pod Disruption Budget を使用してサービスの可用性を確保します。
  2. カスタム コンピューティング クラスを作成します。

    kubectl create -f zones-custom-compute-class.yaml
    

    GKE は、ワークロードが参照できるカスタム コンピューティング クラスを作成します。

  3. 次のマニフェストを custom-compute-class-deployment.yaml として保存します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-zonal-preferences
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx-zonal-preferences
      template:
        metadata:
          labels:
            app: nginx-zonal-preferences
        spec:
          nodeSelector:
            cloud.google.com/compute-class: "zones-custom-compute-class"
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
    
  4. Deployment を作成します。

    kubectl create -f custom-compute-class-deployment.yaml
    

Pod の配置を確認する

Pod の配置を確認するには、Pod を一覧表示してノードラベルを確認します。nodeAffinity を使用した場合は、1 つのノードで複数の Pod が実行される可能性があるため、Pod が複数のゾーンに分散されない可能性があります。

  1. Pod を一覧表示します。

    kubectl get pods -o wide
    

    実行中の Pod とそれに対応する GKE ノードのリストが表示されます。

  2. ノードの説明を取得します。

    kubectl describe node NODE_NAME | grep "topology.kubernetes.io/zone"
    

    NODE_NAME は、ノードの名前で置き換えます。

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

    topology.kubernetes.io/zone: us-central1-a
    

GKE で Pod を複数のゾーンに均等に分散させて、複数の障害発生ドメインでのフェイルオーバーを改善する場合は、topologySpreadConstraints を使用します。

次のステップ