參考
一. 框架

說明:
- 在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等。
- 使用administrator賬號設置
-
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 UUID為true:# "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>執行刪除。
- 注意:如果kubelet使用了
五. kubernetes使用vSAN
kubernetes可以通過以下方式調用vSAN:
- 由pod直接掛載手工創建的vmdk,參考:Volumes
- 由pv關聯手工創建的vmdk,pvc關聯pv,pod掛載pvc,參考:Persistent Volumes & Persistent Volumes Claims
- 通過StorageClass動態調用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

