K8S使用vSphere vSAN做持久化存储

时间:2022-10-08 11:48:06

服务框架

K8S使用vSphere vSAN做持久化存储

部署环境

系统环境

这里使用centOS7进行的测试,生产环境计划使用Ubuntu18.04。

# cat /etc/redhat-release 
# 7.7也可以
CentOS Linux release 7.4.1708 (Core)

docker版本

# docker -v
Docker version 20.10.8, build 3967b7d

k8s版本

# kubectl version
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.10", GitCommit:"eae22ba6238096f5dec1ceb62766e97783f0ba2f", GitTreeState:"clean", BuildDate:"2022-05-24T12:56:35Z", GoVersion:"go1.16.15", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.10", GitCommit:"eae22ba6238096f5dec1ceb62766e97783f0ba2f", GitTreeState:"clean", BuildDate:"2022-05-24T12:50:52Z", GoVersion:"go1.16.15", Compiler:"gc", Platform:"linux/amd64"}

安装 govc 工具

该工具可以安装在k8s集群其中一台master主机上,也可以单独部署在集群之外的一台主机上。

源码安装

# 选择版本,直接安装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

设置govc环境变量

这里我们将环境变量写到 /etc/profile 文件中

# 设置环境变量
export GOVC_URL='vcenter.test.com'                        # vCenter ip地址或FQDN
export GOVC_USERNAME='k8s@vsphere.local'                  # vCenter administrator账号
export GOVC_PASSWORD='123456'                             # vCenter administrator账号密码
export GOVC_INSECURE=1                                    # 如果使用了自签名证书,设置为"1"
# 加载配置
source !$

查看 govc 版本信息

# govc env
# govc about
Name:         VMware vCenter Server
Vendor:       VMware, Inc.
Version:      7.0.1
Build:        17005016
OS type:      linux-x64
API type:     VirtualCenter
API version:  7.0.1.1
Product ID:   vpx
UUID:         5af25bfe-40a0-4b12-8721-e0c8dad7f398

部署虚拟机设置UUID

这里认为已经部署好组建k8s所需虚拟机资源。

需要注意的是,创建的虚拟机存放的位置即文件目录,设置方法如下:

点击vcenter菜单-->虚拟机和模板-->新建文件夹-->新建虚拟机和文件夹,这里我创建的文件夹名称是kubernetes-cluster,将创建好的虚拟机放置该文件夹下即可。

设置disk UUID

设置 disk UUID 有两种方式,一种是通过govc命令行,另一种使用vsphere client web界面设置。

通过命令行

# 格式:/<datacenter>/vm/<vsphere vm folder>
# <datacenter>:vsphere中datacenter名,根据实际环境填写,这里取值"Mcloud";
# vm:固定参数,如:vm,network,host,datastore;
# <vsphere vm folder>:自定义名字的"vsphere vm folder",这里取值"kubernetes-cluster"
govc ls /Datacenter/vm/kubernetes-cluster
# 输出该文件下的虚拟机
/Datacenter/vm/kubernetes-cluster/k8s-test

设置kubernetes集群vm节点的disk UUID为true:

# "disk.enableUUID=1"即为"true";
# 将已设置"disk.enableUUID=1"的vm打成模板,通过模板克隆出新的vm可继承此属性
govc vm.change -e="disk.enableUUID=1" -vm='/Datacenter/vm/kubernetes-cluster/k8s-test'

使用vsphere client web界面

控制台上找到待配置的虚拟机,点击操作-->编辑设置-->虚拟机选项-->高级-->配置参数-->添加"disk.enableUUID=1"即为"true"。

部署k8s

本节不是本文重点,这里暂且略过~

安装 vSphere Cloud Provider Interface

在所有kubernetes master节点创建文件(自定义路径&名字):/etc/kubernetes/vsphere.conf,这里定义一个全局的vsphere.conf文件。

kubectl create configmap cloud-config --from-file=vsphere.conf --namespace=kube-system

验证 configmap 是否已在 kube-system 命名空间中成功创建。

# kubectl get configmap cloud-config --namespace=kube-system
NAME              DATA     AGE
cloud-config      1        82s

检查所有节点是否被污染

在安装 vSphere Cloud Controller Manager 之前,请确保所有work节点都被node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule污染。

如下例子:

# 获取节点
kubectl get node
# 添加污点
kubectl taint node <node name> node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule
# kubectl describe nodes | egrep "Taints:|Name:"
Name:               k8s-master
Taints:             node-role.kubernetes.io/master:NoSchedule
Name:               k8s-node1
Taints:             node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule
Name:               k8s-node2
Taints:             node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule
Name:               k8s-node3
Taints:             node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule
Name:               k8s-node4
Taints:             node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule

