配置 vSphere Cloud Provider

在 IBM® Cloud Private 集群中配置 vSphere Cloud Provider。

注:vSphere Cloud Provider 仅支持对持久卷使用 ReadWriteOnce 访问方式。

先决条件

确保集群中的节点满足以下需求:

表 1. vSphere Cloud Provider 用户
角色 权限 实体 传播到子代
manage-k8s-node-vms
  • Resource.AssignVMToPool
  • System.Anonymous
  • System.Read
  • System.View
  • VirtualMachine.Config.AddExistingDisk
  • VirtualMachine.Config.AddNewDisk
  • VirtualMachine.Config.AddRemoveDevice
  • VirtualMachine.Config.RemoveDisk
  • VirtualMachine.Inventory.Create
  • VirtualMachine.Inventory.Delete
  • 集群
  • 主机
  • VM 文件夹
manage-k8s-volumes
  • Datastore.AllocateSpace
  • Datastore.FileManagement
  • System.Anonymous
  • System.Read
  • System.View
数据存储器
k8s-system-read-and-spbm-profile-view
  • StorageProfile.View
  • System.Anonymous
  • System.Read
  • System.View
vCenter
ReadOnly
  • System.Anonymous
  • System.Read
  • System.View
  • 数据中心
  • 数据存储器集群
  • 数据存储器存储文件夹

https://kubernetes.io/docs/getting-started-guides/vsphere/ 在标签页中打开

配置 vSphere Cloud Provider

更新除主节点外的所有集群节点

完成除主节点外的所有节点上的下列步骤。

  1. 将下列代码段添加到 /etc/systemd/system/kubelet.service 文件的 [Service] 部分下。

    --cloud-provider=vsphere
    

    添加该代码后,文件内容将类似于以下文本:

    [Unit]
    Description=Kubelet Service
    Documentation=https://github.com/kubernetes/kubernetes
    [Service]
    EnvironmentFile=-/etc/environment
    ExecStart=/opt/kubernetes/hyperkube kubelet \
     --feature-gates Accelerators=true,ExperimentalCriticalPodAnnotation=true \
     .
     .
     .
     --cloud-provider=vsphere \
     --fail-swap-on=false
    Restart=always
    RestartSec=10
    [Install]
    WantedBy=multi-user.target
    
  2. 重新装入 kubelet systemd 单元文件。

    systemctl daemon-reload
    
  3. 重新启动 kubelet 服务。

    systemctl restart kubelet.service
    
  4. 当重新启动 kubelet 服务时,可能会丢失手动添加到节点的任何标签或污点。 如果发生这种情况,您现在可以将其添加回去。

更新所有主节点

