服务框架
部署环境
系统环境
这里使用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对接容器存储插件架构如下:
所在文件目录:~/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
创建存储策略
创建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 进行关键字搜索和过滤。