参考

一. 框架



说明:

  • 在kubernetes集群中部署vsphere cloud provider
  • 运行在kubernetes集群中的Pod通过多种方式(静态或动态)可调用vSAN/VMFS等后端存储的VMDK做为其持久卷。

二. 环境

2.1 验证环境

  • vCenter

    IP Version USER PASSWORD DataCenter DataStore Remark
    172.20.0.16 6.0.0 内部版本5112533 administrator@vsphere.local AIUc63$#v4LZ Mcloud -
    - - k8s@vsphere.local k8S!@Vcp123 Mcloud vsanDatastore

    说明:

    • 使用administrator账号设置disk UUID
    • 使用administrator账号为vsphere cloud provider(vcp)账号赋权;
    • kubernetes集群使用vcp账号与vCenter交互;
    • DataCenter是vCenter下的一级逻辑组织,取kubernetes集群所在DataCenter对应名字即可;
    • DataStore取kubernetes集群需要调用的后端存储名字,类型可以是vSAN,VMFS,NFS & VVol等。
  • kubernetes-cluster nodes

    Hostname IP Roles Version Remark
    kubemaster01 172.30.200.101 master&minion v1.12.3
    kubemaster02 172.30.200.102 master&minion v1.12.3
    kubemaster03 172.30.200.103 master&minion v1.12.3
  • govc node

    Hostname IP Roles Version Remark
    ansible01 172.30.200.46 govc v0.19.0

2.2 一些先决条件

  • 1.组建kubernetes集群的vm节点必须放置在一个vsphere vm folder,在vCenter的虚拟机与模板下创建,文件夹名自定义,这里定义为kubernetes-cluster
  • 2.组建kubernetes集群的vm节点的name与其操作系统hostname一致(实际验证后,并非强制要求);
  • 3.组建kubernetes集群的vm节点的disk UUID需要设置为enabled(见下文详细设置);
  • 4.(针对kubernetes version is 1.8.x or below的规则,未验证在1.8.x以上版本是否可不遵守此规则)组建kubernetes集群的vm节点的name需要遵守以下regex:[a-z](([-0-9a-z]+)?[0-9a-z])?(\.[a-z0-9](([-0-9a-z]+)?[0-9a-z])?)*
    • 不以数字开头;
    • 不使用大写字母;
    • 不包含除“.”和“-”以外的任何特殊字符;
    • 必须至少包含三个字符,但不超过 63 个字符。
  • 5.在vCenter设置vSphere cloud provider user,这里vcp账号设置为k8s@vsphere.local:
    • vSphere Web Clinet --> 主页 --> (系统管理)角色;
    • 添加用户:Single Sign-On --> 用户 --> 添加k8s账号 ;
    • 创建角色:访问控制--> 角色 --> 添加k8s-vcp角色,角色按照官方说明dynamic persistent volume provisioning with storage policy赋权;
    • 账号关联角色:访问控制--> 全局权限 --> 添加权限,关联账号与角色,关联时同时勾选"传播到子对象"。
    • 补充1:部分资料中角色权限中有System.*权限,此类权限不用特别赋权,默认即带,且在角色清单中也找不到System.*权限。
    • 补充2:经验证,官方文档给出的角色权限适用vSphere Client 6.0.x与6.5.x版本(更低的版本未验证);对vSphere Client 6.7.x版本,则权限不足,创建pvc时报Failed to provision volume with StorageClass "xxxxxx": ServerFaultCode: Permission to perform this operation was denied.错,可使用administrator账号替代。

三. disk UUID

通过govc工具,可以设置disk UUID,参考:GitHub vmware/govmomi

3.1 安装govc

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

3.2 设置govc环境变量

# 设置环境变量
export GOVC_URL='172.20.0.16' # vCenter ip地址或FQDN
export GOVC_USERNAME='administrator@vsphere.local' # vCenter administrator账号
export GOVC_PASSWORD='AIUc63$#v4LZ' # vCenter administrator账号密码
export GOVC_INSECURE=1 # 如果使用了自签名证书,设置为"1" # 设置环境变量后,可查看govc变量与版本
govc env
govc about

