このトピックでは、複数のアベイラビリティ ゾーン (AZ) で実行される新しいTanzu Kubernetes Grid (TKG) ワークロード クラスタをデプロイする方法、および複数または異なる AZ で実行するように既存の管理クラスタとワークロード クラスタを変更する方法について説明します。
インストーラ インターフェイスを使用して、複数の AZ にまたがって実行する新しいスタンドアローン管理クラスタを構成するには、「インストーラ インターフェイスを使用した管理クラスタの展開」の「vSphere リソースの構成」を参照してください。
注このトピックは、スタンドアローン管理クラスタを使用する TKG に適用されます。複数のアベイラビリティ ゾーンにまたがるスーパーバイザーを使用して TKG を実行する場合は、vSphere 8.0 ドキュメントの「マルチゾーン スーパーバイザー デプロイ用の vSphere Zones の作成」を参照してください。
Kubernetes オブジェクト:vSphere 上のクラスタで複数のアベイラビリティ ゾーンを有効にするために、クラスタ API プロバイダ vSphere (CAPV) は 2 つのカスタム リソース定義 (CRD) を使用します。
VSphereFailureDomain
CRD は、リージョン/ゾーン固有のタグ付け情報と、vSphere データセンター、クラスタ、ホスト、データストアの情報を含むトポロジ定義をキャプチャします。VSphereDeploymentZone
CRD は、VSphereFailureDomain
と Kubernetes ノードの配置制約情報との関連付けをキャプチャします。Kubernetes と vSphere の関連付け:VSphereFailureDomain
および VSphereDeploymentZone
オブジェクト定義では、次の設定を使用してリージョンと AZ を定義します。
spec.region
spec.zone
vSphere タグ k8s-region
および k8s-zone
は、Kubernetes のリージョンと AZ を vSphere の基盤となるオブジェクトに関連付けます。
AZ 範囲:次のように、VSPHERE オブジェクトに関連付けることで、vSphere のさまざまなレベルで AZ とリージョンの範囲を設定できます。
AZ スコープ | ゾーン/AZ | リージョン | マルチ AZ の使用 |
---|---|---|---|
クラスタ AZ | vSphere クラスタ | vSphere データセンター | データセンター内の複数のクラスタにノードを分散 |
ホスト グループの AZ | ホスト グループのvSphere | vSphere クラスタ | 単一クラスタ内の複数のホストにノードを分散 |
このトピックの構成では、オブジェクトが vSphere でどのようにタグ付けされ、Kubernetes の VSphereFailureDomain
定義と VSphereDeploymentZone
定義でどのように参照されるかに基づいて、TKG クラスタ制御プレーンとワーカー ノードを vSphere オブジェクト(vSphere データセンター、クラスタ、およびホスト)に分散します。
Cluster
オブジェクト構成:Cluster
オブジェクト仕様では、制御プレーンノードとワーカー ノードの AZ をさまざまな方法で構成し、AZ を定義する VSphereDeploymentZone
オブジェクトのさまざまなプロパティと照合します。
ノード タイプ | spec.topology のプロパティ |
VSphereDeploymentZone プロパティを照合するには |
例 |
---|---|---|---|
制御プレーン ノード | variables.controlPlaneZoneMatchingLabels |
metadata.labels ペアのリスト |
{"environment": "staging", "region": "room1"} |
ワーカー ノード | machineDeployments.MD-INDEX.failureDomain (マシン展開ごと) |
metadata.name 値のリスト |
[rack1,rack2,rack3] |
制御プレーン ノードはラベル一致に基づいて AZ に割り当てられるため、クラスタ制御プレーン ノードが使用する可能性のある AZ の各組み合わせを区別するラベルを作成する必要があります。
複数の AZ または異なる AZ で実行するように TKG クラスタを展開または変更するための前提条件は次のとおりです。
ワークロード クラスタを展開して、次のセクションで説明するように、3 つの基本的な手順で制御プレーンまたはワーカー ノードを複数のアベイラビリティ ゾーン (AZ) で実行できます。
TKG でリージョンと AZ をサポートするための vSphere を準備するには、次の手順を実行します。
TKG クラスタ ノードがホストされるリージョンと AZ のvSphere オブジェクトを特定または作成します。
ホスト グループの AZ (Host group AZs):vSphere ホスト グループを AZ として使用している場合は、使用する AZ ごとに 1 つのホスト グループと対応する仮想マシン グループを作成する必要があります
次のいずれかの方法で、ホスト グループおよび仮想マシン グループ オブジェクトを作成します。
[vCenter Server] で、[構成 (Configure)] > [仮想マシン/ホスト グループ (VM/Host Groups)] > [追加 (Add)]… からホスト グループと仮想マシン グループを作成します
govc
CLI を使用して、次のような govc
コマンドを実行します。たとえば、ホスト グループ rack1
および仮想マシン グループ rack1-vm-group
を作成します。
govc cluster.group.create -cluster=RegionA01-MGMT -name=rack1 -host esx-01a.corp.tanzu esx-02a.corp.tanzu
govc cluster.group.create -cluster=RegionA01-MGMT -name=rack1-vm-group -vm
作成された仮想マシン グループとホスト グループの間にアフィニティ ルールを追加して、必ず作成されたホスト グループ内のホストで仮想マシン グループ内の仮想マシンが実行されるようにします。
クラスタ AZ またはホスト グループ AZ のどちらを構成しているかに応じて、vSphere オブジェクトvSphereタグ付けします。次の例では、govc
CLI を使用しますが、vCenter Server の タグ & カスタム属性 ペインを使用することもできます。
クラスタ AZ:
AZ ごとに、govc
を使用して k8s-region
カテゴリ タグを作成してデータセンターに適用し、k8s-zone
カテゴリ タグを作成して各 vSphere クラスタに適用します。たとえば、データセンター dc0
をリージョン us-west-1
としてタグ付けし、そのクラスタ cluster1
などを AZ us-west-1a
などとしてタグ付けするには、次のようにします。
govc tags.category.create -t Datacenter k8s-region
govc tags.category.create -t ClusterComputeResource k8s-zone
govc tags.create -c k8s-region us-west-1
govc tags.create -c k8s-zone us-west-1a
govc tags.create -c k8s-zone us-west-1b
govc tags.create -c k8s-zone us-west-1c
govc tags.attach -c k8s-region us-west-1 /dc0
govc tags.attach -c k8s-zone us-west-1a /dc0/host/cluster1
govc tags.attach -c k8s-zone us-west-1b /dc0/host/cluster2
govc tags.attach -c k8s-zone us-west-1c /dc0/host/cluster3
ホスト グループの AZ (Host group AZs):
AZ ごとに、govc
を使用して k8s-region
カテゴリ タグを作成して vSphere クラスタに適用し、k8s-zone
カテゴリ タグを作成して各ホスト グループに適用します。たとえば、クラスタ /dc1/host/room1-mgmt
をリージョン room1
としてタグ付けし、そのホスト グループ /dc1/host/room1-mgmt/esx-01a.corp.tanzu
などを AZ rack1
などとしてタグ付けするには、次のようにします。
govc tags.category.create -t ClusterComputeResource k8s-region
govc tags.category.create -t HostSystem k8s-zone
govc tags.create -c k8s-region room1
govc tags.create -c k8s-zone rack1
govc tags.create -c k8s-zone rack2
govc tags.create -c k8s-zone rack3
govc tags.attach -c k8s-region room1 /dc1/host/room1-mgmt
govc tags.attach -c k8s-zone rack1 /dc1/host/room1-mgmt/esx-01a.corp.tanzu
govc tags.attach -c k8s-zone rack1 /dc1/host/room1-mgmt/esx-01b.corp.tanzu
govc tags.attach -c k8s-zone rack1 /dc1/host/room1-mgmt/esx-01c.corp.tanzu
FailureDomain
および Deployment Zone
オブジェクトの作成クラスタを複数のアベイラビリティ ゾーンに展開する前に、リージョンとゾーンを定義する Kubernetes オブジェクトFailureDomain
および Deployment Zone
を作成する必要があります。spec.region
、spec.zone
、および spec.topology
のすべての設定が vCenter Server で構成されたオブジェクト パスおよびタグと一致する必要があります。
VSphereDeploymentZone
オブジェクトの場合、spec.failuredomain
の値は、VSphereFailureDomain
定義の metadata.name
値のいずれかと一致する必要があります。VSphereDeploymentZone
オブジェクトの spec.server
値は、インストーラ インターフェイスの [IaaS プロバイダ (IaaS Provider)] ペインの [VCENTER SERVER] に対して、または管理クラスタ構成ファイルの VSPHERE_SERVER
設定に対して入力された vCenter Server アドレス(IP アドレスまたは FQDN)と一致する必要があります。metadata.name
値はすべて小文字にする必要があります。vSphere クラスタ AZ またはホスト グループ AZ のどちらを構成しているかに応じて、次のように FailureDomain
および Deployment Zone
オブジェクトを作成します。
クラスタ AZ:
データセンター内の複数の vSphere クラスタ ノードにワークロード クラスタを分散する方法の例として、次のコードは、us-west-1a
us-west-1b
および us-west-1c
という 3 つの展開ゾーンに必要なオブジェクトを定義します。これらはそれぞれ独自のネットワークおよびストレージ パラメータを持つ vSphere クラスタです。
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereFailureDomain
metadata:
name: us-west-1a
spec:
region:
name: us-west-1
type: Datacenter
tagCategory: k8s-region
zone:
name: us-west-1a
type: ComputeCluster
tagCategory: k8s-zone
topology:
datacenter: dc0
computeCluster: cluster1
datastore: ds-c1
networks:
- net1
- net2
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereFailureDomain
metadata:
name: us-west-1b
spec:
region:
name: us-west-1
type: Datacenter
tagCategory: k8s-region
zone:
name: us-west-1b
type: ComputeCluster
tagCategory: k8s-zone
topology:
datacenter: dc0
computeCluster: cluster2
datastore: ds-c2
networks:
- net3
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereFailureDomain
metadata:
name: us-west-1c
spec:
region:
name: us-west-1
type: Datacenter
tagCategory: k8s-region
zone:
name: us-west-1c
type: ComputeCluster
tagCategory: k8s-zone
topology:
datacenter: dc0
computeCluster: cluster3
datastore: ds-c3
networks:
- net4
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereDeploymentZone
metadata:
name: us-west-1a
spec:
server: VSPHERE_SERVER
failureDomain: us-west-1a
placementConstraint:
resourcePool: pool1
folder: foo
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereDeploymentZone
metadata:
name: us-west-1b
spec:
server: VSPHERE_SERVER
failureDomain: us-west-1b
placementConstraint:
resourcePool: pool2
folder: bar
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereDeploymentZone
metadata:
name: us-west-1c
spec:
server: VSPHERE_SERVER
failureDomain: us-west-1c
placementConstraint:
resourcePool: pool3
folder: baz
ここで、VSPHERE_SERVER
は、vCenter Server の IP アドレスまたは FQDN です。
異なる vSphere クラスタに同じ名前のリソース プールがある場合は、VSphereDeploymentZone
オブジェクトの spec.placementConstraint.resourcePool
を単なる名前ではない完全なリソース パスに設定します。
ホスト グループの AZ (Host group AZs):
ワークロード クラスタ ノードを単一の vSphere クラスタ内の 3 つのホスト グループに分散する方法の例として、次のコードは、3 つの AZ (rack1
rackrack2
、および rack3
) に必要なオブジェクトを定義します。これらはそれぞれリージョン room1
として定義される同じ vSphere クラスタ内のホストのラックを表しています。
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereFailureDomain
metadata:
name: rack1
spec:
region:
name: room1
type: ComputeCluster
tagCategory: k8s-region
zone:
name: rack1
type: HostGroup
tagCategory: k8s-zone
topology:
datacenter: dc0
computeCluster: cluster1
hosts:
vmGroupName: rack1-vm-group
hostGroupName: rack1
datastore: ds-r1
networks:
- net1
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereFailureDomain
metadata:
name: rack2
spec:
region:
name: room1
type: ComputeCluster
tagCategory: k8s-region
zone:
name: rack2
type: HostGroup
tagCategory: k8s-zone
topology:
datacenter: dc0
computeCluster: cluster1
hosts:
vmGroupName: rack2-vm-group
hostGroupName: rack2
datastore: ds-r2
networks:
- net2
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereFailureDomain
metadata:
name: rack3
spec:
region:
name: room1
type: ComputeCluster
tagCategory: k8s-region
zone:
name: rack3
type: HostGroup
tagCategory: k8s-zone
topology:
datacenter: dc0
computeCluster: cluster1
hosts:
vmGroupName: rack3-vm-group
hostGroupName: rack3
datastore: ds-c3
networks:
- net3
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereDeploymentZone
metadata:
name: rack1
spec:
server: VSPHERE_SERVER
failureDomain: rack1
placementConstraint:
resourcePool: pool1
folder: foo
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereDeploymentZone
metadata:
name: rack2
spec:
server: VSPHERE_SERVER
failureDomain: rack2
placementConstraint:
resourcePool: pool2
folder: bar
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereDeploymentZone
metadata:
name: rack3
spec:
server: VSPHERE_SERVER
failureDomain: rack3
placementConstraint:
resourcePool: pool3
folder: baz
ここで、VSPHERE_SERVER
は、vCenter Server の IP アドレスまたは FQDN です。
クラスタを展開する次の手順については、「アベイラビリティ ゾーン全体に分散されたノードを含むワークロード クラスタの展開」を参照してください。
「vSphere でのリージョンおよび AZ の準備」および「Kubernetes での FailureDomain
および Deployment Zone
オブジェクトの作成」の手順を実行した後、ノードが複数の AZ に分散されたワークロード クラスタをデプロイできます。
次の手順では、vsphere-zones.yaml
を FailureDomain
および Deployment Zone
オブジェクト定義を含むファイルとして使用します。
「スタンドアローン管理クラスタを使用する vSphere の構成ファイル」の説明に従って、展開するワークロード クラスタのクラスタ構成ファイルを作成します。
「複数のアベイラビリティ ゾーンの構成」の説明に従ってクラスタ構成ファイルを確認または変更し、AZ オブジェクト定義に一致するように、VSPHERE_REGION
、VSPHERE_ZONE
、VSPHERE_AZ_0
、およびその他の構成変数を設定します。
(オプション)クラスタ作成プロセスで、構成で指定された vSphere ゾーンとリージョンがすべて存在し、一貫性があり、同じレベルで定義されていることを検証しないようにするには、ローカル環境で SKIP_MULTI_AZ_VERIFY
を "true"
に設定します。
export SKIP_MULTI_AZ_VERIFY="true"
クラスタ構成ファイルでこの変数を設定することはできません。
tanzu cluster create
を実行してワークロード クラスタを作成します。詳細については、「ワークロード クラスタの作成」を参照してください。
AZ オブジェクトをクラスタとは別に作成するには、tanzu login
で管理クラスタにログインし、次のコマンドを実行してから tanzu cluster create
を実行します。
tanzu mc az set -f vsphere-zones.yaml
または、kubectl apply -f vsphere-zones.yaml
を実行できます。
フラット クラスタ構成ファイルで AZ オブジェクト定義を使用し、AZ オブジェクトとクラスタ オブジェクトを一緒に作成するには、vsphere-zones.yaml
ファイルを tanzu cluster create
の --az-file
オプションに渡します。
tanzu mc create --file cluster-config-file.yaml --az-file vsphere-zones.yaml
AZ オブジェクト定義をクラスタ マニフェストに組み合わせるには、「クラスベースのクラスタを作成する」で説明されている 2 段階のプロセスの手順 1 に従って、クラスタ マニフェストを作成し、vsphere-zones.yaml
の内容をマニフェストに追加し、手順 2 の説明に従って tanzu cluster create
を実行します。
クラスタの作成プロセス中に、その仮想マシンとその他のリソースが vCenter Server に表示されます。
展開済みの管理クラスタまたはワークロード クラスタを更新して、制御プレーンまたはワーカー ノードを複数のアベイラビリティ ゾーン (AZ) で実行したり、ノードが実行されている AZ を変更したりすることができます。
AZ をクラスタの制御プレーンまたはワーカー ノード全体に割り当てたり、基盤となるマシン展開に対して AZ を設定したりして、マシン展開セットの AZ とともに vSphere マシン設定をカスタマイズできます。
既存のワークロード クラスタの AZ を更新したら、「AZ の変更に対する CPI と CSI の更新」の説明に従って、コンテナ ストレージ インターフェイス (CSI) とクラウド プロバイダ インターフェイス (CPI) を更新して変更を反映する必要があります。
次のセクションでは、さまざまなシナリオで既存のクラスタ AZ 構成を更新する方法について説明します。
制御プレーン ノードが単一の AZ で実行される既存のクラスタを拡張して、制御プレーンが複数の AZ で実行されるようにするには、次の手順を実行します。
新しい AZ ごとに VSphereFailureDomain
および VSphereDeploymentZone
オブジェクトを定義する構成ファイルを準備します。以下の例 vsphere-3-zones.yaml
では、リージョン room1
の AZ rack1
、rack2
および rack3
を定義します。
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind:VSphereFailureDomain
metadata:
name:rack
spec:
region:
name: room1
type: ComputeCluster
tagCategory: k8s-region
zone:
name:rack
type: HostGroup
tagCategory: k8s-zone
topology:
datacenter: dc0
computeCluster: cluster0
hosts:
vmGroupName:rack-vm-group
hostGroupName:rack
datastore: ds1
networks:
- "VM Network"
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind:VSphereFailureDomain
metadata:
name:rack
spec:
region:
name: room1
type: ComputeCluster
tagCategory: k8s-region
zone:
name: rack2
type: HostGroup
tagCategory: k8s-zone
topology:
datacenter: dc0
computeCluster: cluster0
hosts:
vmGroupName: rack2-vm-group
hostGroupName: rack2
datastore: ds2
networks:
- "VM Network"
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereFailureDomain
metadata:
name: rack3
spec:
region:
name: room1
type: ComputeCluster
tagCategory: k8s-region
zone:
name: rack3:
type: HostGroup
tagCategory: k8s-zone
topology:
datacenter: dc0
computeCluster: cluster0
hosts:
vmGroupName: rack3-vm-group
hostGroupName: rack3
datastore: ds3
networks:
- "VM Network"
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereDeploymentZone
metadata:
name: rack1
spec:
server: VSPHERE_SERVER
failureDomain: rack1
placementConstraint:
resourcePool: rp0
folder: folder0
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereDeploymentZone
metadata:
name: rack2
spec:
server: VSPHERE_SERVER
failureDomain: rack2
placementConstraint:
resourcePool: rp0
folder: folder0
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereDeploymentZone
metadata:
name: rack3
spec:
server: VSPHERE_SERVER
failureDomain: rack3
placementConstraint:
resourcePool: rp0
folder: folder0
ここで、VSPHERE_SERVER
は、vCenter Server の IP アドレスまたは FQDN です。
メモ:
VSphereDeploymentZone
で spec.placementConstraint.resourcePool
を設定する必要があります。クラスタにユーザーが作成したリソース プールがない場合は、値をクラスタのデフォルトのリソース プール(パスは /dc0/host/cluster1/Resources
)に設定します。VSphereFailureDomain
オブジェクトの場合、spec.region.autoConfigure
および spec.zone.autoConfigure
はサポートされなくなりました。vSphereFailureDomain
および VSphereDeploymentZone
オブジェクトを作成します。例:
tanzu mc az set -f vsphere-3-zones.yaml
ターゲット クラスタの KubeAdmControlPlane
を取得します。この例では、ターゲットは管理クラスタ tkg-mgmt-vc
ですが、ワークロード クラスタの場合もあります。
kubectl get kcp --selector cluster.x-k8s.io/cluster-name=tkg-mgmt-vc -n tkg-system -o=name
kubeadmcontrolplane.controlplane.cluster.x-k8s.io/tkg-mgmt-vc-cpkxj
クラスタ AZ セレクタを更新します。例:controlPlaneZoneMatchingLabels: {"environment": "staging", "region": "room1"}
:
kubectl get cluster tkg-mgmt-vc -n tkg-system -o json | jq '.spec.topology.variables |= map(if .name == "controlPlaneZoneMatchingLabels" then .value = {"environment": "staging", "region": "room1"} else . end)'| kubectl apply -f -
cluster.cluster.x-k8s.io/tkg-mgmt-vc replaced
クラスタの障害ドメインが想定どおりに更新されていることを確認します。
kubectl get cluster tkg-mgmt-vc -n tkg-system -o json | jq -r '.status.failureDomains | to_entries[].key'
KubeAdmControlPlane
に rolloutAfter
のパッチを適用して、制御プレーン ノードの更新をトリガします。
kubectl patch kcp tkg-mgmt-vc-cpkxj -n tkg-system --type merge -p "{\"spec\":{\"rolloutAfter\":\"$(date +'%Y-%m-%dT%TZ')\"}}"
vCenter Server でノードのホストとデータストアを確認するか、次のような kubectl get node
または govc vm.info
コマンドを実行して、制御プレーン ノードが新しい AZ に移動したことを確認します。
kubectl get node NODE-NAME -o=jsonpath='{.metadata.labels.node.cluster.x-k8s.io/esxi-host}' --context tkg-mgmt-vc-admin@tkg-mgmt-vc
govc vm.info -json NODE-NAME | jq -r '.VirtualMachines[].Config.Hardware.Device[] | select(.DeviceInfo.Label == "Hard disk 1") | .Backing.FileName'
セレクタ ラベルを使用して AZ を選択するということは、VSphereDeploymentZone
を、metadata.name
ではなく、metadata.labels
で指定することを意味します。これにより、たとえば、指定したリージョンおよび環境のすべての AZ で実行するようにクラスタの制御プレーン ノードを構成でき、AZ を個別に一覧表示する必要はありません。"region=us-west-1,environment=staging"
。また、制御プレーン ノードの AZ 名を変更しなくても、クラスタ制御プレーンの AZ を更新できます。
セレクタ ラベルを使用して、既存のクラスタの制御プレーン ノードの新しい AZ を指定するには、次の手順を実行します。
新しい AZ ごとに VSphereFailureDomain
および VSphereDeploymentZone
オブジェクトを定義する構成ファイルを準備します。以下の例 vsphere-labeled-zones.yaml
では、セレクタ ラベル メタデータを使用して AZ rack4
を定義します。
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereFailureDomain
metadata:
name: rack4
spec:
region:
name: room1
type: ComputeCluster
tagCategory: k8s-region
zone:
name: rack4
type: HostGroup
tagCategory: k8s-zone
topology:
datacenter: dc0
computeCluster: cluster0
hosts:
vmGroupName: rack4-vm-group
hostGroupName: rack4
datastore: vsanDatastore
networks:
- "VM Network"
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereDeploymentZone
metadata:
name: rack4
labels:
environment: staging
region: room1
spec:
server: VSPHERE_SERVER
failureDomain: rack4
placementConstraint:
resourcePool: rp0
folder: folder0
VSphereFailureDomain
および VSphereDeploymentZone
オブジェクトを作成します。例:
tanzu mc az set -f vsphere-labeled-zones.yaml
AZ セレクタ ラベルを使用してクラスタを更新します。この例では、管理クラスタ tkg-mgmt-vc
に対して AZ セレクタ controlPlaneZoneMatchingLabels: {"environment": "staging", "region": "room1"}
を使用していますが、ワークロード クラスタの場合もあります。
kubectl get cluster tkg-mgmt-vc -n tkg-system -o json | \
jq '.spec.topology.variables |= \
map(if .name == "controlPlaneZoneMatchingLabels" \
then .value = {"environment": "staging", "region": "room1"} \
else . end)'| kubectl apply -f -
cluster.cluster.x-k8s.io/tkg-mgmt-vc replaced
クラスタのステータスを確認して、障害ドメインが想定どおりに更新されていることを確認します。
kubectl get cluster tkg-mgmt-vc -n tkg-system -o json | jq -r '.status.failureDomains | to_entries[].key'
KubeAdmControlPlane
に rolloutAfter
のパッチを適用して、制御プレーン ノードの更新をトリガします。
kubectl patch kcp tkg-mgmt-vc-cpkxj -n tkg-system --type merge -p "{\"spec\":{\"rolloutAfter\":\"$(date +'%Y-%m-%dT%TZ')\"}}"
vCenter Server でノードのホストとデータストアを確認するか、次のような kubectl get node
または govc vm.info
コマンドを実行して、制御プレーン ノードが controlPlaneZoneMatchingLabels
のセレクタによって選択された新しい AZ に移動したことを確認します。この例では、新しい AZ は rack4
です。
kubectl get node NODE-NAME -o=jsonpath='{.metadata.labels.node.cluster.x-k8s.io/esxi-host}' --context tkg-mgmt-vc-admin@tkg-mgmt-vc
govc vm.info -json NODE-NAME | jq -r '.VirtualMachines[].Config.Hardware.Device[] | select(.DeviceInfo.Label == "Hard disk 1") | .Backing.FileName'
既存のクラスタ内の AZ 構成を変更するには、そのノードの基盤となる MachineDeployment
構成に新しい AZ 値のパッチを適用します。
たとえば、クラスタ構成ファイルで VSPHERE_AZ_0
を rack1
に設定し、そのワーカー ノードを rack2
に移動する場合は、次の手順を実行します。
クラスタに使用されている現在の AZ をクエリします。この例では、ワークロード クラスタ tkg-wc
を使用しますが、管理クラスタにすることもできます。
kubectl get cluster tkg-wc -o json \| jq -r '.spec.topology.workers.machineDeployments\[0\].failureDomain'
使用可能なすべての AZ を一覧表示します。
kubectl get vspheredeploymentzones -o=jsonpath='{range .items[?(@.status.ready == true)]}{.metadata.name}{"\n"}{end}'
rack1
rack2
tkg-wc
クラスタの spec.toplogy.workers.machineDeployments
構成にパッチを適用し、そのゾーン VSphereFailureDomain
を rack2
に設定します。この例では、tkg-wc
が単一ノードの dev
プラン クラスタであると想定しています。prod
プラン クラスタの場合は、クラスタ内の 3 つの MachineDeployment
オブジェクト構成すべてにパッチを適用する必要があります。
kubectl patch cluster tkg-wc --type=json -p='[{"op": "replace", "path": "/spec/topology/workers/machineDeployments/0/failureDomain", "value": "rack2"}]'
cluster.cluster.x-k8s.io/tkg-wc patched
クラスタが VSphereFailureDomain
rack2
で更新されていることを確認します。
kubectl get cluster tkg-wc -o=jsonpath='{.spec.topology.workers.machineDeployments[?(@.name=="md-0")].failureDomain}'
rack2
ワーカー ノードが VSphereFailureDomain
rack2
に展開されていることを確認します。
TKG クラスタで使用する新しい AZ を構成して既存のクラスタで使用するには、次の手順を実行します。
新しい AZ ごとに VSphereFailureDomain
および VSphereDeploymentZone
オブジェクトを定義する構成ファイルを準備します。上記の「制御プレーン ノードの AZ の追加」の vsphere-3-zones.yaml
の例を使用して、リージョン room1
の AZ rack1
、rack2
および rack3
を定義します。
VSphereFailureDomain
および VSphereDeploymentZone
オブジェクトを作成します。
tanzu mc az set -f vsphere-3-zones.yaml
または、kubectl apply -f vsphere-3-zones.yaml
を実行できます。
クラスタ tkg-wc
に VSphereFailureDomain
rack1
、rack2
および rack3
のパッチを適用します。この例では、tkg-wc
は、3 つの MachineDeployment
構成を持つ prod
プランのクラスタ プランです。dev
プラン クラスタでは、クラスタの spec.toplogy.workers.machineDeployments
で 1 つの MachineDeployment
のみを更新する必要があります。
kubectl patch cluster tkg-wc --type=json -p='[ \
{"op": "replace", "path": "/spec/topology/workers/machineDeployments/0/failureDomain", "value": "rack1"}, \
{"op": "replace", "path": "/spec/topology/workers/machineDeployments/1/failureDomain", "value": "rack2"}, \
{"op": "replace", "path": "/spec/topology/workers/machineDeployments/2/failureDomain", "value": "rack3"}]'
クラスタが新しい AZ を使用して更新されていることを確認します。
kubectl get cluster tkg-wc -o=jsonpath='{range .spec.topology.workers.machineDeployments[*]}{"Name: "}{.name}{"\tFailure Domain: "}{.failureDomain}{"\n"}{end}'
ワーカー ノードが VSphereFailureDomain
rack1
、rack2
および rack3
に展開されていることを確認します。
TKG クラスタで使用する新しい AZ と新しい MachineDeployment
オブジェクトの両方を構成して既存のクラスタで使用するには、次の手順を実行します。
新しい AZ ごとに VSphereFailureDomain
および VSphereDeploymentZone
オブジェクトを定義する構成ファイルを準備します。以下の例 vsphere-1-zone.yaml
では、リージョン room1
の新しい AZ rack2
を定義します。
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereFailureDomain
metadata:
name: rack2
spec:
region:
name: room1
type: ComputeCluster
tagCategory: k8s-region
zone:
name: rack2
type: HostGroup
tagCategory: k8s-zone
topology:
datacenter: dc0
computeCluster: cluster0
hosts:
vmGroupName: rack2-vm-grou
hostGroupName: rack2
datastore: ds-r2
networks:
- "VM Network"
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: VSphereDeploymentZone
metadata:
name: rack2
spec:
server: VSPHERE_SERVER
failureDomain: rack2
placementConstraint:
resourcePool: rp0
folder: folder0
VSphereFailureDomain
および VSphereDeploymentZone
オブジェクトを作成します。
tanzu mc az set -f vsphere-zones.yaml
または、kubectl apply -f vsphere-1-zone.yaml
を実行できます。
新しいマシン展開の構成ファイルを準備します。以下の例 md-1.yaml
では、az
プロパティが rack2
に設定された新しいマシン展開 md-1
を定義します。
name: md-1
replicas: 1
az: rack2
nodeMachineType: t3.large
workerClass: tkg-worker
tkrResolver: os-name=ubuntu,os-arch=amd64
Tanzu CLI を使用して新しいノード プールを作成します。この例では、ワークロード クラスタ tkg-wc
を使用しますが、管理クラスタにすることもできます。
tanzu cluster node-pool set wl-antrea -f md-1.yaml
Cluster update for node pool 'md-1' completed successfully
新しく作成されたノード プール内のマシン展開名を取得します。
kubectl get machinedeployments -l
topology.cluster.x-k8s.io/deployment-name=md-1
-o=jsonpath='{.items[*].metadata.name}'
wl-antrea-md-1-pd9vj
マシン展開が VSphereFailureDomain
rack2
で更新されていることを確認します。
kubectl get machinedeployments wl-antrea-md-1-pd9vj -o json | \
jq -r '.spec.template.spec.failureDomain'
rack2
md-1
のワーカー ノードが rack2
に展開されていることを確認します。
上記のセクションの説明に従ってワークロード クラスタの AZ 構成を変更した後、CPI および CSI アドオン構成を更新し、変更を反映するようにアドオンを再作成する必要があります。以下の手順では、これを行う方法を説明します。
制限事項:
VsphereFailureDomain
のさまざまなリージョンおよびゾーンのすべての tagCategory
設定が一致する必要があります。クラスタの CPI アドオン構成を更新して AZ の変更を反映し、対応するパッケージ インストーラを削除して、変更を含むアドオンを再作成するには、次の手順を実行します。
cb
リファレンスを使用して、クラスタの vsphereCPIConfig
の名前を取得します。たとえば、wl
という名前のワークロード クラスタの場合は次のようになります。
kubectl -n default get cb wl -o json \| jq -r '.spec.cpi.valuesFrom.providerRef.name'
クラスタの vsphereCPIConfig
仕様を編集して、その region
と zone
を、vSphere および vsphereFailuredomain
仕様で AZ のリージョンとゾーンに設定した tagCategory
フィールドに設定します。例:
apiVersion: cpi.tanzu.vmware.com/v1alpha1
kind: VSphereCPIConfig
metadata:
name: wl
namespace: default
spec:
vsphereCPI:
mode: vsphereCPI
region: k8s-zone
tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
vmNetwork:
excludeExternalSubnetCidr: 10.215.10.79/32
excludeInternalSubnetCidr: 10.215.10.79/32
zone: k8s-zone
変更を適用し、Reconcile succeeded
を待機します。
CPI パッケージ インストーラ (pkgi
) が再インストールされていることを確認します。
kubectl -n tkg-system get wl-vsphere-cpi pkgi --context wl-admin@wl
クラスタの CSI アドオン構成を更新して AZ の変更を反映し、csinodetopology
および対応するパッケージ インストーラを削除して、変更を含むアドオンを再作成するには、次の手順を実行します。
cb
リファレンスを使用して、クラスタの vsphereCPIConfig
の名前を取得します。たとえば、wl
という名前のワークロード クラスタの場合は次のようになります。
kubectl -n default get cb wl -o json |jq -r '.spec.csi.valuesFrom.providerRef.name')
クラスタの vsphereCSIConfig
仕様を編集して、その region
と zone
を、vSphere および vsphereFailuredomain
仕様で AZ のリージョンとゾーンに設定した tagCategory
フィールドに設定します。例:
apiVersion: csi.tanzu.vmware.com/v1alpha1
kind: VSphereCSIConfig
metadata:
name: wl
namespace: default
spec:
vsphereCSI:
config:
datacenter: /dc0
httpProxy: ""
httpsProxy: ""
insecureFlag: true
noProxy: ""
region: k8s-region
tlsThumbprint: ""
useTopologyCategories: true
zone: k8s-zone
mode: vsphereCSI
変更を適用します。
csinode
および csiNodeTopology
オブジェクトを削除して、再作成します。csinodetopology
は自動的に更新されません。
kubectl -n delete csinode --all --context wl-admin@wl
kubectl -n delete csinodetopology --all --context wl-admin@wl
クラスタの vsphere-csi
パッケージ インストーラを削除し、Reconcile succeeded
を待機します。
kubectl delete pkgi -n tkg-system wl-vsphere-csi --context wl-admin@wl
次のように、すべての csinodes
オブジェクトに topologyKeys
パラメータが含まれることを確認します。
kubectl get csinodes -o jsonpath='{range .items[*]}{.metadata.name} {.spec}{"\n"}{end}'
k8s-control-1 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-control-1","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
k8s-control-2 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-control-2","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
k8s-control-3 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-control-3","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
k8s-node-1 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-1","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
k8s-node-2 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-2","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
k8s-node-3 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-3","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
k8s-node-4 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-4","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
k8s-node-5 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-5","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
k8s-node-6 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-6","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
次のように、すべてのノードのトポロジ ラベルに正しい AZ リージョンとゾーンが反映されていることを確認します。
kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
k8s-control-1 Ready control-plane 1d v1.21.1 topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-A
k8s-control-2 Ready control-plane 1d v1.21.1 topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-B
k8s-control-3 Ready control-plane 1d v1.21.1 topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-C
k8s-node-1 Ready <none> 1d v1.21.1 topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-A
k8s-node-2 Ready <none> 1d v1.21.1 topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-B
k8s-node-3 Ready <none> 1d v1.21.1 topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-B
k8s-node-4 Ready <none> 1d v1.21.1 topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-C
k8s-node-5 Ready <none> 1d v1.21.1 topology.csi.vmware.com/k8s-region=region-2,topology.csi.vmware.com/k8s-zone=zone-D
k8s-node-6 Ready <none> 1d v1.21.1 topology.csi.vmware.com/k8s-region=region-2,topology.csi.vmware.com/k8s-zone=zone-D
tanzu mc az list
コマンドを使用して、スタンドアローン管理クラスタで定義されているか、ワークロード クラスタによって使用されている AZ を一覧表示します。
管理クラスタとそのワークロード クラスタで現在使用されているアベイラビリティ ゾーンを一覧表示するには、次のコマンドを実行します。
tanzu management-cluster available-zone list
管理クラスタで定義され、ワークロード クラスタ ノードで使用可能なすべてのアベイラビリティ ゾーンを一覧表示するには、次の手順を実行します。
tanzu management-cluster available-zone list -a
ワークロード クラスタ CLUSTER-NAME
によって現在使用されているアベイラビリティ ゾーンに対して:
tanzu management-cluster available-zone list -c CLUSTER-NAME:
tanzu mc az
コマンドは、tanzu management-cluster available-zone
からエイリアス化されています。
出力例:
AZNAME ZONENAME ZONETYPE REGIONNAME REGIONTYPE DATASTORE NETWORK OWNERCLUSTER STATUS
us-west-1a us-west-1a ComputeCluster us-west-1 Datacenter sharedVmfs-0 VM Network az-1 ready
us-west-1b us-west-1b ComputeCluster us-west-1 Datacenter sharedVmfs-0 VM Network az-1 ready
us-west-1c us-west-1c ComputeCluster us-west-1 Datacenter sharedVmfs-0 VM Network az-1 ready
出力により次が表示されます。
AZNAME
、ZONENAME
:AZ の名前ZONETYPE
:AZ (ComputeCluster
または HostGroup
)の範囲の vSphere オブジェクト タイプREGIONNAME
:AZ を含んでいるリージョンの名前REGIONTYPE
:リージョン(Datacenter
または ComputeCluster
)の範囲の vSphere オブジェクト タイプDATASTORE
:リージョン内の仮想マシンをホストするデータストアNETWORK
:リージョン内の仮想マシンにサービスを提供するネットワークOWNERCLUSTER
:AZ で実行される 1 つ以上の TKG クラスタSTATUS
:現在の AZ ステータスtanzu mc az
コマンド グループは、tanzu management-cluster available-zone
からエイリアス化されています。
tanzu mc az delete
コマンドを使用して、次のように使用されていない AZ を削除します。
tanzu mc az delete AZNAME
ここで、AZNAME
は、tanzu mc az list
で一覧表示される AZ の名前です。
tanzu mc az list
で AZ のOWNERCLUSTER
が一覧表示されないことが示されているように、AZ を削除できるのは、AZ が現在 TKG クラスタ ノードをホストしていない場合のみです。