完成 IBM Cloud Private 集群中所有主节点上的下列步骤。

  1. 创建包含下列参数的 vSphere Cloud Provider 配置文件并将其另存为 <name>.conf 文件。 将该文件复制到 /etc/cfc/conf/ 位置。 此位置是一个可供 kubelet 容器、控制器管理器 Pod 和 API 服务器 Pod 访问的共享目录。

    [Global]
       user=<vCenter username for vSphere Cloud Provider>
       password=<password for vCenter user>
       server=<vCenter server IP address or FQDN>
       port=[vCenter server port; default: 443]
       insecure-flag=[set to 1 if vCenter uses a self-signed certificate]
       datacenter=<datacenter name on which node VMs are deployed>
       datastore=<default datastore to be used for provisioning volumes>
       working-dir=<vCenter VM folder path in which node VMs are located>
    [Disk]
       scsicontrollertype=pvscsi
    

    其中:

    • user:vCenter 的用户名。 所有 vCenter 操作都使用该用户的凭证执行。
    • password:在 user 参数中指定的用户的密码。
    • server:vCenter 服务器的 IP 地址或标准域名 (FQDN)。
    • port:用于设置 vCenter 的端口号。 缺省值是 443
    • insecure_flag:如果 vCenter 使用自签名证书,请将其设置为 1
    • datacenter:部署了节点 VM 的数据中心的名称。
    • datastore:用于存放使用存储类创建的 PersistentVolume 的数据存储的名称。 即使数据存储位于某个文件夹中或者是数据存储集群的成员,也仅指定名称。 数据存储名称区分大小写。
    • working_dir:节点 VM 位于 vCenter 中的文件夹名称或路径。 文件夹名称或路径区分大小写。
      • 如果节点 VM 位于 root 文件夹中,请设置 working_dir: ""
      • 如果节点 VM 位于 root 文件夹下的某个文件夹中,那么用于设置路径的格式为 working_dir: Folder1_name
      • 如果节点 VM 位于 root 文件夹下的嵌套文件夹中,那么用于设置路径的格式为 working_dir: Folder1_name/Folder2_name
    • scsicontrollertype 是用于访问虚拟盘的小型计算机系统接口 (SCSI) 控制器类型。
  2. 将以下代码段添加至 kubelet 以及控制器管理器和 API 服务器清单文件。

    --cloud-provider=vsphere
    --cloud-config=<full-path-to-the-vsphere.conf-file>
    
    • 将该代码添加到 /etc/systemd/system/kubelet.service 文件的 [Service] 部分下。

      添加该代码后,文件内容将类似于以下文本:

       [Unit]
      Description=Kubelet Service
      Documentation=https://github.com/kubernetes/kubernetes
      
       [Service]
       EnvironmentFile=-/etc/environment
       ExecStart=/opt/kubernetes/hyperkube kubelet \
         --feature-gates Accelerators=true,ExperimentalCriticalPodAnnotation=true \
         --allow-privileged=true \
         --cadvisor-port=0 \
         .
         .
         .
         --cloud-provider=vsphere \
         --cloud-config=/etc/cfc/conf/vsphere.conf \
         --fail-swap-on=false
      
       Restart=always
      RestartSec=10
      
       [Install]
       WantedBy=multi-user.target
      
    • 将该代码添加到 /etc/cfc/pods/master.json 文件的 "spec">"containers">"name": "controller-manager">"command""spec">"containers">"name": "apiserver">"command" 部分下。

      添加该代码后,文件内容将类似于以下文本:

        "spec":{
            "hostNetwork": true,
            "containers":[
              {
                "name": "controller-manager",
                "image": "registry.ng.bluemix.net/mdelder/hyperkube:v1.11.0",
                "imagePullPolicy": "IfNotPresent",
                "command": [
                  "/hyperkube",
                  "controller-manager",
                  "--master=https://127.0.0.1:8001",
                  "--service-account-private-key-file=/etc/cfc/conf/server.key",
                  "--cloud-provider=vsphere",
                  "--cloud-config=/etc/cfc/conf/vsphere.conf",
                  .
                  .
                  .
                  "name": "apiserver",
                  "image": "registry.ng.bluemix.net/mdelder/hyperkube:v1.11.0",
                  "imagePullPolicy": "IfNotPresent",
                  "command": [
                    "/hyperkube",
                    "apiserver",
                    "--secure-port=8001",
                    "--bind-address=0.0.0.0",
                    "--advertise-address=10.10.25.206",
                    "--cloud-provider=vsphere",
                    "--cloud-config=/etc/cfc/conf/vsphere.conf",
                    .
                    .
                    .
      
  3. 重新装入 kubelet systemd 单元文件。

    systemctl daemon-reload
    
  4. 重新启动 kubelet 服务。

    systemctl restart kubelet.service
    
  5. 当重新启动 kubelet 服务时,可能会丢失手动添加到节点的任何标签或污点。 如果发生这种情况,您现在可以将其添加回去。

接下来,完成移除旧节点中的步骤。

移除旧节点

仅当安装期间未在 config.yaml 文件中设置 kubelet_nodename: hostname 时,才完成此部分中的步骤。

删除具有 IP 地址的旧节点。 可从集群中的任何节点或从远程工作站运行这些命令。

  1. 确保已设置 Kubectl CLI。 请参阅从 kubectl CLI 访问集群

  2. 移除旧节点。

    a. 获取有关节点的信息。

     kubectl get nodes
    

    输出类似于以下文本:

     NAME            STATUS     ROLES     AGE       VERSION
     10.10.25.6      NotReady   <none>    7d        v1.11.0
     10.10.25.3      NotReady   <none>    7d        v1.11.0
     master          Ready      <none>    55s       v1.11.0
     worker1         Ready      <none>    45s       v1.11.0
    

    b. 移除在 Name 字段下具有 IP 地址的节点。

     kubectl delete node <IP-address>
    

    以下是样本命令和输出:

     kubectl delete node 10.10.25.3
     node "10.10.25.3" deleted
    

    c. 验证该节点是否已删除。

     kubectl get nodes
    

    以下是样本输出:

     NAME            STATUS     ROLES     AGE       VERSION
     10.10.25.6      NotReady   <none>    7d        v1.11.0
     master          Ready      <none>    7m        v1.11.0
     worker1         Ready      <none>    7m        v1.11.0
    

将 vSphere 信息添加到 config.yaml 文件

完成以下步骤以更新 config.yaml 文件:

  1. 打开 /<installation_directory>/cluster 文件夹中的 config.yaml 文件。
  2. config.yaml 文件中,添加以下代码行:
    kubelet_nodename: hostname
    cloud_provider: vsphere
    vsphere_conf:
       user: "<vCenter username for vSphere Cloud Provider>"
       password: "<password for vCenter user>"
       server: <vCenter server IP or FQDN>
       port: [vCenter Server Port; default: 443]
       insecure_flag: [set to 1 if vCenter uses a self-signed certificate]
       datacenter: <datacenter name on which Node VMs are deployed>
       datastore: <default datastore to be used for provisioning volumes>
       working_dir: <vCenter VM folder path in which node VMs are located>
    

其中:

后续操作