Kubernetes調用vSphere vSAN做持久化存儲


參考

一. 框架


說明:

  • 在kubernetes集群中部署vsphere cloud provider
  • 運行在kubernetes集群中的Pod通過多種方式(靜態或動態)可調用vSAN/VMFS等后端存儲的VMDK做為其持久卷。

二. 環境

2.1 驗證環境

  • vCenter

    IP Version USER PASSWORD DataCenter DataStore Remark
    172.20.0.16 6.0.0 內部版本5112533 administrator@vsphere.local AIUc63$#v4LZ Mcloud -
    - - k8s@vsphere.local k8S!@Vcp123 Mcloud vsanDatastore

    說明:

    • 使用administrator賬號設置disk UUID
    • 使用administrator賬號為vsphere cloud provider(vcp)賬號賦權;
    • kubernetes集群使用vcp賬號與vCenter交互;
    • DataCenter是vCenter下的一級邏輯組織,取kubernetes集群所在DataCenter對應名字即可;
    • DataStore取kubernetes集群需要調用的后端存儲名字,類型可以是vSAN,VMFS,NFS & VVol等。
  • kubernetes-cluster nodes

    Hostname IP Roles Version Remark
    kubemaster01 172.30.200.101 master&minion v1.12.3
    kubemaster02 172.30.200.102 master&minion v1.12.3
    kubemaster03 172.30.200.103 master&minion v1.12.3
  • govc node

    Hostname IP Roles Version Remark
    ansible01 172.30.200.46 govc v0.19.0

2.2 一些先決條件

  • 1.組建kubernetes集群的vm節點必須放置在一個vsphere vm folder,在vCenter的虛擬機與模板下創建,文件夾名自定義,這里定義為kubernetes-cluster
  • 2.組建kubernetes集群的vm節點的name與其操作系統hostname一致(實際驗證后,並非強制要求);
  • 3.組建kubernetes集群的vm節點的disk UUID需要設置為enabled(見下文詳細設置);
  • 4.(針對kubernetes version is 1.8.x or below的規則,未驗證在1.8.x以上版本是否可不遵守此規則)組建kubernetes集群的vm節點的name需要遵守以下regex:[a-z](([-0-9a-z]+)?[0-9a-z])?(\.[a-z0-9](([-0-9a-z]+)?[0-9a-z])?)*
    • 不以數字開頭;
    • 不使用大寫字母;
    • 不包含除“.”和“-”以外的任何特殊字符;
    • 必須至少包含三個字符,但不超過 63 個字符。
  • 5.在vCenter設置vSphere cloud provider user,這里vcp賬號設置為k8s@vsphere.local:
    • vSphere Web Clinet --> 主頁 --> (系統管理)角色;
    • 添加用戶:Single Sign-On --> 用戶 --> 添加k8s賬號 ;
    • 創建角色:訪問控制--> 角色 --> 添加k8s-vcp角色,角色按照官方說明dynamic persistent volume provisioning with storage policy賦權;
    • 賬號關聯角色:訪問控制--> 全局權限 --> 添加權限,關聯賬號與角色,關聯時同時勾選"傳播到子對象"。
    • 補充1:部分資料中角色權限中有System.*權限,此類權限不用特別賦權,默認即帶,且在角色清單中也找不到System.*權限。
    • 補充2:經驗證,官方文檔給出的角色權限適用vSphere Client 6.0.x與6.5.x版本(更低的版本未驗證);對vSphere Client 6.7.x版本,則權限不足,創建pvc時報Failed to provision volume with StorageClass "xxxxxx": ServerFaultCode: Permission to perform this operation was denied.錯,可使用administrator賬號替代。

三. disk UUID

通過govc工具,可以設置disk UUID,參考:GitHub vmware/govmomi

3.1 安裝govc

# 選擇版本,直接安裝binaries
curl -L https://github.com/vmware/govmomi/releases/download/v0.19.0/govc_linux_amd64.gz | gunzip > /usr/local/bin/govc
chmod +x /usr/local/bin/govc

