44 生命周期操作 #
本章介绍通过 SUSE Telco Cloud 部署的群集的生命周期管理操作。
44.1 负载平衡器排除 #
许多生命周期操作都需要对节点进行排空。在排空过程中,所有 Pod 将被迁移到群集中的其他节点。排空完成后,该节点将不再承载任何服务,因此外部流量不应再路由至该节点。您可为节点添加标签,使 MetalLB 等负载平衡器感知该状态:
node.kubernetes.io/exclude-from-external-load-balancers: "true"有关详细信息,请参见 Kubernetes 文档。
要查看群集中所有节点的标签,可运行以下命令:
kubectl get nodes -o json | jq -r '.items[].metadata | .name, .labels'在下游群集升级场景中,可通过为管理群集上的 RKE2ControlPlane 添加注解,实现该操作的自动化:
rke2.controlplane.cluster.x-k8s.io/load-balancer-exclusion="true"该命令将立即为管理群集中该 RKE2ControlPlane 对应的所有计算机对象创建注解。
pre-drain.delete.hook.machine.cluster.x-k8s.io/rke2-lb-exclusion: ""当计算机对象带有该注解后,下游群集中所有计划被排空的节点将在排空流程开始前被添加上述节点标签。当节点恢复可用状态后,该标签将被去除。
44.2 管理群集升级 #
有关管理群集的升级步骤,请参见 Day 2 管理群集(第 36 章 “管理群集”)文档。
44.3 下游群集升级 #
升级下游群集涉及到更新多个组件。以下章节介绍了每个组件的升级过程。
升级操作系统
对于此过程,请参考此章节(第 43.2 节 “为联网场景准备下游群集映像”)来构建包含新操作系统版本的新映像。使用
EIB 生成此新映像后,下一置备阶段将使用提供的新操作系统版本。下一步骤将使用新映像来升级节点。
升级 RKE2 群集
需要做出以下更改才能使用自动化工作流程升级 RKE2 群集:
按照第 43.4 节 “使用定向网络置备来置备下游群集(单节点)”中所述更改
capi-provisioning-example.yaml中的RKE2ControlPlane块:指定所需的
rolloutStrategy。将
RKE2群集的版本更改为新版本(请替换以下代码中的${RKE2_NEW_VERSION})。
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: RKE2ControlPlane
metadata:
name: single-node-cluster
namespace: default
spec:
infrastructureRef:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: Metal3MachineTemplate
name: single-node-cluster-controlplane
version: ${RKE2_NEW_VERSION}
replicas: 1
rolloutStrategy:
type: "RollingUpdate"
rollingUpdate:
maxSurge: 0
serverConfig:
cni: cilium
rolloutStrategy:
rollingUpdate:
maxSurge: 0
registrationMethod: "control-plane-endpoint"
agentConfig:
format: ignition
additionalUserData:
config: |
variant: fcos
version: 1.4.0
systemd:
units:
- name: rke2-preinstall.service
enabled: true
contents: |
[Unit]
Description=rke2-preinstall
Wants=network-online.target
Before=rke2-install.service
ConditionPathExists=!/run/cluster-api/bootstrap-success.complete
[Service]
Type=oneshot
User=root
ExecStartPre=/bin/sh -c "mount -L config-2 /mnt"
ExecStart=/bin/sh -c "sed -i \"s/BAREMETALHOST_UUID/$(jq -r .uuid /mnt/openstack/latest/meta_data.json)/\" /etc/rancher/rke2/config.yaml"
ExecStart=/bin/sh -c "echo \"node-name: $(jq -r .name /mnt/openstack/latest/meta_data.json)\" >> /etc/rancher/rke2/config.yaml"
ExecStartPost=/bin/sh -c "umount /mnt"
[Install]
WantedBy=multi-user.target
kubelet:
extraArgs:
- provider-id=metal3://BAREMETALHOST_UUID
nodeName: "localhost.localdomain"按照第 43.4 节 “使用定向网络置备来置备下游群集(单节点)”中所述更改
capi-provisioning-example.yaml中的Metal3MachineTemplate块:将映像名称与校验和更改为在上一步骤中生成的新版本。
将指令
nodeReuse设置为true,以避免创建新节点。将指令
automatedCleaningMode设置为metadata,以启用节点自动清理。
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: Metal3MachineTemplate
metadata:
name: single-node-cluster-controlplane
namespace: default
spec:
nodeReuse: True
template:
spec:
automatedCleaningMode: metadata
dataTemplate:
name: single-node-cluster-controlplane-template
hostSelector:
matchLabels:
cluster-role: control-plane
image:
checksum: http://imagecache.local:8080/${NEW_IMAGE_GENERATED}.sha256
checksumType: sha256
format: raw
url: http://imagecache.local:8080/${NEW_IMAGE_GENERATED}.raw在应用 capi-provisioning-example.yaml 文件前,最佳实践是告知 MetalLB
等外部负载平衡器,部分节点即将被排空,避免其将流量路由至这些节点。如第 44.1 节 “负载平衡器排除”所述,可通过为管理群集上的 RKE2ControlPlane
添加注解,实现该操作的自动化。本示例中将为名为 multinode-cluster 的 RKE2ControlPlane 对象添加注解:
kubectl annotate RKE2ControlPlane/multinode-cluster rke2.controlplane.cluster.x-k8s.io/load-balancer-exclusion="true"验证计算机对象是否已成功添加注解:
pre-drain.delete.hook.machine.cluster.x-k8s.io/rke2-lb-exclusion: ""获取所有计算机对象的注解信息:
kubectl get machines -o json | jq -r '.items[].metadata | .name, .annotations'如果未添加这些注解,负载平衡器将无法感知已排空的节点,可能导致服务响应时间变长。
完成这些更改后,可以使用以下命令将 capi-provisioning-example.yaml 文件应用于群集:
kubectl apply -f capi-provisioning-example.yaml