Link

目录

  1. 参考文档
  2. 1、 前置条件
    1. 1.1 操作系统
    2. 1.2 VMTools
  3. 2、将虚拟机添加到 VM 目录中:
  4. 3、 为虚拟机的 vmdk 添加 label
  5. 4、为 Cloud Provider 创建用户
  6. 5、Kubernetes 配置
  7. 6、配置 kubelet 等
  8. 7、更新 Provider-ID
  9. 8、创建 Storage Class
  10. 9、使用 PVC 自动置备

参考文档

https://vmware.github.io/vsphere-storage-for-kubernetes/documentation/index.html

1、 前置条件

1.1 操作系统

  • Photon OS - v1.0 GA
  • Ubuntu - 16.04, 18.04
  • CoreOS - v4.11.2
  • Centos - v7.3
  • RHEL OS - v7.4
  • SLES - v12 SP3

1.2 VMTools

所有安装k8s的虚拟机必须安装 VMTools。

2、将虚拟机添加到 VM 目录中:

登录 vCenter web client,新建一个名为 kubernetes 的虚拟机文件夹,将 k8s 所有虚拟机拖到此文件夹。

3、 为虚拟机的 vmdk 添加 label

通过下列命令下载并安装govc工具:

curl -L $URL_TO_BINARY | gunzip > /usr/local/bin/govc
chmod +x /usr/local/bin/govc

二进制获取地址:

https://github.com/vmware/govmomi/releases

参考链接:

https://github.com/vmware/govmomi/tree/master/govc#govc

安装完成后运行下列命令:

#填写相应的 vCenter IP、用户名和密码。
export GOVC_URL='vCenter IP OR FQDN'
export GOVC_USERNAME='vCenter User'
export GOVC_PASSWORD='vCenter Password'
export GOVC_INSECURE=1

#将vm name here 替换成 k8s vm 的名称,每个虚拟机都需要执行
govc vm.change -e="disk.enableUUID=1" -vm='vm name here'

4、为 Cloud Provider 创建用户

如果仅是POC,可以直接使用 [email protected]

或者自定义以下角色,并创建新用户,为新用户分配此角色,具体权限参考:

https://vmware.github.io/vsphere-storage-for-kubernetes/documentation/vcp-roles.html

5、Kubernetes 配置

所有节点的 /etc/kubernetes 目录下创建 vsphere.conf 文件:

[Global]
user = "[email protected]"
password = "password"
port = "443"
insecure-flag = "1"

[VirtualCenter "10.0.1.200"]
datacenters = "DC-1"

[Workspace]
server = "10.0.1.200"
datacenter = "DC-1"
default-datastore = "Datastore"
resourcepool-path = "Cluster-1/Resources"
folder = "kubernetes"

[Disk]
scsicontrollertype = pvscsi

6、配置 kubelet 等

找到 kubelet 启动文件(一般在 /etc/systemd/system/kubelet.service 下,Rancher 部署的可以在 RKE 的 cluster.yml 中添加),添加下列启动参数:

--cloud-provider=vsphere
--cloud-config=/etc/kubernetes/vsphere.conf

找到 api-server 和 controller-manager manifests配置文件,添加同样的参数:

Rancher 部署的可以在 RKE 的 cluster.yml 中添加,如果非 Rancher 部署参考下面的内容:

一般文件路径为:/etc/kubernetes/manifests/kube-apiserver.json 或者 .yaml

/etc/kubernetes/manifests/kube-controller-manager.json 或者 .yaml

如果配置文件是 .json,添加下列行:

"--cloud-provider=vsphere",
"--cloud-config=/etc/kubernetes/vsphere.conf"

如果配置文件是 .yaml,添加下列行(行首有两个空格):

  - --cloud-provider=vsphere
  - --cloud-config=/etc/kubernetes/vsphere.conf

7、更新 Provider-ID

执行下列命令:

kubectl get nodes -o json | jq '.items[]|[.metadata.name, .spec.providerID, .status.nodeInfo.systemUUID]'

如果输出为空,执行下列命令:

#!/bin/bash

export GOVC_URL='vCenter IP OR FQDN'
export GOVC_USERNAME='vCenter User'
export GOVC_PASSWORD='vCenter Password'
export GOVC_INSECURE=1

DATACENTER='DC-1'
FOLDER='kubernetes'
# In my case I'm using a prefix for the VM's, so grep'ing is necessary.
# You can remove it if the folder you are using only contains the machines you need.
#VM_PREFIX='<prefix>'
IFS=$'\n'
for vm in $(./govc ls "/$DATACENTER/vm/$FOLDER"); do
  MACHINE_INFO=$(./govc vm.info -json -dc=$DATACENTER -vm.ipath="/$vm" -e=true)
  # My VMs are created on vmware with upper case names, so I need to edit the names with awk
  VM_NAME=$(jq -r ' .VirtualMachines[] | .Name' <<< $MACHINE_INFO | awk '{print tolower($0)}')
  # UUIDs come in lowercase, upper case then
  VM_UUID=$( jq -r ' .VirtualMachines[] | .Config.Uuid' <<< $MACHINE_INFO | awk '{print toupper($0)}')
  echo "Patching $VM_NAME with UUID:$VM_UUID"
  # This is done using dry-run to avoid possible mistakes, remove when you are confident you got everything right.
  kubectl patch node $VM_NAME -p "{\"spec\":{\"providerID\":\"vsphere://$VM_UUID\"}}"
done

再次运行下列命令:

kubectl get nodes -o json | jq '.items[]|[.metadata.name, .spec.providerID, .status.nodeInfo.systemUUID]'

输出应该就包含了 ProviderID 相关内容。

重启 kubelet 、apiserver 及 controller manager。默认如果用 RKE 修改了 cluster.yaml ,只需要重新 up 以下就可以,到时候检查下 kubelet、apiserver 及 controller manager 时间,看是否重启过。

8、创建 Storage Class

创建下列 yaml 文件,并用 kubectl apply -f 加载。

$ cat vsphere-volume-spbm-policy.yaml

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: fast
provisioner: kubernetes.io/vsphere-volume
parameters:
    diskformat: zeroedthick
    storagePolicyName: gold
    datastore: Datastore1

使用下列命令检查:

kubectl describe storageclass fast
Name:		fast
Annotations:	<none>
Provisioner:	kubernetes.io/vsphere-volume
Parameters:	hostFailuresToTolerate="2", cachereservation="20"
No events.

9、使用 PVC 自动置备

为工作负载添加 PVC,测试自动创建 PV,步骤略。