3.2 設置govc環境變量

# 設置環境變量
export GOVC_URL='172.20.0.16'                        # vCenter ip地址或FQDN
export GOVC_USERNAME='administrator@vsphere.local'   # vCenter administrator賬號
export GOVC_PASSWORD='AIUc63$#v4LZ'                  # vCenter administrator賬號密碼
export GOVC_INSECURE=1                               # 如果使用了自簽名證書,設置為"1"

# 設置環境變量后,可查看govc變量與版本
govc env
govc about

3.3 設置disk UUID

  • 通過govc可以確定kubernetes集群vm節點位置:
    # 格式:/<datacenter>/vm/<vsphere vm folder>
    # <datacenter>:vsphere中datacenter名,根據實際環境填寫,這里取值"Mcloud";
    # vm:固定參數,如:vm,network,host,datastore;
    # <vsphere vm folder>:自定義名字的"vsphere vm folder",這里取值"kubernetes-cluster"
    govc ls /Mcloud/vm/kubernetes-cluster
    

  • 設置kubernetes集群vm節點的disk UUIDtrue
    # "disk.enableUUID=1"即為"true";
    # 將已設置"disk.enableUUID=1"的vm打成模板,通過模板克隆出新的vm可繼承此屬性
    govc vm.change -e="disk.enableUUID=1" -vm='/Mcloud/vm/kubernetes-cluster/kubemaster01'
    govc vm.change -e="disk.enableUUID=1" -vm='/Mcloud/vm/kubernetes-cluster/kubemaster02'
    govc vm.change -e="disk.enableUUID=1" -vm='/Mcloud/vm/kubernetes-cluster/kubemaster03'
    
  • 補充govc用法(與本實驗無關):手工創建vmdk
    # 格式:datastore.disk.create -ds <DataStore> -size xG <Folder>/<Name>.vmdk
    # <DataStore>:需要調用的后端存儲名字,這里取值"vsanDatastore";
    # <Folder>:<DataStore>中存放新建存儲卷的目錄,這里自定義目錄名"k8sData",需要注意的是目錄需要提前創建,否則會報錯;
    # vmdk文件創建之后的初始大小為0kb
    govc datastore.disk.create -ds vsanDatastore -size 10G k8sData/MySQLDisk.vmdk
    

四. 部署vSphere Cloud Provider

4.1 創建vSphere Cloud Provider配置文件(kubernetes v1.9.x and above)

  • 在所有kubernetes master節點創建文件(自定義路徑&名字):/etc/kubernetes/vsphere.conf
    vim /etc/kubernetes/vsphere.conf
    # 全局屬性
    [Global]
    # 從安全角度考慮,生產環境應使用針對性的賬號
    user = "k8s@vsphere.local"
    password = "k8S!@Vcp123"
    port = "443"
    # 如果使用自簽名證書,應設置為"1"
    insecure-flag = "1" 
    datacenters = "Mcloud"
    
    # 針對kubernetes集群節點跨多vCenter的情況,可設置多"VirtualCenter";
    # "user","password","datacenters"也可設置在此,可覆蓋全局屬性
    [VirtualCenter "172.20.0.16"]
    
    # vSphere Cloud Provider使用"SPBM"存儲策略配置存儲卷
    [Workspace]
    # mandatory
    server = "172.20.0.16"
    # mandatory
    datacenter = "Mcloud"
    # mandatory
    folder = "kubernetes-cluster"
    # option,本實驗省略;
    # kubernetes創建pvc資源時,如果選項中未指定數據存儲或存儲策略,則使用默認數據存儲放置vmdk
    #default-datastore="vsanDatastore"
    # option,本實驗省略;
    # 資源池文件夾,放置創建的vmdk
    #resourcepool-path="kubernetes-cluster"
    
    [Disk]
    # option;
    # lsilogic-sas or pvscsi, default: pvscsi
    scsicontrollertype = pvscsi 
    
    [Network]
    # option,本實驗省略;
    # Name of public VM Network to which the VMs in the cluster are connected. Used to determine public IP addresses of VMs.
    #public-network = "VM Network"
    

