本主題說明如何使用持續性磁碟區和儲存區類別,針對 Tanzu Kubernetes Grid (TKG) 工作負載叢集實作動態儲存區。
在 Kubernetes 叢集內,PersistentVolume
(PV) 物件可為叢集網繭提供共用儲存區,且不受網繭生命週期影響。儲存區會透過 PersistentVolumeClaim
(PVC) 物件佈建到 PV,該物件會定義網繭所能存取的基礎儲存區數量以及其存取方式。如需詳細資訊,請參閱 Kubernetes 說明文件中的持續性磁碟區。
叢集管理員可以定義 StorageClass
物件,讓叢集使用者能夠使用不同的儲存區類型和規則,來動態建立 PVC 和 PV 物件。Tanzu Kubernetes Grid 還會提供預設 StorageClass
物件,讓使用者能夠在統包式環境中佈建持續性儲存區。
StorageClass
物件包含一個 provisioner
欄位,用來識別佈建 PV 的內部或外部服務外掛程式;以及包含一個 parameters
欄位,該欄位會將 Kubernetes 儲存區類別與在基礎結構層級所定義的儲存區選項 (如 vSphere 中的虛擬機器儲存區原則) 相關聯。如需詳細資訊,請參閱 Kubernetes 說明文件中的儲存區類別。
Tanzu Kubernetes Grid 支援各種不同儲存區類型的 StorageClass
物件,且這些儲存區類型由 Kubernetes 內部 (「樹狀結構內」) 或外部 (「樹狀結構外」) 外掛程式所佈建。
儲存區類型
附註vSphere CSI 不支援 Storage DRS,但在 vSphere CSI 說明文件的 vSphere Container Storage 外掛程式支援的 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
物件。
在傳遞給 tanzu cluster create
--file
選項的叢集組態檔中,依預設,會將 ENABLE_DEFAULT_STORAGE_CLASS
變數設定為 true
,以便為工作負載叢集啟用預設儲存區類別。
重要請勿修改預設儲存區類別定義。若要自訂儲存區類別,請使用不同的
name
來建立新的StorageClass
定義,而不是修改 TKG 所建立的預設物件。
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 磁碟
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 檔案
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 檔案儲存區類別參數。
vSphere 管理員可以根據 Tanzu Kubernetes Grid 叢集使用者的需求,來設定 vSphere CNS,並為虛擬磁碟 (VMDK) 儲存區建立儲存區原則。
您可以將 vSAN 或本機 VMFS (虛擬機器檔案系統) 用於 Kubernetes 叢集中的持續性儲存區,如下所示:
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
的基礎。
StorageClass
組態 .yaml
,且其中包含 provisioner
、parameters
和其他選項。
storagePolicyName
參數設定為 vSphere 儲存區原則名稱 (括上雙引號的字串),以便建立 Kubernetes 儲存區類別與 vSphere 儲存區原則的關聯。kubectl create -f
kubectl describe storageclass <storageclass metadata.name>
,來驗證儲存區類別。例如,請參閱 Kubernetes 說明文件中的啟用動態佈建。
如需 vSphere CSI 資訊和資源,請參閱 VMware vSphere Container Storage 外掛程式說明文件。
若要為不使用上述其中一個預設儲存區類別的叢集節點,佈建持續性儲存區,則叢集使用者可以在網繭組態中包含自訂儲存區類別,如下所示:
將 kubectl
的內容設定為叢集。例如:
kubectl config use-context my-cluster-admin@my-cluster
選取或建立儲存區類別。
kubectl get storageclass
。建立 PVC 及其 PV:
PersistentVolumeClaim
組態 .yaml
,並將 spec.storageClassName
設定為您的 StorageClass
物件的 metadata.name
值。如需範例,請參閱 Kubernetes 說明文件中的啟用動態佈建。kubectl create -f
kubectl describe pvc <pvc metadata.name>
,以驗證 PVC。Successfully provisioned volume
之後的 kubectl describe pvc
輸出中。kubectl describe pv <pv unique name>
以驗證 PV。使用 PVC 來建立網繭:
Pod
組態 .yaml
,其中設定了 spec.volumes
,以將 PVC 包含在 persistentVolumeClaim.claimName
下。如需範例,請參閱 vSphere Container Storage 外掛程式說明文件中的使用 vSphere Container Storage 外掛程式來動態佈建區塊磁碟區。kubectl create -f
kubectl get pod <pod metadata.name>
以驗證網繭。若要針對工作負載叢集使用的 vSphere CSI 儲存區啟用磁碟區擴充,您需要將 csi-resizer
Sidecar 網繭新增到叢集的 CSI 程序。
工作負載叢集的 CSI 組態會編碼為 Kubernetes 密碼。此程序會修訂 CSI 組態密碼,來新增 csi-resizer
程序。它會在密碼中新增 stringData
定義,該定義合併了兩個編碼組態資料字串:一個是含有密碼先前 CSI 組態資料的 values.yaml
字串,另一個是會部署 csi-resizer
網繭的新 overlays.yaml
字串。
附註從 Update 2 起,vSphere 7.0 支援線上磁碟區擴充;請參閱 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
正在工作負載叢集上執行,且該工作負載叢集具有六個健全狀況良好的網繭:
$ 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 中建立以下內容:
新增規則以限制主機群組中的虛擬機器群組。
會使用一個虛擬機器群組和一個主機群組,以在工作負載叢集中執行 AZ。
附註限制規則僅適用於本機磁碟區組態。如果您要部署到多個可用區域,則無需建立限制規則。
將自訂資源定義 (CRD) VSphereFailureDomain
和 VSphereDeploymentZone
部署在獨立管理叢集中。
AZ 會對應至 VSphereDeploymentZone
,然後對應至 vSphere 中的主機群組。
新增 AZ。您可以使用 ytt
覆疊組態或使用 Tanzu CLI,來新增 AZ。
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 為基礎的叢集的節點集區組態中的設定 (建立)。