3.3 设置disk UUID

  • 通过govc可以确定kubernetes集群vm节点位置:
    # 格式:/<datacenter>/vm/<vsphere vm folder>
    # <datacenter>:vsphere中datacenter名,根据实际环境填写,这里取值"Mcloud";
    # vm:固定参数,如:vm,network,host,datastore;
    # <vsphere vm folder>:自定义名字的"vsphere vm folder",这里取值"kubernetes-cluster"
    govc ls /Mcloud/vm/kubernetes-cluster

  • 设置kubernetes集群vm节点的disk UUIDtrue
    # "disk.enableUUID=1"即为"true";
    # 将已设置"disk.enableUUID=1"的vm打成模板,通过模板克隆出新的vm可继承此属性
    govc vm.change -e="disk.enableUUID=1" -vm='/Mcloud/vm/kubernetes-cluster/kubemaster01'
    govc vm.change -e="disk.enableUUID=1" -vm='/Mcloud/vm/kubernetes-cluster/kubemaster02'
    govc vm.change -e="disk.enableUUID=1" -vm='/Mcloud/vm/kubernetes-cluster/kubemaster03'
  • 补充govc用法(与本实验无关):手工创建vmdk
    # 格式:datastore.disk.create -ds <DataStore> -size xG <Folder>/<Name>.vmdk
    # <DataStore>:需要调用的后端存储名字,这里取值"vsanDatastore";
    # <Folder>:<DataStore>中存放新建存储卷的目录,这里自定义目录名"k8sData",需要注意的是目录需要提前创建,否则会报错;
    # vmdk文件创建之后的初始大小为0kb
    govc datastore.disk.create -ds vsanDatastore -size 10G k8sData/MySQLDisk.vmdk

四. 部署vSphere Cloud Provider

4.1 创建vSphere Cloud Provider配置文件(kubernetes v1.9.x and above)

  • 在所有kubernetes master节点创建文件(自定义路径&名字):/etc/kubernetes/vsphere.conf
    vim /etc/kubernetes/vsphere.conf
    # 全局属性
    [Global]
    # 从安全角度考虑,生产环境应使用针对性的账号
    user = "k8s@vsphere.local"
    password = "k8S!@Vcp123"
    port = "443"
    # 如果使用自签名证书,应设置为"1"
    insecure-flag = "1"
    datacenters = "Mcloud" # 针对kubernetes集群节点跨多vCenter的情况,可设置多"VirtualCenter";
    # "user","password","datacenters"也可设置在此,可覆盖全局属性
    [VirtualCenter "172.20.0.16"] # vSphere Cloud Provider使用"SPBM"存储策略配置存储卷
    [Workspace]
    # mandatory
    server = "172.20.0.16"
    # mandatory
    datacenter = "Mcloud"
    # mandatory
    folder = "kubernetes-cluster"
    # option,本实验省略;
    # kubernetes创建pvc资源时,如果选项中未指定数据存储或存储策略,则使用默认数据存储放置vmdk
    #default-datastore="vsanDatastore"
    # option,本实验省略;
    # 资源池文件夹,放置创建的vmdk
    #resourcepool-path="kubernetes-cluster" [Disk]
    # option;
    # lsilogic-sas or pvscsi, default: pvscsi
    scsicontrollertype = pvscsi [Network]
    # option,本实验省略;
    # Name of public VM Network to which the VMs in the cluster are connected. Used to determine public IP addresses of VMs.
    #public-network = "VM Network"

4.2 部署vSphere Cloud Provider(kubernetes v1.9.x and above)

  • 在所有kubernetes master节点,为kube-apiserver,kube-controller-manager,kubelet等3个服务添加参数:
    --cloud-provider=vsphere
    --cloud-config=/etc/kubernetes/vsphere.conf
  • 在所有kubernetes minion节点,为kubelet添加参数:
    --cloud-provider=vsphere
  • 重启相关服务。
    • 注意:如果kubelet使用了--cloud-provider参数,--hostname-override参数将失效
    • 如果使用了--hostname-override参数,必须删除状态为NotReady的节点,否则创建pvc时报错Failed to provision volume with StorageClass "storageclass01": No VM found,通过kubectl delete node <IP> 执行删除。

