作者:马伟,青云科技容器参谋,云原生爱好者,目前专一于云原生技术,云原生畛域技术栈波及 Kubernetes、KubeSphere、kubekey 等。
置信很多小伙伴和企业在构建容器集群时都会思考存储选型问题,不论是块存储 / 文件存储 / 对象存储的抉择,亦或是一体机 / 裸机 + 外置存储 / 虚拟化 + 存储的纠结,都是在布局容器集群时的顾虑。对于原先就有虚拟化环境的用户来说,我是否 间接搭建容器集群在虚拟化环境中,并间接应用现有的存储用于容器 呢?本文将以 VMware vSphere CNS+KubeSphere 为工具在虚拟化环境搭建容器及存储环境。
vSphere CNS
VMware vSphere Cloud Native Storage(CNS)是 VMware 联合 vSphere 和 K8s 提供容器卷治理的组件。K8s 存储有 in tree 和 out of tree 两种存储类型,in tree 存储如 AWS EBS,Ceph RBD 等。是 VMware in tree 存储 VCP 演进到 out of tree 存储提供的合乎 CSI 插件标准的容器存储。它由两局部形成:
- vCenter 的 CNS 管制平台。vCenter 调度底层虚拟化联合的存储平台创立容器存储卷。
- K8s 的 CSI 存储插件。对 vCenter 创立的卷进行附加 / 拆散 / 挂载等操作。
联合下面这张官网提供的图,能够了解为,当初我的 vSphere 虚拟化环境曾经筹备好了不同的存储(本地存储 /NAS/FC SAN/vSAN),我不必在乎存储是什么品牌,不须要思考这款存储是否有厂商反对的 CSI 插件,我能够基于业务类型,将不同的存储间接挂载给我不同业务的容器应用。
这种设计模式也带来泛滥益处 :
- 简便运维。想在 vSphere 虚拟化平台上运行容器的用户,不再放心怎么联合存储,不必再去纠结 Ceph 还是 GlusterFS 好用,也不必想去哪倒腾个闲置的 NFS 挂在容器集群上了。相同能够在 vSphere 上监控容器虚拟机节点和存储状态,运维形式不变,运维效率失去晋升。
- 屏蔽存储差别。不论是 NAS 存储还是集中存储,只有对接于 vSphere 存储,应用 VMFS/NFS/vSAN 协定或格局的存储,皆可提供给容器应用。
- 基于策略的搁置。基于存储策略(SPBM)的 StorageClass Provisioner 定义,管理员可在虚拟化平台定义相应的存储策略,间接利用于 SC 中给容器应用。
容器环境搭建
在理解了基本概念后,本章开始实操演练。首先搭建一个 vSphere 虚拟化上的容器集群。为了疾速搭建一个从 0 到 1 的容器集群,此处应用一款开源工具——”Kubekey”。Kubekey 是青云开源的一款疾速搭建 K8s 和 KubeSphere 容器集群的工具,KubeSphere 是青云开源的 K8s PaaS 治理平台,能够帮忙用户可视化对立治理所有 K8s 环境,包含 AWS EKS,华为 CCE,VMware Tanzu 等 K8s 环境纳管。Kubekey 和 KubeSphere 皆通过 CNCF 一致性认证,感兴趣的小伙伴能够在 github/gitee 查看详情。
获取 Kubekey 很简略,应用以下命令:
接下来应用一条命令疾速装置一个 kubernetes 平台和 KubeSphere 平台。
🐳 → export KKZONE=cn #国内网络环境友好
🐳 → curl -sfL https://get-kk.kubesphere.io | VERSION=v2.2.1 sh -
Docker 的呈现让咱们能够一条命令运行一个 MySQL 利用,Kubekey 让咱们一条命令运行一个残缺的 K8s 集群和 KubeSphere 平台。
🐳 → kk create cluster --with-kubernetes v1.23.8 --with-kubesphere v3.3.0
若是多台节点,应用配置文件定义节点信息即可。
hosts:
- {name: master, address: 192.168.0.2, internalAddress: 192.168.0.2, user: ubuntu, password: Testing123}
- {name: node1, address: 192.168.0.3, internalAddress: 192.168.0.3, user: ubuntu, password: Testing123}
roleGroups:
etcd:
- master
control-plane:
- master
worker:
- node1
在 kk create 后期待 20 分钟,K8s 和 KubeSphere 即可搭建结束。
Kubekey 不仅是一个 K8s 集群创立工具,还能够轻松创立 Harbor,Addon 网络存储插件,并可基于 Manifest 的模式定义节点依赖包,镜像,工具后标准化交付,过段时间我会更新一篇 Kubekey 使用手册,能够三连关注一波。
vSphere 容器存储插件装置
第一章节提过,vSphere CNS 整体由 vCenter 的 CNS 管制面和面向 k8s 的存储插件形成。CNS 管制面已存在于 vCenter 6.7U3 及更高版本中,接下来只须要在 vSphere 虚拟机部署的 k8s 中装置 CSI 插件即可。
这里有一个筹备条件,在筹备 K8s 节点虚拟机时,要先设置以下参数:
- 装置 VMTools;
- 配置虚拟机高级参数 disk.EnableUUID=TRUE;
- 调整虚拟机硬件版本至 15 以上;
- 增加 VMware 准 SCSI 存储控制器到 VM,应用 VMware 准虚构类型。
装置 vSphere CSI 插件时,提前查阅官网查看对应版本的 vCenter,K8s 的兼容性。
装置 vsphere-cloud-controller-manager
对所有节点打标签
🐳 → kubectl taint node k8s node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule
下载 vsphere-cloud-controller-manager yaml 文件,
🐳 → wget https://raw.githubusercontent.com/kubernetes/cloud-provider-vsphere/release-1.23/releases/v1.23/vsphere-cloud-controller-manager.yaml
批改其中 Secret 和 Configmap 局部的 vCenter 配置:
apiVersion: v1
kind: Secret
metadata:
name: vsphere-cloud-secret
namespace: kube-system
stringData:
10.0.0.1.username: "<ENTER_YOUR_VCENTER_USERNAME>"
10.0.0.1.password: "<ENTER_YOUR_VCENTER_PASSWORD>"
apiVersion: v1
kind: ConfigMap
metadata:
name: vsphere-cloud-config
namespace: kube-system
data:
vcenter:
<your-vcenter-name-here>:
server: 10.0.0.1
user: <use-your-vcenter-user-here>
password: <use-your-vcenter-password-here>
datacenters:
- Datacenter01
作为一个合格的 yaml 工程师,肯定留神缩进。在调整完后,kubectl apply 一下:
🐳 → kubectl apply -f vsphere-con-ma.yaml
serviceaccount/cloud-controller-manager created
secret/vsphere-cloud-secret created
configmap/vsphere-cloud-config created
rolebinding.rbac.authorization.k8s.io/servicecatalog.k8s.io:apiserver-authentication-reader created
clusterrolebinding.rbac.authorization.k8s.io/system:cloud-controller-manager created
clusterrole.rbac.authorization.k8s.io/system:cloud-controller-manager created
daemonset.apps/vsphere-cloud-controller-manager created
🐳 → kubectl get pods -A | grep vsphere
kube-system vsphere-cloud-controller-manager-km68c 1/1 Running 0 3m4s
创立 vmware-system-csi 命名空间:
🐳 → kubectl create ns vmware-system-csi
namespace/vmware-system-csi created
创立 CSI 驱动配置文件:
🐳 → cat /etc/kubernetes/csi-vsphere.conf
[Global]
cluster-id = "<cluster-id>"#t 填写集群名称
[VirtualCenter "<IP or FQDN>"] #填写 vcenter 信息
insecure-flag = "<true or false>"# 抉择 false 后要注明 ca 文件和指纹,可抉择 true
user = "<username>"
password = "<password>"
port = "<port>"
datacenters = "<datacenter1-path>"# 抉择集群节点所在的 datacenter
生成 Secret:
🐳 → kubectl create secret generic vsphere-config-secret --from-file=csi-vsphere.conf --namespace=vmware-system-csi
装置 vsphere-csi-driver:
🐳 → kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/vsphere-csi-driver/v2.6.0/manifests/vanilla/vsphere-csi-driver.yaml
期待 Pod 胜利运行:
查看 csidriver 和 csinode 状态:
🐳 → kubectl get csidriver
NAME ATTACHREQUIRED PODINFOONMOUNT STORAGECAPACITY TOKENREQUESTS REQUIRESREPUBLISH MODES AGE
csi.vsphere.vmware.com true false false <unset> false Persistent 85m
🐳 → kubectl get CSINODE
NAME DRIVERS AGE
k8s 1 16h
到这里 vsphere csi driver 装置实现,能够筹备底层存储和 StorageClass 置备了。
StorageClass 创立
CNS 使 vSphere 存储成为运行有状态 K8s 工作负载的平台,因而 CNS 可基于存储策略或指定挂载的 vSphere 存储(VMFS/NFS/vSAN)创立 StorageClass 进行动静长久卷置备。
创立 StorageClass:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: example-block-sc
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: csi.vsphere.vmware.com
parameters:
storagepolicyname: "vSAN Default Storage Policy" #应用存储策略定义
# datastoreurl: "ds:///vmfs/volumes/vsan:52cdfa80721ff516-ea1e993113acfc77/" #应用指定的数据存储定义,能够是挂载给 ESXi 的 NFS,FC/IP SAN,本地存储等
# csi.storage.k8s.io/fstype: "ext4" #设定格式化文件类型
进入 KubeSphere,查看曾经同步的存储类和快照类:
运行有状态利用
关上 KubeSphere 容器平台的利用商店,部署一个 MySQL 利用示例,以验证 vSphere 长久卷的可行性。
设置对应的 StorageClass 为方才基于 vSphere CSI 创立的 example-block-sc:
利用创立胜利,已创立并附加申明的存储卷:
进入 vCenter,能够看到这台节点虚拟机已挂载一个 8G 的硬盘,容量和 PVC 统一,后端存储和 StorageClass 定义的统一。
进入 MySQL 终端,写入一些测试数据:
这里创立一个表,插入示例值:
对现有 PVC 创立一个快照:
再次进入 MySQL 增加数据:
删除现有绑定的 PVC,进入 MySQL 查看表已检索不到。
应用卷快照的 PVC,进入 MySQL 查看数据,为创立快照时的状态。
监控
vsphere-csi 提供了基于 Prometheus 的监控指标,提供 CNS 组件和容器存储的指标裸露。
在 KubeSphere 上能够通过监控导出器创立对应服务的 ServiceMontior:
vSphere 官网提供了 Grafana 的监控模板,可间接应用:
用户也可依据监控指标在 KubeSphere 设置基于偏好的自定义监控面板,如察看容器块存储创立胜利的次数统计:
除此之外,虚拟化管理员亦可在 vCenter 查看 CNS 监控信息:
首次分享就到这里了,作为一名之前从事虚拟化,当初从事云原生的工程师,不论是采纳哪种基础设施环境,最终目标都是为了下层利用站在伟人的肩膀上大施拳脚,因而在不同的根底环境提供不同的解决方案,也是一名售前工程师的乐趣,感激观看。
PS: 感激老东家的 VMware 环境借用哈哈。
本文由博客一文多发平台 OpenWrite 公布!