|Index|SUSE Telco Cloud 文档|第 2 天运维|生命周期操作
适用范围 SUSE Telco Cloud 3.6

59 生命周期操作

本节涵盖了通过 SUSE Telco Cloud 部署的集群的生命周期管理操作。

59.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: ""

有了机器对象上的此注释,下游集群中任何计划进行排空的节点都会在排空过程开始前附加上述节点标签。一旦节点再次可用并就绪,该标签将从节点中移除。

59.2 管理集群升级

管理集群的升级在 Day 2 管理集群 (第 58 章 “管理群集”) 文档中有相关描述。

59.3 下游集群升级

升级下游集群涉及更新多个组件。以下章节涵盖了每个组件的升级过程。

升级操作系统

对于此过程,请查看以下 参考 (第 49 章 “为连接场景准备下游集群镜像”) 以使用新的操作系统版本构建新镜像。 使用由 EIB 生成的新镜像,下一个配置阶段将使用所提供的新操作系统版本。 在接下来的步骤中,新镜像将用于升级节点。

升级 RKE2 集群

使用自动化工作流升级 RKE2 集群所需的更改如下:

  • 更改以下 部分 (第 51 章 “使用定向网络配置(单节点)进行下游集群配置”) 中显示的 capi-provisioning-example.yaml 中的块 RKE2ControlPlane:

    • 指定所需的 rolloutStrategy。

    • 将 RKE2 集群的版本更改为替换 ${RKE2_NEW_VERSION} 的新版本。

    • 决定是否在下游集群中部署 Ingress 控制器:

      • [选项 0]:不部署任何 Ingress 控制器

      • [选项 1]:仅部署 Traefik

      • [选项 2]:同时部署 Ingress-NGINX 和 Traefik(用于复杂的 Ingress 迁移场景)

注意
注意

集成到 RKE2/K3s 中的 Traefik Ingress 提供程序是 SUSE Telco Cloud 3.6 版本中唯一受支持的 Ingress 控制器,虽然仍然可以暂时将 Ingress-NGINX 与 Traefik 一起运行以支持复杂的 Ingress 迁移场景,但前提是 SUSE Telco Cloud 管理集群和/或下游集群已升级到版本 3.6,且仅在执行该迁移所需的时间内。由于 Traefik 尚不是 RKE2 中的默认 Ingress 控制器(从 RKE2 v1.36 开始将是默认控制器),因此必须在 RKE2 服务器配置文件中明确“请求”它。

RKE2 Ingress NGINX 到 Traefik 迁移 指南提供了在 Traefik Ingress 控制器取代已停用的 Ingress-NGINX 后可用的 Ingress 迁移路径的详细信息。

apiVersion: controlplane.cluster.x-k8s.io/v1beta2
kind: RKE2ControlPlane
metadata:
  name: single-node-cluster
  namespace: default