安裝 vSphere Cloud Controller Manager

文件存放目录:~/CPI,部署如下:

# kubectl apply -f cloud-controller-manager-roles.yaml
clusterrole.rbac.authorization.k8s.io/system:cloud-controller-manager created

# kubectl apply -f cloud-controller-manager-role-bindings.yaml
clusterrolebinding.rbac.authorization.k8s.io/system:cloud-controller-manager created

# kubectl apply -f vsphere-cloud-controller-manager-ds.yaml
serviceaccount/cloud-controller-manager created
daemonset.extensions/vsphere-cloud-controller-manager created
service/vsphere-cloud-controller-manager created

确认 vSphere Cloud Controller Manager 已成功安裝:

# kubectl get pods --namespace=kube-system
NAME                                     READY   STATUS    RESTARTS   AGE
vsphere-cloud-controller-manager-549hb   1/1     Running   0          25s

确认 vSphere Provider ID:

kubectl describe nodes | grep ProviderID
ProviderID:                  vsphere://37dc2542-21a2-6d5e-2915-7064adc2b57e
ProviderID:                  vsphere://4225e3e2-464f-aade-0a2c-af15ec8bf3bd
ProviderID:                  vsphere://4225ff74-3717-1e4e-66f5-440310c89356
ProviderID:                  vsphere://4225a419-790d-fec3-da17-d6c54a31ba4f

检查所有节点是否未受污染:

当 vSphere Cloud Controller Manager 安裝完成,将会从所有 worker node 中移除node.cloudprovider.kubernetes.io/uninitialized参数,如下:

# kubectl describe nodes | egrep "Taints:|Name:"
Name:               k8s-master
Taints:             node-role.kubernetes.io/master:NoSchedule
Name:               k8s-node1
Taints:             <none>
Name:               k8s-node2
Taints:             <none>
Name:               k8s-node3
Taints:             <none>
Name:               k8s-node4
Taints:             <none>

说明:如果没有自动移除,手动移除下:

kubectl taint node <node name> node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule-

安装 vSphere Container Storage Interface Driver

vSphere对接容器存储插件架构如下:

K8S使用vSphere vSAN做持久化存储

所在文件目录:~/drive,部署如下:

# 创建驱动命名空间
kubectl create ns vmware-system-csi
# 创建vSphere配置文件
cat /etc/kubernetes/csi-vsphere.conf
kubectl create secret generic vsphere-config-secret --from-file=csi-vsphere.conf --namespace=vmware-system-csi
kubectl apply -f vsphere-csi-driver.yaml

创建存储策略

K8S使用vSphere vSAN做持久化存储

K8S使用vSphere vSAN做持久化存储

创建StorageClass

kubectl apply -f vsphere-storageclass.yaml
# kubectl get sc
NAME                        PROVISIONER                    RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
mongodb-sc (default)        csi.vsphere.vmware.com         Delete          Immediate              false                  24h

实战--mongodb使用vsan卷

部署有状态mongodb服务,流程如下:

kubectl apply -f mongo-server.yaml
# 查看服务状态
# kubectl get statefulset
NAME     READY   AGE
mongod   3/3     24h
# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
mongod-0                  1/1     Running   0          24h
mongod-1                  1/1     Running   0          24h
mongod-2                  1/1     Running   0          24h
# 查看使用的卷和sc即vsan
# kubectl get pvc
NAME                                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mongodb-persistent-storage-claim-mongod-0   Bound    pvc-65f515f7-7fd0-4c83-8757-ab6623a709ae   1Gi        RWO            mongodb-sc     24h
mongodb-persistent-storage-claim-mongod-1   Bound    pvc-0cd9ce26-6b60-4c10-baeb-56576ef86207   1Gi        RWO            mongodb-sc     24h
mongodb-persistent-storage-claim-mongod-2   Bound    pvc-33a3095f-0a40-49b4-bdcc-60fef043ad28   1Gi        RWO            mongodb-sc     24h

容器存储卷管理可视化

vSphere 管理员可通过熟悉的 vCenter 介面 (Monitor -> Could Native Storage -> Container Volume),能够在此界面看到 K8s 集群所使用的 PV 的对应关系,且可以通过 filter 进行关键字搜索和过滤。

K8S使用vSphere vSAN做持久化存储

参考文档