作者:马伟,青云科技容器顾问,云原生爱好者,现在专注于云原生技能,云原生领域技能栈触及 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 创立的卷进行附加 / 分离 / 挂载等操作。

在 VMware vSphere 中构建 Kubernetes 存储环境

结合上面这张官方供给的图,能够理解为,现在我的 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 即可建立结束。

在 VMware vSphere 中构建 Kubernetes 存储环境

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 成功运转:

在 VMware vSphere 中构建 Kubernetes 存储环境

检查 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,检查现已同步的存储类和快照类:

在 VMware vSphere 中构建 Kubernetes 存储环境

在 VMware vSphere 中构建 Kubernetes 存储环境

运转有状况运用

打开 KubeSphere 容器渠道的运用商铺,布置一个 MySQL 运用示例,以验证 vSphere 持久卷的可行性。

在 VMware vSphere 中构建 Kubernetes 存储环境

在 VMware vSphere 中构建 Kubernetes 存储环境

设置对应的 StorageClass 为方才根据 vSphere CSI 创立的 example-block-sc:

在 VMware vSphere 中构建 Kubernetes 存储环境

运用创立成功,已创立并附加声明的存储卷:

在 VMware vSphere 中构建 Kubernetes 存储环境

在 VMware vSphere 中构建 Kubernetes 存储环境

进入 vCenter,能够看到这台节点虚拟机已挂载一个 8G 的硬盘,容量和 PVC 共同,后端存储和 StorageClass 界说的共同。

在 VMware vSphere 中构建 Kubernetes 存储环境

进入 MySQL 终端,写入一些测试数据:

在 VMware vSphere 中构建 Kubernetes 存储环境

这儿创立一个表,插入示例值:

在 VMware vSphere 中构建 Kubernetes 存储环境

对现有 PVC 创立一个快照:

在 VMware vSphere 中构建 Kubernetes 存储环境

在 VMware vSphere 中构建 Kubernetes 存储环境

在 VMware vSphere 中构建 Kubernetes 存储环境

在 VMware vSphere 中构建 Kubernetes 存储环境

再次进入 MySQL 增加数据:

在 VMware vSphere 中构建 Kubernetes 存储环境

在 VMware vSphere 中构建 Kubernetes 存储环境

删除现有绑定的 PVC,进入 MySQL 检查表已检索不到。

在 VMware vSphere 中构建 Kubernetes 存储环境

在 VMware vSphere 中构建 Kubernetes 存储环境

运用卷快照的 PVC,进入 MySQL 检查数据,为创立快照时的状况。

在 VMware vSphere 中构建 Kubernetes 存储环境

在 VMware vSphere 中构建 Kubernetes 存储环境

监控

vsphere-csi 供给了根据 Prometheus 的监控目标,供给 CNS 组件和容器存储的目标暴露。 在 KubeSphere 上能够经过监控导出器创立对应服务的 ServiceMontior:

在 VMware vSphere 中构建 Kubernetes 存储环境

vSphere 官方供给了 Grafana 的监控模板,可直接运用:

在 VMware vSphere 中构建 Kubernetes 存储环境

用户也可根据监控目标在 KubeSphere 设置根据偏好的自界说监控面板,如调查容器块存储创立成功的次数统计:

在 VMware vSphere 中构建 Kubernetes 存储环境

除此之外,虚拟化管理员亦可在 vCenter 检查 CNS 监控信息:

在 VMware vSphere 中构建 Kubernetes 存储环境

在 VMware vSphere 中构建 Kubernetes 存储环境

在 VMware vSphere 中构建 Kubernetes 存储环境

初次分享就到这儿了,作为一名之前从事虚拟化,现在从事云原生的工程师,不论是采用哪种基础设施环境,终究目的都是为了上层运用站在巨人的肩膀上大施拳脚,因而在不同的基础环境供给不同的解决方案,也是一名售前工程师的趣味,感谢观看。 PS: 感谢老东家的 VMware 环境借用哈哈。 本文由博客一文多发渠道 OpenWrite 发布!