• 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 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
    

  • 相关阅读:
    margin问题
    IE6里面子集尺寸大的会把父亲撑大
    第一个元素<flout>写了,想在他的旁边加一个元素.IE6会出现缝隙. 不要用margin撑开,要用flout
    兼容性,float
    HTML5的兼容问题以及调用js文件的方法
    表单
    表格的编写,课程表
    SmartThreadPool
    C# 多线程的等待所有线程结束的一个问题
    DataTable保存与读取 stream
  • 原文地址:https://www.cnblogs.com/netonline/p/10143866.html
Copyright © 2020-2023  润新知