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_NEW_VERSION}を置き換えて、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"次のセクション(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}.rawcapi-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