spec:
  infrastructureRef:
    apiGroup: infrastructure.cluster.x-k8s.io
    kind: Metal3MachineTemplate
    name: single-node-cluster-controlplane
  version: ${RKE2_NEW_VERSION}
  replicas: 1
  rolloutStrategy:
    type: "RollingUpdate"
    rollingUpdate:
      maxSurge: 0
  serverConfig:
    cni: cilium
  #===========================================================================
  # Uncomment the following lines if selecting [Option 0]: Do not deploy
  # any ingress controller
  #===========================================================================
    #disableComponents:
    #  pluginComponents:
    #  - "rke2-ingress-nginx"
  #---------------------------------------------------------------------------
  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"
              ExecStart=/bin/sh -c "echo \"node-label:\" >> /etc/rancher/rke2/config.yaml"
              ExecStart=/bin/sh -c "echo \"  - metal3.io/uuid=$(jq -r .uuid /mnt/openstack/latest/meta_data.json)\" >> /etc/rancher/rke2/config.yaml"
              ExecStartPost=/bin/sh -c "umount /mnt"
              [Install]
              WantedBy=multi-user.target
          # rke2-ingress-deployment.service unit
          - name: rke2-ingress-deployment.service
            enabled: true
            contents: |
              [Unit]
              Description=rke2-ingress-deployment
              Wants=rke2-preinstall.service
              Before=rke2-install.service
              ConditionPathExists=!/run/cluster-api/bootstrap-success.complete
              [Service]
              Type=oneshot
              User=root
              #===============================================================================================================================
              # Leave one (and only one) of the two following ExecStart lines uncommented, depending on the desired ingress-controller(s):
              #   [Option 1]: Deploy only "Traefik"
              #   [Option 2]: Deploy both "Ingress-NGINX" and "Traefik"
              #
              # Keep both commented ONLY in case of seleting [Option 0]: "Do not deploy any ingress controller"
              #===============================================================================================================================
              #ExecStart=/bin/sh -c "echo \"ingress-controller: traefik\" >> /etc/rancher/rke2/config.yaml"                       # [Option 1]
              ExecStart=/bin/sh -c "echo -e \"ingress-controller:\n- ingress-nginx\n- traefik\" >> /etc/rancher/rke2/config.yaml" # [Option 2]
              #-------------------------------------------------------------------------------------------------------------------------------
              [Install]
              WantedBy=multi-user.target
        storage:
          directories:
          - path: /var/lib/rancher/rke2/server/manifests
            overwrite: true
          files:
          #############################################################################
          # if [Option 2]: "Deploy both `Ingress-NGINX` and `Traefik`" is selected
          #############################################################################
          - path: /var/lib/rancher/rke2/server/manifests/rke2-ingress-nginx-config.yaml
            overwrite: true
            contents:
              inline: |
                apiVersion: helm.cattle.io/v1
                kind: HelmChartConfig
                metadata:
                  name: rke2-ingress-nginx
                  namespace: kube-system
                spec:
                  valuesContent: |-
                    controller:
                      hostPort:
                        enabled: false  # not needed when exposing through a type:LoadBalancer service
                      config:
                        use-forwarded-headers: "true"
                        enable-real-ip: "true"
                      publishService:
                        enabled: true
                      service:
                        enabled: true
                        type: LoadBalancer
                        externalTrafficPolicy: Local
            mode: 0644
            user:
              name: root
            group:
              name: root
          #############################################################################
          # if [Option 1]: "Deploy only `Traefik`" OR  [Option 2]: "Deploy both
          #`Ingress-NGINX` and `Traefik`" is selected
          #############################################################################
          - path: /var/lib/rancher/rke2/server/manifests/rke2-traefik-config.yaml
            overwrite: true
            contents:
              inline: |
                apiVersion: helm.cattle.io/v1
                kind: HelmChartConfig
                metadata:
                  name: rke2-traefik
                  namespace: kube-system
                spec:
                  valuesContent: |-
                    ingressClass:
                      isDefaultClass: false  # Assumes [Option 2]; set to true if [Option 1]: "only deploying `Traefik`"
                    ports:
                      web:
                        hostPort: null    # disallow hostPort
                        exposedPort: 80
                      websecure:
                        hostPort: null    # disallow hostPort
                        exposedPort: 443
                    service:
                      enabled: true
                      type: LoadBalancer
                      spec:
                        externalTrafficPolicy: Local
                        allocateLoadBalancerNodePorts: false  # k8s GA from 1.24; supported by MetalLB
                    providers:
                      kubernetesIngressNginx:  # this provider allows Traefik to "understand" most of the Ingress-NGINX annotations
                        enabled: true
                        ingressClass: "rke2-ingress-nginx-migration"
                        controllerClass: "rke2.​cattle.​io/ingress-nginx-migration"
            mode: 0644
            user:
              name: root
            group:
              name: root
    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)有关节点正在被排空的信息,以便它们不会将流量路由到处于此状态的节点。正如 第 59.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