Kubernetes调用vSphere vSAN做持久化存储

参考

一. 框架

说明:

  • 在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 [email protected] AIUc63$#v4LZ Mcloud -
    - - [email protected] [email protected] 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账号设置为[email protected]:
    • vSphere Web Clinet --> 主页 --> (系统管理)角色;
    • 添加用户:Single Sign-On --> 用户 --> 添加k8s账号 ;
    • 创建角色:访问控制--> 角色 --> 添加k8s-vcp角色,角色按照官方说明dynamic persistent volume provisioning with storage policy赋权;
    • 账号关联角色:访问控制--> 全局权限 --> 添加权限,关联账号与角色。
    • 补充:部分资料中角色权限中有System.*权限,此类权限不用特别赋权,默认即带,且在角色清单中也找不到System.*权限。

三. 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=‘[email protected]‘   # 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 = "[email protected]"
    password = "[email protected]"
    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参数,可以通过kubectl delete node <IP>删除状态为NotReady的节点。

五. 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
kubecet 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
    kubecet create -f vsphere-pvc002.yaml
    
    # 查看PVC
    kubecet 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
kubecet create -f vsphere-pod002.yaml

# 查看Pod
kubectl describe pod vsphere-pod002

原文地址:https://www.cnblogs.com/netonline/p/10143866.html

时间: 2024-08-30 08:19:11

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

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

在使用容器之后,我们需要考虑的另外一个问题就是持久化存储,怎么保证容器内的数据存储到我们的服务器硬盘上.这样容器在重建后,依然可以使用之前的数据.但是显然存储资源和 CPU 资源以及内存资源有很大不同,为了屏蔽底层的技术实现细节,让用户更加方便的使用,Kubernetes便引入了 PV 和 PVC 两个重要的资源对象来实现对存储的管理. 一.概念 PV 的全称是:PersistentVolume(持久化卷),是对底层的共享存储的一种抽象,PV 由管理员进行创建和配置,它和具体的底层的共享存储技术

K8S使用Ceph做持久化存储

一.概述 Cephfs 是一个基于 ceph 集群且兼容POSIX标准的文件系统.创建 cephfs 文件系统时需要在 ceph 集群中添加 mds 服务,该服务负责处理 POSIX 文件系统中的 metadata 部分,实际的数据部分交由 ceph 集群中的 OSDs 处理.cephfs 支持以内核模块方式加载也支持 fuse 方式加载.无论是内核模式还是 fuse 模式,都是通过调用 libcephfs 库来实现 cephfs 文件系统的加载,而 libcephfs 库又调用 librado

AKS使用Azure Disk实现动态持久化存储(下)

上一篇文章我们初步体验了AKS pod挂载Azure Disk的流程,这篇文章我们来正式部署一个mysql的服务来看下. 首先准备一个PVC,命名为mysql-pvc.yaml,内容如下: apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: accessModes: - ReadWriteOnce storageClassName: managed-premium resources: reques

kubernetes持久化存储,静态存储【pv】,动态存储【StorageClass】(5)

在开始介绍k8s持久化存储前,我们有必要了解一下k8s的emptydir和hostpath.configmap以及secret的机制和用途 1.EmptydirEmptyDir是一个空目录,他的生命周期和所属的 Pod 是完全一致的,pod删掉目录消失 2.HostpathHostpath会把宿主机上的指定卷加载到容器之中,如果 Pod 发生跨主机的重建,其内容就难保证了 3.ConfigmapConfigMap跟Secrets类似,但是ConfigMap可以更方便的处理不包含敏感信息的字符串.

使用Ceph集群作为Kubernetes的动态分配持久化存储

使用Docker快速部署Ceph集群 , 然后使用这个Ceph集群作为Kubernetes的动态分配持久化存储. Kubernetes集群要使用Ceph集群需要在每个Kubernetes节点上安装ceph-common

Longhorn:实现Kubernetes集群的持久化存储

Longhorn项目是Rancher Labs推出的开源的基于云和容器部署的分布式块存储新方式.Longhorn遵循微服务的原则,利用容器将小型独立组件构建为分布式块存储,并使用容器编排来协调这些组件,形成弹性分布式系统. 自2017年4月Longhorn项目发布以来,人们对在Kubernetes集群上运行Longhorn存储就产生了极大的兴趣.近日,Longhorn v0.2版本发布了,它可支持任何Kubernetes集群的持久化存储实现! Why Longhorn 如今,基于云和容器的部署规

Apache Stratos Mock架构及持久化存储卷的映射

Apache Stratos Mock IaaS 简介 Apache Stratos 支持许多基础设施作为服务 (IaaS) 的平台:EC2,OpenStack,vCloud,CloudStack,Docker等.然而,设立IaaS 或购买公共 IaaS 服务对于尝试Stratos来说是额外的开销.此外,设置本地 IaaS 需要大量的硬件资源和购买公有云上的IaaS账户所涉及的成本.这些对尝试Stratos带来了障碍 Stratos. 通过引入Docker/Kubernetes来支持Linux容

一文读懂 K8s 持久化存储流程

作者 | 孙志恒(惠志)? 阿里巴巴开发工程师<br /> 导读:众所周知,K8s 的持久化存储(Persistent Storage)保证了应用数据独立于应用生命周期而存在,但其内部实现却少有人提及.K8s?内部的存储流程到底是怎样的?PV.PVC.StorageClass.Kubelet.CSI 插件等之间的调用关系又如何,这些谜底将在本文中一一揭晓. K8s 持久化存储基础 在进行 K8s 存储流程讲解之前,先回顾一下 K8s 中持久化存储的基础概念. 1. 名词解释 in-tree:代

iOS数据持久化存储

本文中的代码托管在github上:https://github.com/WindyShade/DataSaveMethods 相对复杂的App仅靠内存的数据肯定无法满足,数据写磁盘作持久化存储是几乎每个客户端软件都需要做的.简单如"是否第一次打开"的BOOL值,大到游戏的进度和状态等数据,都需要进行本地持久化存储.这些数据的存储本质上就是写磁盘存文件,原始一点可以用iOS本身支持有NSFileManager这样的API,或者干脆C语言fwrite/fread,Cocoa Touch本身