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


このページでは、ゾーントポロジを使用して、特定の Google Cloud ゾーンのノードで 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 つ以上の Google Cloud ゾーンの nodeAffinity ルールを指定します。この方法は、Pod を複数のゾーンに配置できるため、nodeSelector よりも柔軟性があります。
  • nodeSelector: 単一の Google Cloud ゾーンの Pod 仕様で nodeSelector を指定します。

考慮事項

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

  • クラスタは、リクエストされたゾーンと同じ Google 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 を配置するゾーンと同じ Google 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 の配置を確認する

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 を使用します。

次のステップ