このページでは、ゾーントポロジを使用して、特定の 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 を使用します。
次のマニフェストを
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 の配置を確認する
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 を使用します。