動態儲存區

本主題說明如何使用持續性磁碟區和儲存區類別,針對 Tanzu Kubernetes Grid (TKG) 工作負載叢集實作動態儲存區。

概觀:PersistentVolume、PersistentVolumeClaim 和 StorageClass

在 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 雲端原生儲存 (CNS)
  • Amazon EBS
  • Azure 磁碟
  • Azure 檔案
  • iSCSI
  • NFS
附註

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.3 中,所有預設儲存區類別都是使用外部 (「樹狀結構外」) 儲存區佈建,而不是「樹狀結構內」佈建。

  • 儲存區類別未隨附核心 Kubernetes。
  • StorageClass 物件 provisioner 值不帶有 kubernetes.io 首碼。
  • 佈建程式會遵循外部儲存區的「容器儲存區介面 (CSI)」標準。
  • 如果工作負載叢集具有舊版 TKG 所部署的預設儲存區類別,則其可能具有樹狀結構內儲存區佈建。請參閱使用儲存區類別來建立持續性磁碟區

預設儲存區類別

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 檔案儲存區類別參數。

設定 CNS 並建立儲存區原則 (vSphere)

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 說明文件中的建立儲存區原則中的指示。請確定:

  • 原則結構 (Policy structure) 窗格中的資料存放區特定規則 (Datastore specific rules) 下,選取針對「vSAN」儲存區啟用規則 (Enable rules for “vSAN” storage)
  • 設定其他窗格或根據需要接受預設值。
  • 記錄儲存區原則名稱,以作為 StorageClass 物件中的 storagePolicyName 值的參考。

本機 VMFS 儲存區

若要為本機儲存區建立儲存區原則,請將標籤套用至儲存區,並根據標籤來建立儲存區原則,如下所示:

  1. 從頂層 vSphere 功能表中,選取標籤與自訂屬性 (Tags & Custom Attributes)

  2. 標籤 (Tags) 窗格中,選取類別 (Categories),然後按一下新增 (New)

  3. 輸入類別名稱,例如 tkg-storage。使用核取方塊,將其與資料中心 (Datacenter) 和儲存區物件 (資料夾 (Folder)資料存放區 (Datastore)) 相關聯。按一下建立 (Create)

  4. 從頂層儲存區 (Storage) 視圖中,選取 VMFS 磁碟區,然後在其摘要 (Summary) 窗格中,按一下標籤 (Tags) > 指派 (Assign)…

  5. 指派標籤 (Assign Tag) 快顯視窗中,按一下新增標籤 (Add Tag)

  6. 建立標籤 (Create Tag) 快顯視窗中,為標籤指定一個名稱,例如 tkg-storage-ds1,並將您建立的類別 (Category) 指派給它。按一下確定 (OK)

  7. 指派標籤 (Assign Tag) 中,選取標籤,然後按一下指派 (Assign)

  8. 從頂層 vSphere 中,選取虛擬機器儲存區原則 (VM Storage Policies) > 建立儲存區原則 (Create a Storage Policy)。組態精靈會啟動。

  9. 名稱和說明 (Name and description) 窗格中,輸入儲存區原則的名稱。記錄儲存區原則名稱,以作為 StorageClass 物件中的 storagePolicyName 值的參考。

  10. 原則結構 (Policy structure) 窗格中的資料存放區特定規則 (Datastore specific rules) 下,選取啟用以標籤為基礎的放置規則 (Enable tag-based placement rules)

  11. 以標籤為基礎的放置 (Tag based placement) 窗格中,按一下新增標籤規則 (Add Tag Rule),然後設定:

    • 標籤類別 (Tag category):選取類別名稱
    • 使用量選項 (Usage option)Use storage tagged with
    • 標籤 (Tags):瀏覽並選取標籤名稱
  12. 確認並設定其他窗格,或根據需要接受預設值。然後按一下檢閱並完成 (Review and finish)完成 (Finish),以建立儲存區原則。

建立自訂儲存區類別

叢集管理員可以建立新的儲存區類別,如下所示:

  1. 在 vSphere 上,選取或建立虛擬機器儲存區原則,以作為 Kubernetes StorageClass 的基礎。
  2. 建立 StorageClass 組態 .yaml,且其中包含 provisionerparameters 和其他選項。
    • 在 vSphere 上,將 Kubernetes 儲存區類別的 storagePolicyName 參數設定為 vSphere 儲存區原則名稱 (括上雙引號的字串),以便建立 Kubernetes 儲存區類別與 vSphere 儲存區原則的關聯。
  3. 將檔案傳遞到 kubectl create -f
  4. 執行 kubectl describe storageclass <storageclass metadata.name>,來驗證儲存區類別。

例如,請參閱 Kubernetes 說明文件中的啟用動態佈建

如需 vSphere CSI 資訊和資源,請參閱 VMware vSphere Container Storage 外掛程式說明文件

在叢集中使用自訂儲存區類別

