このトピックでは、パーシステント ボリュームとストレージ クラスを使用して、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.2 では、すべてのデフォルト ストレージ クラスが「ツリー内」プロビジョニングではなく、外部(「ツリー外」)ストレージ プロビジョニングを使用します。
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.2.0_vmware.1
pullPolicy: IfNotPresent
livenessProbeImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-livenessprobe
tag: v2.2.0_vmware.1
pullPolicy: IfNotPresent
vsphereSyncerImage:
repository: projects.registry.vmware.com/tkg
path: csi/volume-metadata-syncer
tag: v2.2.0_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.2.0_vmware.1
pullPolicy: IfNotPresent
livenessProbeImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-livenessprobe
tag: v2.2.0_vmware.1
pullPolicy: IfNotPresent
vsphereSyncerImage:
repository: projects.registry.vmware.com/tkg
path: csi/volume-metadata-syncer
tag: v2.2.0_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 ストレージ ボリュームを拡張する方法の詳細については、「vSphere with Tanzu でのボリュームの拡張」を参照してください。
スタンドアローン管理クラスタから作成されたワークロード クラスタの場合は、トポロジ対応のローカル ストレージ ボリューム プロビジョニングを構成できます。トポロジ対応のボリューム プロビジョニングにより、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 ベースのクラスタのノード プール構成」の「設定(作成)」を参照してください。