PowerFlex 4.x:MVMノードでRKE2証明書をローテーションする方法
概要: RKE2証明書は自動的に更新されるはずですが、まれにこの更新が行われないことがあります。 この手順では、MVMノードでRKE2証明書をローテーションする方法について説明します。
手順
手順:
1.任意のMVMノードにSSHで接続します。
2.すべてのノードが「Ready」ステータスであることを確認します。
kubectl get node
3.すべてのPostgresデータベース インスタンスを一覧表示し、リーダー ロールを持つポッド名を特定します。
kubectl exec -n powerflex -c database $(kubectl get pods -n powerflex -l='postgres-operator.crunchydata.com/role=master, postgres-operator.crunchydata.com/instance-set' | grep Running | cut -d' ' -f1) -- sh -c 'patronictl list'
出力例:
+ Cluster: postgres-ha-ha +------------------------------------------+--------------+-----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+-------------------------+------------------------------------------+--------------+-----------+----+-----------+
| postgres-ha-cmo1-58bs-0 | postgres-ha-cmo1-58bs-0.postgres-ha-pods | Sync Standby | streaming | 7 | 0 |
| postgres-ha-cmo1-lvkz-0 | postgres-ha-cmo1-lvkz-0.postgres-ha-pods | Sync Standby | streaming | 7 | 0 |
| postgres-ha-cmo1-v7zg-0 | postgres-ha-cmo1-v7zg-0.postgres-ha-pods | Leader | running | 7 | | ← This is the Leader pod
+-------------------------+------------------------------------------+--------------+-----------+----+-----------+
4.PostgreSQLリーダー ポッドを実行しているMVMを特定します。
for x in `kubectl get pods -n powerflex | grep "postgres-ha-cmo" | awk '{print $1}'`; do echo $x; kubectl get pods -n powerflex $x -o json | grep '"nodeName"' | cut -d ':' -f2; echo " "; done
出力例:
postgres-ha-cmo1-58bs-0
"pfmp-mvm3-c",
postgres-ha-cmo1-lvkz-0
"pfmp-mvm2-c",
postgres-ha-cmo1-v7zg-0
"pfmp-mvm1-c", ← This is the MVM running the Leader pod
5.ターゲットMVMにSSHで接続します。
・現在NotReady状態のノードを最初に更新する必要があります。
・ PostgreSQLリーダー ポッドが稼働しているMVMを最後に更新する必要があります。
・他のノードは任意の順序で更新できます。
6.rootユーザーに切り替えます。
sudo -s
7.メンテナンス対象のMVMにラベルを付けます。
kubectl label node <Target-MVM> cmo.maintenance.mode=true
成功時の出力例:
node/pfmp-mvm2-c labeled
エラー時の出力例:
error: 'cmo.maintenance.mode' already has a value (false), and --overwrite is false
次のコマンドを使用して、メンテナンス ラベルがtrueに設定されているかどうかを確認できます。
kubectl describe nodes <Target-MVM> | grep cmo.maintenance.mode
注:Target-MVMを編集します。
出力例:
cmo.maintenance.mode=true
kubectl label node <Target-MVM> cmo.maintenance.mode-
8.ターゲットMVMからポッドをドレインします。
kubectl drain <Target-MVM> --ignore-daemonsets --delete-emptydir-data
出力例:
node/pfmp-mvm2-c cordoned
Warning: ignoring DaemonSet-managed Pods: calico-system/calico-node-6b28t, kube-system/rke2-ingress-nginx-controller-nzdw4, kube-system/rke2-multus-ds-7qj7z, powerflex/logging-fluent-bit-hg4jx, powerflex/metallb-speaker-dgsm7, powerflex/powerflex-status-service-r2phw, powerflex/powerflex-status-ui-vb4f5
evicting pod powerflex/vault-2
evicting pod powerflex/block-legacy-gateway-0
...
node/<Node Name> drained ← This message confirms successful draining
9.ノードのステータスが「Ready, SchedulingDisabled」になっていることを確認します。
kubectl get node
出力例:
NAME STATUS ROLES AGE VERSION
pfmp-mvm1-c Ready control-plane,etcd,master 93d v1.25.3+rke2r1
pfmp-mvm2-c Ready,SchedulingDisabled control-plane,etcd,master 93d v1.25.3+rke2r1
pfmp-mvm3-c Ready control-plane,etcd,master 93d v1.25.3+rke2r1
10.ターゲットMVMでRKE2サービスを停止します。
・ホスト名を確認します。
hostname
・RKE2サービスを停止します。
systemctl stop rke2-server
11.証明書をローテーションします。
rke2 certificate rotate
出力例:
INFO[0000] Server detected, rotating server certificates
INFO[0000] Rotating certificates for admin service
INFO[0000] Rotating certificates for etcd service
INFO[0000] Rotating certificates for api-server service
INFO[0000] Rotating certificates for controller-manager service
INFO[0000] Rotating certificates for cloud-controller service
INFO[0000] Rotating certificates for scheduler service
INFO[0000] Rotating certificates for rke2-server service
INFO[0000] Rotating dynamic listener certificate
INFO[0000] Rotating certificates for rke2-controller service
INFO[0000] Rotating certificates for auth-proxy service
INFO[0000] Rotating certificates for kubelet service
INFO[0000] Rotating certificates for kube-proxy service
INFO[0000] Successfully backed up certificates for all services to path /var/lib/rancher/rke2/server/tls-1748242637, please restart rke2 server or agent to rotate certificates
12.RKE2サービスを再起動します。
systemctl start rke2-server
13.プロンプトが表示されたら、メンテナンス ラベルを削除して、ノードをuncordon(スケジュール可能に戻す)します。
kubectl uncordon <Target-MVM> ; kubectl label node <Target-MVM> cmo.maintenance.mode-
14.10〜30分待った後、次の点を確認します。
14-1. 証明書の有効期限が更新されていること(約1年先)。
openssl x509 -in /var/lib/rancher/rke2/server/tls/etcd/client.crt -noout -dates
openssl x509 -in /var/lib/rancher/rke2/server/tls/etcd/server-client.crt -noout -dates
openssl x509 -in /var/lib/rancher/rke2/server/tls/etcd/peer-server-client.crt -noout -dates
14-2. すべてのノードが「Ready」ステータスであること。
kubectl get node
14-3. 異常なステータスのポッドがないこと。
kubectl get pod -A -o wide | egrep -v "Running|Completed"
15.すべてのチェックに合格した場合は、次のMVMに進んで手順5から始めます。
次のMVMに進む前に、1つ目のMVMで処理を完了します。
PostgreSQLリーダー ポッドを実行しているMVMは、最後に更新する必要があります。
3つすべてのMVMで手順を完了したら、手順3のコマンドを実行してPostgresデータベースの正常性を確認します。1つのポッドが「Leader」で、「running」ステータスである必要があります。ラグは0MBであり、両方の「Sync Standby」メンバーの状態が「streaming」である必要があります。
正常なデータベースの例:
+ Cluster: postgres-ha-ha +------------------------------------------+--------------+-----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+-------------------------+------------------------------------------+--------------+-----------+----+-----------+
| postgres-ha-cmo1-58bs-0 | postgres-ha-cmo1-58bs-0.postgres-ha-pods | Sync Standby | streaming | 7 | 0 |
| postgres-ha-cmo1-lvkz-0 | postgres-ha-cmo1-lvkz-0.postgres-ha-pods | Sync Standby | streaming | 7 | 0 |
| postgres-ha-cmo1-v7zg-0 | postgres-ha-cmo1-v7zg-0.postgres-ha-pods | Leader | running | 7 | |
+-------------------------+------------------------------------------+--------------+-----------+----+-----------+