若要為不使用上述其中一個預設儲存區類別的叢集節點,佈建持續性儲存區,則叢集使用者可以在網繭組態中包含自訂儲存區類別,如下所示:

  1. kubectl 的內容設定為叢集。例如:

    kubectl config use-context my-cluster-admin@my-cluster
    
  2. 選取或建立儲存區類別。

    • 選取
      • 若要列出可用的儲存區類別,請執行 kubectl get storageclass
    • 建立
  3. 建立 PVC 及其 PV:

    1. 建立 PersistentVolumeClaim 組態 .yaml,並將 spec.storageClassName 設定為您的 StorageClass 物件的 metadata.name 值。如需範例,請參閱 Kubernetes 說明文件中的啟用動態佈建
    2. 將檔案傳遞到 kubectl create -f
    3. 執行 kubectl describe pvc <pvc metadata.name>,以驗證 PVC。
    4. PV 是使用 PVC 自動建立的。記錄其名稱,此名稱列在 Successfully provisioned volume 之後的 kubectl describe pvc 輸出中。
    5. 執行 kubectl describe pv <pv unique name> 以驗證 PV。
  4. 使用 PVC 來建立網繭:

    1. 建立 Pod 組態 .yaml,其中設定了 spec.volumes,以將 PVC 包含在 persistentVolumeClaim.claimName 下。如需範例,請參閱 vSphere Container Storage 外掛程式說明文件中的使用 vSphere Container Storage 外掛程式來動態佈建區塊磁碟區
    2. 將檔案傳遞到 kubectl create -f
    3. 執行 kubectl get pod <pod metadata.name> 以驗證網繭。

針對 vSphere CSI 啟用磁碟區擴充 (vSphere 7)

若要針對工作負載叢集使用的 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 中的磁碟區擴充

  1. 針對您要變更的工作負載叢集,登入其管理叢集,如果您需要擷取工作負載叢集的名稱,請執行 tanzu cluster list

  2. 使用標籤選取器 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
    
  3. 以 YAML 格式將密碼內容的備份儲存到 vsphere-csi-secret.yaml

    kubectl get secret my-wc-vsphere-csi-secret -o yaml > vsphere-csi-secret.yaml
    
  4. 再次輸出密碼的目前內容,並將 data.valuesbase64 解碼為純 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>
    
    
  5. 在編輯器中開啟 vsphere-csi-secret.yaml,並執行以下動作,使其類似於下面的程式碼:

    1. 刪除 values.yaml 的現有定義,這是一個長字串。
    2. 在第一行之後,新增一行以定義 stringData,並將 values.yaml 縮排成第一個元素。
    3. 複製上一個步驟中的 data.values 輸出。
    4. 在第三行後,貼上 data.values 輸出,並將它縮排為 values.yaml 的值。
    5. 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
    ...
    
  6. 執行 kubectl apply,以使用已修訂的定義來更新叢集密碼,然後重建 csi-controller 網繭:

    kubectl apply -f vsphere-csi-secret.yaml
    
  7. 若要確認 vsphere-csi-controller 和外部調整器可在叢集上運作,請執行以下動作:

    1. 確認 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
      
    2. 檢查 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 中的磁碟區擴充

拓撲感知磁碟區佈建 (vSphere)

對於從獨立管理叢集建立的工作負載叢集,您可以設定拓撲感知本機儲存磁碟區佈建。透過拓撲感知磁碟區佈建,可讓 Kubernetes 在動態佈建磁碟區時做出智慧的決策。Kubernetes 會在最佳位置取得排程器輸入,以便為網繭佈建磁碟區。

建立可用區域 (AZ):

  1. 遵循跨多個可用區域執行叢集中的指示,在 vSphere 中建立以下內容:

    1. 新增主機群組和虛擬機器群組。
    2. 新增規則以限制主機群組中的虛擬機器群組。

      會使用一個虛擬機器群組和一個主機群組,以在工作負載叢集中執行 AZ。

      附註

      限制規則僅適用於本機磁碟區組態。如果您要部署到多個可用區域,則無需建立限制規則。

    3. 將自訂資源定義 (CRD) VSphereFailureDomainVSphereDeploymentZone 部署在獨立管理叢集中。

      AZ 會對應至 VSphereDeploymentZone,然後對應至 vSphere 中的主機群組。

  2. 新增 AZ。您可以使用 ytt 覆疊組態或使用 Tanzu CLI,來新增 AZ。

    ytt
    以下顯示舊版叢集和類別叢集中的 ytt 覆疊組態。有關如何下載和安裝 ytt 的資訊,請參見 安裝 Carvel 工具

    舊版叢集

    #@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 CLI
    您可以使用 Tanzu CLI 來建立新的 AZ,以支援拓撲感知本機儲存區佈建。

    舊版叢集

    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 為基礎的叢集的節點集區組態中的設定 (建立)

check-circle-line exclamation-circle-line close-line
Scroll to top icon