请参阅以下说明,以基于自定义 ClusterClass 置备 TKG 集群。请注意,这些说明特定于 vSphere 8 U2 及更高版本环境。
必备条件
在 vSphere 8 U2 版本中,更新了基于自定义 ClusterClass 置备 TKG 集群的过程。
请遵循以下必备条件。
- vSphere 8 U2+ 环境
- 已启用工作负载管理
- 已配置主管
- 安装了 适用于 vSphere 的 Kubernetes CLI 工具 的 Ubuntu 客户端
注意: 根据上游集群 API
文档,自定义 ClusterClass 是一种实验性 Kubernetes 功能。由于自定义 ClusterClass 可用的自定义范围,VMware无法测试或验证所有可能的自定义。客户负责测试、验证其自定义 ClusterClass 集群以及进行故障排除。客户可以提交有关其自定义 ClusterClass 集群的支持请求,VMware 技术支持团队会尽最大努力提供帮助,但无法保证解决针对自定义 ClusterClass 集群提出的每个问题。在生产环境中部署自定义 ClusterClass 集群之前,客户应了解这些风险。
高级别工作流
简要工作流如下所示。
只需使用以下工作流即可开始。
请参阅以下工作流,对自定义 ClusterClass 进行更改,并启动对自定义 ClusterClass 集群节点进行滚动更新。
步骤 | 任务 | 说明 |
---|---|---|
1 | 通过克隆默认 ClusterClass 创建自定义 ClusterClass。 | 1:创建自定义 ClusterClass |
2 | 根据自定义 ClusterClass 置备新的 TKG 集群,并确认所有集群节点均正确启动。 | 2:基于自定义 ClusterClass 创建 TKG 集群 |
注: 以下工作流中展示的操作只是可以对自定义 ClusterClass 执行的操作示例。您的用例可能会有所不同,但常规工作流应适用。
步骤 | 任务 | 说明 |
---|---|---|
3 | 通过 SSH 登录到其中一个工作节点,以确认有要更新的软件包。 | 3:验证是否存在软件包更新 |
4 | 更新自定义 ClusterClass,在其中添加执行更新的新命令。 | 4:更新自定义 ClusterClass |
5 | 确认更新已经运行的新节点部署。 | 5:验证集群节点的滚动更新 |
1:创建自定义 ClusterClass
第一部分涉及通过克隆名为
tanzukubernetescluster
的默认 ClusterClass 创建名为
ccc
(
customclusterclass
的缩写形式)的自定义 ClusterClass。
注: 自定义 ClusterClass 名称是用户定义的。如果使用其他名称,请相应地调整说明。
- 创建并配置一个名为 ccc-ns 的 vSphere 命名空间。
配置权限、存储、内容库和虚拟机类。根据需要,请参阅文档。
注: vSphere 命名空间 名称是用户定义的。如果使用其他名称,请相应地调整说明。 - 登录到 主管。
kubectl vsphere login --server=IP-ADDRESS --vsphere-username [email protected]
- 将默认 ClusterClass 的输出写入名为 ccc.yaml 的文件。
kubectl -n ccc-ns get clusterclass tanzukubernetescluster -o yaml > ccc.yaml
或者,快捷方式版本:kubectl -n ccc-ns get cc tanzukubernetescluster -o yaml > ccc.yaml
- 打开 以编辑克隆的 ClusterClass 文件。
vim ccc.yaml
- 编辑文件
ccc.yaml
。- 删除行
metadata.creationTimestamp
- 删除行
metadata.generation
- 删除行
metadata.resourceVersion
- 删除行
metadata.uid
- 将
metadata.name
值从tanzukubernetescluster
更改为ccc
- 将
metadata.namespace
值保留不变:ccc-ns
- 对于
run.tanzu.vmware.com/resolve-tkr: ""
,将metadata.annotations
值保留不变。TKR 数据/解析需要此注释。
- 删除行
- 保存并验证更改。
apiVersion: cluster.x-k8s.io/v1beta1 kind: ClusterClass metadata: annotations: run.tanzu.vmware.com/resolve-tkr: "" name: ccc namespace: ccc-ns spec: ...
- 创建自定义 ClusterClass 对象。
kubectl apply -f ccc.yaml -n ccc-ns
预期结果:clusterclass.cluster.x-k8s.io/ccc created
- 列出自定义 ClusterClass。
kubectl get cc -n ccc-ns
预期结果:NAME AGE ccc 3m14s tanzukubernetescluster 29m
2:基于自定义 ClusterClass 创建 TKG 集群
使用
集群 v1beta1 API 基于 ClusterClass 创建集群。
- 构建
ccc-cluster.yaml
清单以置备集群。#ccc-cluster.yaml apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ccc-cluster spec: clusterNetwork: pods: cidrBlocks: - 192.0.2.0/16 services: cidrBlocks: - 198.51.100.0/12 serviceDomain: cluster.local topology: class: ccc version: v1.26.5---vmware.2-fips.1-tkg.1 controlPlane: replicas: 1 workers: machineDeployments: - class: node-pool name: tkgs-node-pool-1 replicas: 1 variables: - name: vmClass value: guaranteed-small - name: storageClass value: tkg-storage-profile
其中:metadata.name
值是集群的名称:ccc-cluster
spec.topology.class
值是自定义 ClusterClass 的名称:ccc
spec.topology.version
值是 TKR 版本spec.topology.variables.storageClass
值是持久存储类的名称
注: 对于测试,控制平面和工作节点池使用 1 个副本足以满足要求。在生产环境中,控制平面使用 3 个副本,每个工作节点池至少使用 3 个副本。 - 基于自定义 ClusterClass 创建 TKG 集群。
kubectl apply -f ccc-cluster.yaml -n ccc-ns
预期结果:cluster.cluster.x-k8s.io/ccc-cluster created
- 验证集群置备。
运行以下命令等待所有集群节点正确启动。
kubectl -n ccc-ns get cc,clusters,vsphereclusters,kcp,machinedeployment,machineset,machine,vspheremachine,virtualmachineservice
注: 在单独的会话中运行此命令会很有帮助,这样可以在步骤 5 中监控滚动更新进度。
3:验证是否存在软件包更新
通过 SSH 登录到其中一个工作节点,以确认有要更新的软件包。
注: 此步骤的目的只是确认有要更新的软件包,而不是实际进行更新。推出新的集群节点时,将由自定义 ClusterClass 更新这些软件包(此步骤后的步骤)。此步骤和后续步骤只是示例,用于说明可以对自定义 ClusterClass 执行的操作。
- 运行以下命令以获取 SSH 密钥。
export CC=ccc-cluster && kubectl get secret -n ccc-ns ${CC}-ssh -o jsonpath={.data.ssh-privatekey} | base64 -d > ${CC}-ssh && chomd 4000 ${CC}-ssh
- 运行以下命令,获取工作节点虚拟机的 IP 地址。
kubectl -n ccc-ns get vm -o wide
注: 如果部署了多个工作节点,请选择一个。请勿使用控制平面节点。 - 运行以下命令,通过 SSH 登录到工作节点虚拟机。
ssh -i ${CC}-ssh vmware-system-user@IP-ADDRESS-OF-WORKER-NODE
例如:ssh -i ${CC}-ssh [email protected]
注: 输入“yes”以继续连接。预期结果:通过 SSH 登录到主机后,您应该会看到以下消息。tdnf update info not availble yet!
- 运行以下命令并检查更新。
sudo -i
tdnf update
- 在提示符下,输入“N”表示否(不更新)。
预期结果:
Operation aborted
注: 此处的目的只是检查是否存在更新,而不是启动更新。在下一部分中,将通过向自定义 ClusterClass 添加命令来启动更新。 - 键入“exit”以注销 SSH 会话,然后再次键入“exit”。
4:更新自定义 ClusterClass
更新自定义 ClusterClass,在其中添加执行 tdnf 更新的新命令。
- 打开名为
ccc
的自定义 ClusterClass 以进行编辑。kubectl edit cc ccc -n ccc-ns
- 向下滚动到包含
postKubeadmCommands
的以下部分。- definitions: - jsonPatches: - op: add path: /spec/template/spec/kubeadmConfigSpec/postKubeadmCommands valueFrom: template: | - touch /root/kubeadm-complete - vmware-rpctool 'info-set guestinfo.kubeadm.phase complete' - vmware-rpctool 'info-set guestinfo.kubeadm.error ---' selector: apiVersion: controlplane.cluster.x-k8s.io/v1beta1 kind: KubeadmControlPlaneTemplate matchResources: controlPlane: true - jsonPatches: - op: add path: /spec/template/spec/postKubeadmCommands valueFrom: template: | - touch /root/kubeadm-complete - vmware-rpctool 'info-set guestinfo.kubeadm.phase complete' - vmware-rpctool 'info-set guestinfo.kubeadm.error ---' selector: apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 kind: KubeadmConfigTemplate matchResources: machineDeploymentClass: names: - node-pool name: controlPlanePostKubeadmCommandsSuccess
将以下命令添加到两个valueFrom.template
字段中。- tdnf update -y
例如:- definitions: - jsonPatches: - op: add path: /spec/template/spec/kubeadmConfigSpec/postKubeadmCommands valueFrom: template: | - touch /root/kubeadm-complete - vmware-rpctool 'info-set guestinfo.kubeadm.phase complete' - vmware-rpctool 'info-set guestinfo.kubeadm.error ---' - tdnf update -y selector: apiVersion: controlplane.cluster.x-k8s.io/v1beta1 kind: KubeadmControlPlaneTemplate matchResources: controlPlane: true - jsonPatches: - op: add path: /spec/template/spec/postKubeadmCommands valueFrom: template: | - touch /root/kubeadm-complete - vmware-rpctool 'info-set guestinfo.kubeadm.phase complete' - vmware-rpctool 'info-set guestinfo.kubeadm.error ---' - tdnf update -y selector: apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 kind: KubeadmConfigTemplate matchResources: machineDeploymentClass: names: - node-pool name: controlPlanePostKubeadmCommandsSuccess
- 保存对自定义 ClusterClass 所做的更改并关闭编辑器。
wq
预期结果:clusterclass.cluster.x-k8s/ccc edited
5:验证集群节点的滚动更新
更新自定义 ClusterClass 会触发对基于该 ClusterClass 置备的集群的集群节点执行滚动更新。应用了上述命令后,会出现新节点。
- 运行以下命令,验证集群置备。
等待所有集群节点正确启动。
kubectl -n ccc-ns get cc,clusters,vsphereclusters,kcp,machinedeployment,machineset,machine,vspheremachine,virtualmachineservice
- 您应该会看到部署了具有新 UUID 的新节点。
- 运行以下命令,通过 SSH 登录到工作节点虚拟机。
ssh -i ${CC}-ssh vmware-system-user@IP-ADDRESS-OF-WORKER-NODE
预期结果:通过 SSH 登录到主机后,您应该会看到以下消息。tdnf update info not availble yet!
- 运行下列命令。
sudo -i
tdnf update
预期结果:应看到需要更新的软件包较少。
- 在提示符下,输入“N”表示否(不更新)。
预期结果:
Operation aborted
- 运行以下命令以确认 tdnf 已运行。
cat /var/log/cloud-init-output.log | grep -i tdnf
- 键入“exit”以注销 SSH 会话,然后再次键入“exit”。
维护自定义 ClusterClass
将 TKG 服务 升级到新版本后,必须确保使用对新 TKG 服务 版本附带的默认 ClusterClass 所做的更改更新从先前 TKG 服务 版本的默认 ClusterClass 派生的自定义 ClusterClass。
使用以下工作流使自定义 ClusterClass 与系统提供的 ClusterClass 保持同步。请注意,这些说明假定您已按照本文所述创建了初始自定义 ClusterClass。
- 升级 TKG 服务 版本。
例如,从 TKG 服务 v3.0 升级到 v3.1。
请参见安装和升级 TKG 服务。
- 按照此处的说明创建新的自定义 ClusterClass。
通过在新自定义 ClusterClass 的名称后面附加 TKG 服务 版本(例如,
ccc-3.1
)来手动对其进行版本控制。 - 将先前自定义 ClusterClass 中的自定义修补程序和变量添加到新的自定义 ClusterClass。
为此,请添加
cat ccc.yaml
,并将自定义修补程序和变量从其复制到ccc-3.1.yaml
。 - 应用新的自定义 ClusterClass 并等待协调成功。
- 通过编辑 Cluster 对象中的
spec.topology.class
字段,使用以前的自定义 ClusterClass 将 TKG 集群更新为新的自定义 ClusterClass。
非受管 ClusterClass
对于 vSphere 8 U2+,有一个注释,如果您不希望 TKG 控制器管理自定义 ClusterClass,则可以将该注释添加到自定义 ClusterClass。请注意,如果添加此注释,您将负责手动创建所有底层 Kubernetes 对象,例如证书、密钥等。有关执行此操作的指导,请参阅 vSphere 8 U1 自定义 ClusterClass 文档。
注释如下所示:
下例介绍了如何将注释添加到名为
注释键 | 值 |
---|---|
run.tanzu.vmware.com/unmanaged-clusterclass | " " |
ccc
的自定义 ClusterClass:
apiVersion: cluster.x-k8s.io/v1beta1 kind: ClusterClass metadata: annotations: run.tanzu.vmware.com/resolve-tkr: "" run.tanzu.vmware.com/unmanaged-clusterclass: "" name: ccc namespace: ccc-ns spec: ...