動態儲存區

本主題說明如何使用持續性磁碟區和儲存區類別,針對 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.2 中,所有預設儲存區類別都是使用外部 (「樹狀結構外」) 儲存區佈建,而不是「樹狀結構內」佈建。

  • 儲存區類別未隨附核心 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.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>
    
    
  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.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
    ...
    
  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 技術預覽) 中的指示,在 vSphere 中建立以下內容:

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

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

      附註

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

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

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

  2. 新增 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 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