配置 vSphere Cloud Provider
在 IBM® Cloud Private 集群中配置 vSphere Cloud Provider。
注:vSphere Cloud Provider 仅支持对持久卷使用 ReadWriteOnce 访问方式。
先决条件
确保集群中的节点满足以下需求:
- 所有 IBM® Cloud Private 集群节点必须位于一个 vSphere VM 文件夹下。
- 所有 IBM Cloud Private 主节点必须能够访问 vCenter。
- 节点主机名必须与 VM 名称相同。
- 节点主机名必须符合正则表达式
[a-z](([-0-9a-z]+)?[0-9a-z])?(\.[a-z0-9](([-0-9a-z]+)?[0-9a-z])?)*
,并且还必须遵守以下限制:- 不能以数字开头。
- 不能使用大写字母。
- 不能包含除
.
和-
以外的任何特殊字符。 - 必须包含至少三个字符,但不超过 63 个字符。
- 必须启用节点 VM 上的磁盘 UUID:
disk.EnableUUID
值必须设置为True
。 - 在 vSphere 云配置中指定的用户必须具有与 vCenter 交互的权限。
角色 | 权限 | 实体 | 传播到子代 |
---|---|---|---|
manage-k8s-node-vms |
|
|
是 |
manage-k8s-volumes |
|
数据存储器 | 否 |
k8s-system-read-and-spbm-profile-view |
|
vCenter | 否 |
ReadOnly |
|
|
否 |
源:https://kubernetes.io/docs/getting-started-guides/vsphere/
配置 vSphere Cloud Provider
- 如果要在 IBM Cloud Private 安装期间配置 vSphere Cloud Provider,请完成将 vSphere 信息添加到
config.yaml
文件中的步骤。 - 如果要在安装 IBM Cloud Private 之后配置 vSphere Cloud Provider,请完成下列部分中的步骤。
更新除主节点外的所有集群节点
完成除主节点外的所有节点上的下列步骤。
-
将下列代码段添加到
/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
-
重新装入 kubelet systemd 单元文件。
systemctl daemon-reload
-
重新启动 kubelet 服务。
systemctl restart kubelet.service
-
当重新启动 kubelet 服务时,可能会丢失手动添加到节点的任何标签或污点。 如果发生这种情况,您现在可以将其添加回去。
更新所有主节点
完成 IBM Cloud Private 集群中所有主节点上的下列步骤。
-
创建包含下列参数的 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
。
- 如果节点 VM 位于 root 文件夹中,请设置
scsicontrollertype
是用于访问虚拟盘的小型计算机系统接口 (SCSI) 控制器类型。
-
将以下代码段添加至 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", . . .
-
-
重新装入 kubelet systemd 单元文件。
systemctl daemon-reload
-
重新启动 kubelet 服务。
systemctl restart kubelet.service
-
当重新启动 kubelet 服务时,可能会丢失手动添加到节点的任何标签或污点。 如果发生这种情况,您现在可以将其添加回去。
接下来,完成移除旧节点中的步骤。
移除旧节点
仅当安装期间未在 config.yaml
文件中设置 kubelet_nodename: hostname
时,才完成此部分中的步骤。
删除具有 IP 地址的旧节点。 可从集群中的任何节点或从远程工作站运行这些命令。
-
确保已设置 Kubectl CLI。 请参阅从 kubectl CLI 访问集群。
-
移除旧节点。
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
文件:
- 打开
/<installation_directory>/cluster
文件夹中的config.yaml
文件。 - 在
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>
其中:
kubelet_nodename
:必须设置为hostname
。cloud_provider
:必须设置为vsphere
。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
。
- 如果节点 VM 位于 root 文件夹中,请设置
后续操作
-
如果尚未安装 IBM Cloud Private 集群,请继续执行 IBM Cloud Private 安装。
-
如果 IBM Cloud Private 安装完成,请创建存储类以使用 vSphere 存储。 有关指示信息,请参阅为 vSphere 卷创建存储类。