このページでは、ゾーントポロジを使用して、特定の 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 を使用します。
次のマニフェストを
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
リージョンにあることを確認します。クラスタが別のリージョンにある場合は、マニフェストの値フィールドのゾーンをクラスタ リージョン内の有効なゾーンに変更します。Deployment を作成します。
kubectl create -f multi-zone-affinity.yaml
GKE は、指定されたゾーンのいずれかにあるノードに Pod を作成します。同じノードで複数の Pod が実行されることもあります。必要に応じて、Pod のアンチアフィニティを使用して、各 Pod を個別のノードに配置するように GKE に指示できます。
nodeSelector を使用して Pod を単一ゾーンに配置する
Pod を単一ゾーンに配置するには、Pod 仕様で nodeSelector を使用します。nodeSelector は、単一ゾーンが指定された requiredDuringSchedulingIgnoredDuringExecution
nodeAffinity ルールと同等です。
次のマニフェストを
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 に指示します。Deployment を作成します。
kubectl create -f single-zone-selector.yaml
コンピューティング クラスを使用して、選択したゾーンでの Pod の配置に優先順位をつける
GKE コンピューティング クラスは、ノード構成の優先順位のリストを定義できる制御メカニズムを提供します。ゾーンの優先度を使用すると、GKE で Pod を配置するゾーンを定義できます。コンピューティング クラスでゾーン設定を定義するには、GKE バージョン 1.33.1-gke.1545000 以降が必要です。
次の例では、Pod に望ましいゾーンのリストを指定するコンピューティング クラスを作成します。
これらの手順では、クラスタが us-central1
リージョンにあることを前提としています。クラスタが別のリージョンにある場合は、マニフェストのゾーンの値をクラスタ リージョン内の有効なゾーンに変更します。
次のマニフェストを
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
このコンピューティング クラスのマニフェストは、次のようにスケーリング動作を変更します。
- GKE は、Pod を
us-central1-a
またはus-central1-b
に配置しようとします。 us-central1-a
とus-central1-b
に使用可能な容量がない場合、GKE は Pod をus-central1-c
に配置しようとします。us-central1-c
に使用可能な容量がない場合、whenUnsatisfiable: ScaleUpAnyway
フィールドにより、GKE は Pod をリージョン内の使用可能なゾーンに配置します。- コンピューティング クラスで優先順位の高いゾーンが後で使用可能になると、
activeMigration.optimizeRulePriority: true
フィールドにより、GKE は優先順位の低いゾーンからそのゾーンに Pod を移動します。この移行では、Pod Disruption Budget を使用してサービスの可用性を確保します。
- GKE は、Pod を
カスタム コンピューティング クラスを作成します。
kubectl create -f zones-custom-compute-class.yaml
GKE は、ワークロードが参照できるカスタム コンピューティング クラスを作成します。
次のマニフェストを
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
Deployment を作成します。
kubectl create -f custom-compute-class-deployment.yaml
Pod の配置を確認する
Pod の配置を確認するには、Pod を一覧表示してノードラベルを確認します。nodeAffinity を使用した場合は、1 つのノードで複数の Pod が実行される可能性があるため、Pod が複数のゾーンに分散されない可能性があります。
Pod を一覧表示します。
kubectl get pods -o wide
実行中の Pod とそれに対応する GKE ノードのリストが表示されます。
ノードの説明を取得します。
kubectl describe node NODE_NAME | grep "topology.kubernetes.io/zone"
NODE_NAME
は、ノードの名前で置き換えます。出力は次のようになります。
topology.kubernetes.io/zone: us-central1-a
GKE で Pod を複数のゾーンに均等に分散させて、複数の障害発生ドメインでのフェイルオーバーを改善する場合は、topologySpreadConstraints を使用します。