SUSE Edge 文档|SUSE Telco Cloud 文档|生命周期操作

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 群集:

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