五. kubernetes使用vSAN

kubernetes可以通过以下方式调用vSAN:

5.1 基于SPBM存储策略动态创建存储卷

StorageClass

cat vsphere-storageclass-spbm.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: vsphere-storageclass-spbm
# 存储分配器,根据后端存储不同而变更
provisioner: kubernetes.io/vsphere-volume
# 默认即"Delete",删除pvc后,相应的pv及后端的volume等一起删除;
# 设置为"Retain"时则保留数据,需要手工处理
reclaimPolicy: Delete
parameters:
# 指定具体的datastore,如果不指定则采用在"vsphere-cloud-config-file(vsphere.conf)"中设置的默认"default-datastore"
datastore: vsanDatastore
# 默认即"thin",另有"zeroedthick"与"eagerzeroedthick"可选
diskformat: thin
# 磁盘格式,如:xfs,ext3,ext4等
fstype: xfs
# 以下两条是调用SPBM策略,SPBM策略有:cacheReservation,diskStripes,forceProvisioning,hostFailuresToTolerate,iopsLimit,objectSpaceReservation
# 以下设置是vCenter中默认的"Virtual SAN Default Storage Policy"的设置
hostFailuresToTolerate: "1"
diskStripes: "1" # 创建StorageClass
kubectl create -f vsphere-storageclass-spbm.yaml # 查看StorageClass
kubectl describe sc vsphere-storageclass-spbm

PVC & PV

  • 创建pvc

    cat vsphere-pvc002.yaml
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
    name: vsphere-pvc002
    # 调用StrageClass
    annotations:
    volume.beta.kubernetes.io/storage-class: vsphere-storageclass-spbm
    spec:
    # ReadWriteOnce:简写RWO,读写权限,且只能被单个node挂载;
    # ReadOnlyMany:简写ROX,只读权限,允许被多个node挂载;
    # ReadWriteMany:简写RWX,读写权限,允许被多个node挂载
    accessModes:
    - ReadWriteOnce
    resources:
    requests:
    # 注意格式,不能写“GB”
    storage: 10Gi # 创建PVC
    kubectl create -f vsphere-pvc002.yaml # 查看PVC
    kubectl describe pvc vsphere-pvc002

  • PV由PVC调用StorageClass自动创建

    # 查看自动创建的PV
    kubectl get pv
    kubecet describe pv pvc-b3754406-0359-11e9-b1f2-005056bfac1e

  • 同步查看vCenter信息

  • 查看在vSAN DataStore上生成的vmdk

Pod

cat vsphere-pod002.yaml
apiVersion: v1
kind: Pod
metadata:
name: vsphere-pod002
spec:
containers:
- name: test-container
# 使用中科大的镜像仓库
image: gcr.mirrors.ustc.edu.cn/google_containers/test-webserver
volumeMounts:
- name: test-volume
mountPath: /test-vmdk
volumes:
- name: test-volume
# Pod挂载PVC
persistentVolumeClaim:
claimName: vsphere-pvc002 # 创建Pod
kubectl create -f vsphere-pod002.yaml # 查看Pod
kubectl describe pod vsphere-pod002

Kubernetes调用vSphere vSAN做持久化存储的更多相关文章

  1. 14-使用glusterfs做持久化存储

    使用glusterfs做持久化存储 我们复用kubernetes的三台主机做glusterfs存储. 以下步骤参考自:https://www.xf80.com/2017/04/21/kubernete ...

  2. [转帖]14-使用glusterfs做持久化存储

    14-使用glusterfs做持久化存储 https://www.cnblogs.com/guigujun/p/8366558.html 使用glusterfs做持久化存储 我们复用kubernete ...

  3. kubernetes学习 做持久化存储

    本节演示如何为 MySQL 数据库提供持久化存储,步骤: 1.创建 PV 和 PVC 2.部署 MySQL 3.向 MySQL 添加数据 4.模拟节点宕机故障,Kubernetes 将 MySQL 自 ...

  4. Kubernetes 系列(六):持久化存储 PV与PVC

    在使用容器之后,我们需要考虑的另外一个问题就是持久化存储,怎么保证容器内的数据存储到我们的服务器硬盘上.这样容器在重建后,依然可以使用之前的数据.但是显然存储资源和 CPU 资源以及内存资源有很大不同 ...

  5. Redis持久化存储详解(一)

    > 为什么要做持久化存储? 持久化存储是将 Redis 存储在内存中的数据存储在硬盘中,实现数据的永久保存.我们都知道 Redis 是一个基于内存的 nosql 数据库,内存存储很容易造成数据的 ...

  6. Kubernetes持久化存储2——探究实验

    目录贴:Kubernetes学习系列 一.简介 本文在“创建PV,创建PVC挂载PV,创建POD挂载PVC”这个环境的基础上,进行各种删除实验,并记录.分析各资源的状态. 二.实验脚本 实验创建了一个 ...

  7. Kubernetes 学习(十)Kubernetes 容器持久化存储

    0. 前言 最近在学习张磊老师的 深入剖析Kubernetes 系列课程,最近学到了 Kubernetes 容器持久化存储部分 现对这一部分的相关学习和体会做一下整理,内容参考 深入剖析Kuberne ...

  8. Kubernetes 持久化存储是个难题,解决方案有哪些?\n

    像Kubernetes 这样的容器编排工具正在彻底改变应用程序的开发和部署方式.随着微服务架构的兴起,以及基础架构与应用程序逻辑从开发人员的角度解耦,开发人员越来越关注构建软件和交付价值. Kuber ...

  9. Kubernetes的故事之持久化存储(十)

    一.Storage 1.1.Volume 官网网址:https://kubernetes.io/docs/concepts/storage/volumes/ 通过官网说明大致总结下就是这个volume ...

随机推荐

  1. Georgia Tech Online Master of Science in Computer Science 项目经验分享

    Georgia Tech Online Master of Science in Computer Science 项目经验分享 Posted on 2014/04/22 项目关键词:工科名校,计算机 ...

  2. sql server 数据库作业备份存储过程

    DECLARE @fileName nvarchar(100) SET @fileName='D:\HFS\DataBase' + REPLACE(REPLACE(REPLACE(REPLACE(CO ...

  3. [BeiJing2006]狼抓兔子

    题面 一眼看就是最小割板子题,建图也很直观,注意每一条边建双向边其实不用建4条边,只要反向边的容量和正边相同就行.然后直接跑最大流板子就行.不过此题拿vector存图会MLE……而拿链前存图就能卡过去 ...

  4. 理解RHEL上安装oracle的配置参数 :/etc/security/limits.conf, /etc/profile, /etc/pam.d/login

    无论安装什么版本的Oracle,在安装之前,都需要配置 /etc/pam.d/login   /etc/profile   /etc/security/limits.conf这三个文件 那这三个文件究 ...

  5. QGIS里的编程模型

    项目(QgsProject) 用于读写项目状态 图层分组(QgsLayerTreeGroup) 项目树的分组节点,用来存放图层节点. 图层节点(QgsLayerTreeLayer) 项目树的图层节点. ...

  6. 理解传说中的roll、yaw、pitch

    三维中 Yaw, pitch and roll 的区分(图片)                    yaw 航偏                                         pi ...

  7. OpenCV——输入输出XML和YAML文件

  8. leetcode25—Search Insert Position

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  9. Git同时使用不同平台代码仓库

    问题描述 公司项目使用代码仓库为gitinn/gitlab等,个人项目使用github进行托管,而公司项目和个人项目设置的邮箱和用户名是不同的,而ssh的密钥对又是基于这两个信息生成的,所以此时想要同 ...

  10. 如何利用Grunt生成对应的Source Map文件,线上代码压缩使用chrome浏览器便于调式

    如何利用Grunt生成对应的Source Map文件,线上代码压缩使用chrome浏览器便于调式 首先我们来说说为何要生成sourceMap文件呢?简单的说,sourceMap是为了压缩后的代码调式提 ...