参考

一. 框架



说明:

  • 在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. [python]关于在python中模块导入问题追加总结

    [背景] 最近在写程序时,我使用的eclipse编辑器运行都没有问题,然后部署到自动化环境上却偏偏报找不到相应模块问题,现在对该问题在之前的贴子上追加总结 原帖子:[python]关于python中模 ...

  2. 「2017 山东一轮集训 Day5」字符串

    题目 比较神仙的操作啊 首先先考虑一个串的做法,我们有两种:SA或SAM,其中SAM又有两种,拓扑图上的\(dp\)和\(parent\)上随便统计一下 显然这道题\(SA\)和\(parent\)树 ...

  3. Spring(十六)之MVC框架

    MVC 框架教程 Spring web      MVC 框架提供了模型-视图-控制的体系结构和可以用来开发灵活.松散耦合的 web 应用程序的组件.MVC 模式导致了应用程序的不同方面(输入逻辑.业 ...

  4. 爬虫header和cookie

    def on_start(self): self.crawl('http://bbs.byr.cn/board/Python', headers={'X-Requested-With': 'XMLHt ...

  5. jmeter测试webservice接口

    webservice怎样使用jmeter测试呢? 测试样例url=http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx ...

  6. ICC Stage Flow

    initial: reference library(mw), link library(db), create_mw_lib, read_verilog, link create_floorplan ...

  7. selenium自动化环境搭建(Windows)

    参考内容:虫师<selenium2自动化测试实战-基于python语言> 一.selenium介绍 selenium主要用于web应用程序的自动化测试,还支持所有基于web的管理任务自动化 ...

  8. Android Fragment(三)ListFragment简单介绍以及Fragment之间通信

    一.Fragment通信简单介绍:Fragments之间是不能够直接通信的,他们之间的通信是通过Activity这个中间件来通信的, 为了让Fragment跟它的Activity通信,我们可以在Fra ...

  9. 字典树Trie树

    摘自大佬博客 https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html 给出n个单词和m个询问1.查询某个前缀是否出现过2.查询某个单词是否出现过 ...

  10. TCP和UDP套接字编程 (java实现)

    在了解网络编程之前,我们先了解一下什么叫套接字 套接字即指同一台主机内应用层和运输层之间的接口 由于这个套接字是建立在网络上建立网络应用的可编程接口 因此也将套接字称为应用程序和网络之间的应用程序编程 ...