このトピックでは、パーシステント ボリュームとストレージ クラスを使用して、Tanzu Kubernetes Grid (TKG) ワークロード クラスタに動的ストレージを実装する方法について説明します。
Kubernetes クラスタ内で、PersistentVolume (PV) オブジェクトは、ポッドのライフサイクルの影響を受けない共有ストレージをクラスタ ポッドに対して提供します。ストレージは、PersistentVolumeClaim (PVC) オブジェクトを介して PV にプロビジョニングされます。このオブジェクトは、ポッドが基盤となるストレージにアクセスできる容量と方法を定義します。詳細については、Kubernetes ドキュメントの「パーシステント ボリューム」を参照してください。
クラスタ管理者は、StorageClass オブジェクトを定義して、クラスタ ユーザーがさまざまなストレージ タイプとルールで PVC および PV オブジェクトを動的に作成できるようにします。Tanzu Kubernetes Grid には、ユーザーによるターンキー環境でのパーシステント ストレージのプロビジョニングを可能にする、デフォルトの StorageClass オブジェクトも用意されています。
StorageClass オブジェクトには、PV をプロビジョニングする内部または外部サービス プラグインを識別する provisioner フィールドと、Kubernetes ストレージ クラスをインフラストラクチャ レベルで定義されたストレージ オプション(vSphere の仮想マシン ストレージ ポリシーなど)に関連付ける parameters フィールドが含まれます。詳細については、Kubernetes ドキュメントの「ストレージ クラス」を参照してください。
Tanzu Kubernetes Grid は、Kubernetes 内部(「ツリー内」)または外部(「ツリー外」)プラグインによってプロビジョニングされる、さまざまなストレージ タイプの StorageClass オブジェクトをサポートします。
ストレージ タイプ
注vSphere CSI はストレージ DRS をサポートしていませんが、vSphere CSI ドキュメントの「vSphere コンテナ ストレージ プラグインでサポートされる vSphere 機能」で説明されている条件を備えた Storage vMotion をサポートしています。
vSphere CSI は条件付きで Storage vMotion をサポートします。詳細については、CSI ドキュメントを参照してください。
vSphere CNS、Amazon EBS、Azure Disk のデフォルト ストレージ クラスについては、「デフォルト ストレージ クラス」を参照してください。
外部プロビジョニング
TKG v2.1 では、すべてのデフォルト ストレージ クラスが「ツリー内」プロビジョニングではなく、外部(「ツリー外」)ストレージ プロビジョニングを使用します。
StorageClass オブジェクトの provisioner 値に、kubernetes.io はプリフィックスとして付加されません。Tanzu Kubernetes Grid にはデフォルトの StorageClass オブジェクトが用意されています。これにより、ワークロード クラスタ ユーザーは、クラスタ管理者によって作成された StorageClass オブジェクトを必要とせずに、ターンキー環境のインフラストラクチャでパーシステント ストレージをプロビジョニングできます。
ENABLE_DEFAULT_STORAGE_CLASS 変数は、tanzu cluster create の --file オプションに渡されるクラスタ構成ファイル内でデフォルトで true に設定されています。これにより、ワークロード クラスタのデフォルト ストレージ クラスが有効です。
重要デフォルトのストレージ クラス定義は変更しないでください。ストレージ クラスをカスタマイズするには、TKG によって作成されたデフォルト オブジェクトを変更する代わりに
nameを使用して新しいStorageClass定義を作成します。
Tanzu Kubernetes Grid のデフォルトのストレージ クラス定義は次のとおりです。
vSphere CNS
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: default
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: csi.vsphere.vmware.com
parameters:
storagePolicyName: optional
Kubernetes ドキュメントの vSphere CSI ストレージ クラス パラメータを参照してください。
Amazon EBS
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: default
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.aws.com
AWS ドキュメントの Amazon EBS CSI ドライバ ストレージ クラス パラメータを参照してください。
Azure Disk
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
name: default
annotations:
storageclass.beta.kubernetes.io/is-default-class: "true"
labels:
kubernetes.io/cluster-service: "true"
provisioner: disk.csi.azure.com
parameters:
kind: Managed
storageaccounttype: Standard_LRS
cachingmode: ReadOnly
volumeBindingMode: WaitForFirstConsumer
Azure ドキュメントの Azure Disk CSI ドライバ ストレージ クラス パラメータを参照してください。
Azure File
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: azure-file
labels:
kubernetes.io/cluster-service: "true"
provisioner: file.csi.azure.com
mountOptions:
- dir_mode=0777
- file_mode=0777
- uid=0
- gid=0
- mfsymlinks
- cache=strict
- actimeo=30
allowVolumeExpansion: true
parameters:
skuName: Premium_LRS
Kubernetes ドキュメントの Azure File ストレージ クラス パラメータを参照してください。
vSphere 管理者は、vSphere CNS を設定し、Tanzu Kubernetes Grid クラスタ ユーザーのニーズに基づいて仮想ディスク (VMDK) ストレージのストレージ ポリシーを作成できます。
Kubernetes クラスタのパーシステント ストレージには、次のように vSAN またはローカルの VMFS(仮想マシン ファイル システム)を使用できます。
vSAN ストレージ:
vSphere Client で vSAN ストレージのストレージ ポリシーを作成するには、[ホーム (Home)] > [ポリシーおよびプロファイル (Policies and Profiles)] > [仮想マシン ストレージ ポリシー (VM Storage Policies)] に移動し、[作成 (Create)] をクリックして [仮想マシン ストレージ ポリシーの作成 (Create VM Storage Policy)] ウィザードを起動します。
vSphere ドキュメントの「ストレージ ポリシーの作成」の手順に従います。次の手順を必ず実行します。
StorageClass オブジェクトの storagePolicyName 値としてストレージ ポリシー名を記録します。ローカル VMFS ストレージ:
ローカル ストレージのストレージ ポリシーを作成するには、ストレージにタグを適用し、そのタグに基づいて次のようにストレージ ポリシーを作成します。
トップレベルの vSphere メニューから、[タグとカスタム属性 (Tags & Custom Attributes)] を選択します。
[タグ (Tags)] ペインで [カテゴリ (Categories)] を選択し、[新規 (New)] をクリックします。
カテゴリ名(tkg-storage など)を入力します。チェックボックスを使用して、[データセンター (Datacenter)] およびストレージ オブジェクト([フォルダ (Folder)] および [データストア (Datastore)])に関連付けます。[作成 (Create)] をクリックします。
トップレベルの [ストレージ (Storage)] ビューで VMFS ボリュームを選択し、その [サマリ (Summary)] ペインで [タグ (Tags)] > [割り当て (Assign)]… をクリックします。
[タグの割り当て (Assign Tag)] ポップアップで、[タグの追加 (Add Tag)] をクリックします。
[タグの作成 (Create Tag)] ポップアップで、tkg-storage-ds1 などの名前をタグに付けて、作成した [カテゴリ (Category)] に割り当てます。[OK] をクリックします。
[タグの割り当て (Assign Tag)] で、タグを選択し、[割り当て (Assign)] をクリックします。
トップレベルの vSphere から、[仮想マシン ストレージ ポリシー (VM Storage Policies)] > [ストレージ ポリシーの作成 (Create a Storage Policy)] を選択します。構成ウィザードが起動します。
[名前と説明 (Name and description)] ペインで、ストレージ ポリシーの名前を入力します。参照のために、StorageClass オブジェクトの storagePolicyName 値としてストレージ ポリシー名を記録します。
[ポリシー構造 (Policy structure)] ペインの [データストア固有のルール (Datastore specific rules)] で、[タグベースの配置ルールを有効化 (Enable tag-based placement rules)] を選択します。
[タグ ベースの配置 (Tag based placement)] ペインで、[タグ ルールの追加 (Add Tag Rule)] をクリックし、次の構成を行います。
Use storage tagged with他のペインを確認して構成するか、必要に応じてデフォルト値を受け入れ、[確認して完了 (Review and finish)] >[終了 (Finish)] をクリックしてストレージ ポリシーを作成します。
クラスタ管理者は、次のように新しいストレージ クラスを作成できます。
StorageClass の基盤として使用する仮想マシン ストレージ ポリシーを選択または作成します。
provisioner、parameters、およびその他のオプションを指定して、StorageClass 構成の .yaml を作成します。
storagePolicyName パラメータを二重引用符で囲んだ文字列の vSphere ストレージ ポリシー名に設定して、Kubernetes ストレージ クラスを vSphere ストレージ ポリシーに関連付けます。kubectl create -f にファイルを渡します。kubectl describe storageclass <storageclass metadata.name> を実行してストレージ クラスを確認します。例については、Kubernetes ドキュメントの「動的プロビジョニングの有効化」を参照してください。
vSphere CSI の情報とリソースについては、VMware vSphere Container Storage Plug-in のドキュメントを参照してください。
前述の「デフォルトのストレージ クラス」の 1 つを使用しないクラスタ ノードにパーシステント ストレージをプロビジョニングするには、次のように、クラスタ ユーザーがポッド構成にカスタム ストレージ クラスを含めます。
kubectl のコンテキストをクラスタに設定します。例:
kubectl config use-context my-cluster-admin@my-cluster
ストレージ クラスを選択または作成します。
kubectl get storageclass を実行します。PVC とその PV を作成します。
PersistentVolumeClaim 構成の .yaml を、StorageClass オブジェクトの metadata.name 値に設定した spec.storageClassName で作成します。例については、Kubernetes ドキュメントの「動的プロビジョニングの有効化」を参照してください。kubectl create -f にファイルを渡します。kubectl describe pvc <pvc metadata.name> を実行して PVC を確認します。kubectl describe pvc 出力の Successfully provisioned volume の後に一覧表示されている名前を記録します。kubectl describe pv <pv unique name> を実行して PV を確認します。PVC を使用するポッドを作成します。
persistentVolumeClaim.claimName 以下の PVC を spec.volumes に含めるように設定する、Pod 構成の .yaml を作成します。例については、vSphere Container Storage Plug-in ドキュメントの「vSphere Container Storage Plug-in を使用したブロック ボリュームの動的なプロビジョニング」を参照してください。kubectl create -f にファイルを渡します。kubectl get pod <pod metadata.name> を実行してポッドを確認します。ワークロード クラスタで使用される vSphere CSI ストレージのボリューム拡張を有効にするには、csi-resizer サイドカー ポッドをクラスタの CSI プロセスに追加する必要があります。
ワークロード クラスタの CSI 構成は、Kubernetes シークレットとしてエンコードされます。この手順では、CSI 構成シークレットを修正して csi-resizer プロセスを追加します。このシークレットには、2 つのエンコードされた構成データ文字列(シークレットの以前の CSI 構成データを含む values.yaml 文字列、および csi-resizer ポッドを展開する新しい overlays.yaml 文字列)を組み合わせた stringData 定義が追加されます。
注オンライン ボリューム拡張は、vSphere 7.0 Update 2 以降でサポートされています。詳細については、「vSphere with Tanzu でのボリュームの拡張」を参照してください。
変更するワークロード クラスタの管理クラスタにログインし、ワークロード クラスタの名前を取得する必要がある場合は tanzu cluster list を実行します。
ラベル セレクタ vsphere-csi とクラスタ名を使用して、ワークロード クラスタの CSI シークレットの名前を取得します。
$ kubectl get secret \
-l tkg.tanzu.vmware.com/cluster-name=NAME_OF_WORKLOAD_CLUSTER \
-l tkg.tanzu.vmware.com/addon-name=vsphere-csi
my-wc-vsphere-csi-secret
シークレットのコンテンツのバックアップを次のように YAML 形式で vsphere-csi-secret.yaml に保存します。
kubectl get secret my-wc-vsphere-csi-secret -o yaml > vsphere-csi-secret.yaml
シークレットの現在のコンテンツを、data.values 値を base64 デコードして、プレーン YAML に出力します。
$ kubectl get secret my-wc-vsphere-csi-secret -o jsonpath={.data.values\\.yaml} | base64 -d
#@data/values
#@overlay/match-child-defaults missing_ok=True
---
vsphereCSI:
CSIAttacherImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-attacher
tag: v3.0.0_vmware.1
pullPolicy: IfNotPresent
vsphereCSIControllerImage:
repository: projects.registry.vmware.com/tkg
path: csi/vsphere-block-csi-driver
tag: v2.1.1_vmware.1
pullPolicy: IfNotPresent
livenessProbeImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-livenessprobe
tag: v2.1.1_vmware.1
pullPolicy: IfNotPresent
vsphereSyncerImage:
repository: projects.registry.vmware.com/tkg
path: csi/volume-metadata-syncer
tag: v2.1.1_vmware.1
pullPolicy: IfNotPresent
CSIProvisionerImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-provisioner
tag: v2.0.0_vmware.1
pullPolicy: IfNotPresent
CSINodeDriverRegistrarImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-node-driver-registrar
tag: v2.0.1_vmware.1
pullPolicy: IfNotPresent
namespace: kube-system
clusterName: wc-1
server: 10.170.104.114
datacenter: /dc0
publicNetwork: VM Network
username: <MY-VSPHERE-USERNAME>
password: <MY-VSPHERE-PASSWORD>
エディタで vsphere-csi-secret.yaml を開き、次の手順を実行して、以下のコードのようになるようにします。
values.yaml の既存の定義を削除します。stringData を定義する行を追加し、values.yaml をインデントして最初の要素にします。data.values 出力をコピーします。data.values の出力を貼り付けて、それを values.yaml の値としてインデントします。values.yaml の定義のすぐ下に、次に示すように、overlays.yaml に別の stringData 定義を追加します。ファイル内の他の定義は変更しないでください。apiVersion: v1
stringData:
values.yaml: |
#@data/values
#@overlay/match-child-defaults missing_ok=True
---
vsphereCSI:
CSIAttacherImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-attacher
tag: v3.0.0_vmware.1
pullPolicy: IfNotPresent
vsphereCSIControllerImage:
repository: projects.registry.vmware.com/tkg
path: csi/vsphere-block-csi-driver
tag: v2.1.1_vmware.1
pullPolicy: IfNotPresent
livenessProbeImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-livenessprobe
tag: v2.1.1_vmware.1
pullPolicy: IfNotPresent
vsphereSyncerImage:
repository: projects.registry.vmware.com/tkg
path: csi/volume-metadata-syncer
tag: v2.1.1_vmware.1
pullPolicy: IfNotPresent
CSIProvisionerImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-provisioner
tag: v2.0.0_vmware.1
pullPolicy: IfNotPresent
CSINodeDriverRegistrarImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-node-driver-registrar
tag: v2.0.1_vmware.1
pullPolicy: IfNotPresent
namespace: kube-system
clusterName: wc-1
server: 10.170.104.114
datacenter: /dc0
publicNetwork: VM Network
username: <MY-VSPHERE-USERNAME>
password: <MY-VSPHERE-PASSWORD>
overlays.yaml: |
#@ load("@ytt:overlay", "overlay")
#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "vsphere-csi-controller"}})
---
spec:
template:
spec:
containers:
#@overlay/append
- name: csi-resizer
image: projects.registry.vmware.com/tkg/kubernetes-csi_external-resizer:v1.0.0_vmware.1
args:
- "--v=4"
- "--timeout=300s"
- "--csi-address=$(ADDRESS)"
- "--leader-election"
env:
- name: ADDRESS
value: /csi/csi.sock
volumeMounts:
- mountPath: /csi
name: socket-dir
kind: Secret
...
kubectl apply を実行して、修正された定義でクラスタのシークレットを更新し、csi-controller ポッドを再作成します。
kubectl apply -f vsphere-csi-secret.yaml
vsphere-csi-controller および外部リサイズ機能がクラスタで動作していることを確認するには、次の手順を実行します。
vsphere-csi-controller が 6 つの健全なポッドがあるワークロード クラスタで実行されていることを確認します。
$ kubectl get pods -n kube-system -l app=vsphere-csi-controller
NAME READY STATUS RESTARTS AGE
vsphere-csi-controller-<ID-HASH> 6/6 Running 0 6m49s
vsphere-csi-controller のログを確認して、外部リサイズ機能が開始したことを確認します。
$ kubectl logs vsphere-csi-controller-<ID-HASH> -n kube-system -c csi-resizer
I0308 23:44:45.035254 1 main.go:79] Version : v1.0.0-0-gb22717d
I0308 23:44:45.037856 1 connection.go:153] Connecting to unix:///csi/csi.sock
I0308 23:44:45.038572 1 common.go:111] Probing CSI driver for readiness
I0308 23:44:45.040579 1 csi_resizer.go:77] CSI driver name: "csi.vsphere.vmware.com"
W0308 23:44:45.040612 1 metrics.go:142] metrics endpoint will not be started because `metrics-address` was not specified.
I0308 23:44:45.042184 1 controller.go:117] Register Pod informer for resizer csi.vsphere.vmware.com
I0308 23:44:45.043182 1 leaderelection.go:243] attempting to acquire leader lease kube-system/external-resizer-csi-vsphere-vmware-com...
I0308 23:44:45.073383 1 leaderelection.go:253] successfully acquired lease kube-system/external-resizer-csi-vsphere-vmware-com
I0308 23:44:45.076028 1 leader_election.go:172] new leader detected, current leader: vsphere-csi-controller-87d7dcf48-jcht2
I0308 23:44:45.079332 1 leader_election.go:165] became leader, starting
I0308 23:44:45.079638 1 controller.go:241] Starting external resizer csi.vsphere.vmware.com
オンライン モードまたはオフライン モードで vSphere CSI ストレージ ボリュームを拡張する方法の詳細については、「オンライン モードでのパーシステント ボリュームの拡張」および「オフライン モードでのパーシステント ボリュームの拡張」を参照してください。
スタンドアローン管理クラスタから作成されたワークロード クラスタの場合は、トポロジ対応のローカル ストレージ ボリューム プロビジョニングを構成できます。トポロジ対応のボリューム プロビジョニングにより、Kubernetes はボリュームを動的にプロビジョニングするときにインテリジェントな決定を下すことができます。Kubernetes は、ポッドのボリュームをプロビジョニングするのに最適な場所でスケジューラ入力を取得します。
アベイラビリティ ゾーン (AZ) を作成します。
「複数のアベイラビリティ ゾーンへのワークロード クラスタの展開(vSphere テクニカル プレビュー)」で説明されている手順に従って、vSphere で次を作成します。
仮想マシン グループをホスト グループ内に制限するルールを追加します。
1 つの仮想マシン グループとホスト グループを使用して、ワークロード クラスタで AZ を実行します。
注この制限ルールは、ローカル ボリューム構成でのみ使用します。複数のアベイラビリティ ゾーンに展開する場合は、制限ルールを作成する必要はありません。
カスタム リソース定義 (CRD) VSphereFailureDomain および VSphereDeploymentZone を、スタンドアローン管理クラスタに展開します。
AZ は、VSphereDeploymentZone にマッピングしてから、vSphere のホスト グループにマッピングします。
新しい AZ を追加します。新しい AZ は、ytt オーバーレイ構成を使用するか、Tanzu CLI を使用して追加できます。
ytt
ytt オーバーレイ構成を示します。
レガシー クラスタ
#@overlay/match by=overlay.subset({"kind":"MachineDeployment", "metadata":{"name": "${CLUSTER_NAME}-md-0"}})
---
apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineDeployment
metadata:
name: #@ "{}-md-0".format(data.values.CLUSTER_NAME)
spec:
clusterName: #@ data.values.CLUSTER_NAME
replicas: #@ data.values.WORKER_MACHINE_COUNT_0
selector:
matchLabels: null
strategy:
type: #@ verify_and_configure_machine_deployment_rollout_strategy(data.values.WORKER_ROLLOUT_STRATEGY)
template:
metadata:
labels:
node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME)
spec:
clusterName: #@ data.values.CLUSTER_NAME
version: #@ data.values.KUBERNETES_VERSION
bootstrap:
configRef:
name: #@ "{}-md-0".format(data.values.CLUSTER_NAME)
apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
kind: KubeadmConfigTemplate
infrastructureRef:
name: #@ "{}-md-0".format(data.values.CLUSTER_NAME)
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AWSMachineTemplate
failureDomain: #@ default_az_0
クラッシー クラスタ
workers:
machineDeployments:
#@overlay/match by=overlay.index(0)
- class: tkg-worker
name: md-0
replicas: #@ data.values.WORKER_MACHINE_COUNT_0
#@overlay/match missing_ok=True
failureDomain: #@ default_az_0
metadata:
annotations:
run.tanzu.vmware.com/resolve-os-image: #@ "ami-region={},os-name={},os-arch={}".format(data.values.AWS_REGION, data.values.OS_NAME, data.values.OS_ARCH)
レガシー クラスタ
tanzu cl node-pool set cl-name -f node-pool.yaml
# node-pool.yaml
name: vsphere-wc-1-manual-node-pool
replicas: 1
az: "rack4"
クラッシー クラスタ
「ClusterClass ベースのクラスタのノード プール構成」の「設定(作成)」を参照してください。