4.2 部署vSphere Cloud Provider(kubernetes v1.9.x and above)

  • 在所有kubernetes master節點,為kube-apiserver,kube-controller-manager,kubelet等3個服務添加參數:
    --cloud-provider=vsphere
    --cloud-config=/etc/kubernetes/vsphere.conf
    
  • 在所有kubernetes minion節點,為kubelet添加參數:
    --cloud-provider=vsphere
    
  • 重啟相關服務。
    • 注意:如果kubelet使用了--cloud-provider參數,--hostname-override參數將失效
    • 如果使用了--hostname-override參數,必須刪除狀態為NotReady的節點,否則創建pvc時報錯Failed to provision volume with StorageClass "storageclass01": No VM found,通過kubectl delete node <IP> 執行刪除。

五. kubernetes使用vSAN

kubernetes可以通過以下方式調用vSAN:

5.1 基於SPBM存儲策略動態創建存儲卷

StorageClass

cat vsphere-storageclass-spbm.yaml 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata: 
  name: vsphere-storageclass-spbm
# 存儲分配器,根據后端存儲不同而變更
provisioner: kubernetes.io/vsphere-volume
# 默認即"Delete",刪除pvc后,相應的pv及后端的volume等一起刪除;
# 設置為"Retain"時則保留數據,需要手工處理
reclaimPolicy: Delete
parameters: 
  # 指定具體的datastore,如果不指定則采用在"vsphere-cloud-config-file(vsphere.conf)"中設置的默認"default-datastore"
  datastore: vsanDatastore
  # 默認即"thin",另有"zeroedthick"與"eagerzeroedthick"可選
  diskformat: thin
  # 磁盤格式,如:xfs,ext3,ext4等
  fstype: xfs
  # 以下兩條是調用SPBM策略,SPBM策略有:cacheReservation,diskStripes,forceProvisioning,hostFailuresToTolerate,iopsLimit,objectSpaceReservation
  # 以下設置是vCenter中默認的"Virtual SAN Default Storage Policy"的設置
  hostFailuresToTolerate: "1"
  diskStripes: "1"
  
# 創建StorageClass
kubectl create -f vsphere-storageclass-spbm.yaml

# 查看StorageClass
kubectl describe sc vsphere-storageclass-spbm

PVC & PV

  • 創建pvc

    cat vsphere-pvc002.yaml 
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: vsphere-pvc002
      # 調用StrageClass
      annotations:
        volume.beta.kubernetes.io/storage-class: vsphere-storageclass-spbm
    spec:
      # ReadWriteOnce:簡寫RWO,讀寫權限,且只能被單個node掛載;
      # ReadOnlyMany:簡寫ROX,只讀權限,允許被多個node掛載;
      # ReadWriteMany:簡寫RWX,讀寫權限,允許被多個node掛載
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          # 注意格式,不能寫“GB”
          storage: 10Gi
    
    # 創建PVC
    kubectl create -f vsphere-pvc002.yaml
    
    # 查看PVC
    kubectl describe pvc vsphere-pvc002
    

  • PV由PVC調用StorageClass自動創建

    # 查看自動創建的PV
    kubectl get pv
    kubecet describe pv pvc-b3754406-0359-11e9-b1f2-005056bfac1e
    

  • 同步查看vCenter信息

  • 查看在vSAN DataStore上生成的vmdk

Pod

cat vsphere-pod002.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: vsphere-pod002
spec:
  containers:
  - name: test-container
    # 使用中科大的鏡像倉庫
    image: gcr.mirrors.ustc.edu.cn/google_containers/test-webserver
    volumeMounts:
    - name: test-volume
      mountPath: /test-vmdk
  volumes:
  - name: test-volume
    # Pod掛載PVC
    persistentVolumeClaim:
      claimName: vsphere-pvc002
      
# 創建Pod
kubectl create -f vsphere-pod002.yaml

# 查看Pod
kubectl describe pod vsphere-pod002


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM