OCP4.8にIBM Cloud Pak for Data (CP4D)をインストールしている時、OCPのグローバルプルシークレット変更時の挙動が変わったことに気づきました。OCPドキュメントで変更内容を確認のうえ、OCP4.6とOCP4.8で実際の挙動を検証してみました。
グローバルプルシークレットについて
CP4Dでは、ポッドなどのリソースは、IBM Entitled Registryからプルするように設定されています。 このレジストリは保護されており、資格キーを使用してのみアクセスできます。 IBM Entitled registry から直接イメージをプルする場合、グローバルプルシークレットに IBM の資格 API キーが含まれている必要があります。
CP4D 4.0の関連手順:Cloud Pak for Data イメージをプルするためのクラスターの構成
さて、OCP 4.8 のドキュメントに次の記述があります。
5.4.3. グローバルクラスターのプルシークレットの更新
現在のプルシークレットを置き換えるか、新しいプルシークレットを追加することで、クラスターのグローバルプルシークレットを更新できます。
注記
OpenShift Container Platform 4.7.4 の時点で、グローバルプルシークレットへの変更によってノードドレインまたは再起動がトリガーされなくなりました。
「OpenShift Container Platform 4.7.4 の時点で、グローバルプルシークレットへの変更によってノードドレインまたは再起動がトリガーされなくなりました。 」
というのは、次のどちらの意味? という疑問がわきました。
- ノードドレインまたは再起動がトリガーされないが、変更が適用される
- ノードドレインまたは再起動がトリガーされないので、変更の適用には手動でノードドレインまたは再起動がトリガーが必要
release notesを見てみます。
OpenShift Container Platform 4.7 release notes
Some machine configuration updates no longer cause automatic reboot
The Machine Config Operator (MCO) no longer automatically reboots all corresponding nodes for the following machine configuration changes:
changes to the SSH key in the spec.config.ignition.passwd.users.sshAuthorizedKeys parameter of a machine config
changes to the global pull secret or pull secret in the openshift-config namespace
changes to the /etc/containers/registries.conf file, such as adding or editing an ImageContentSourcePolicy object
For more information, see Understanding the Machine Config Operator.
まだ曖昧です。リンク先のUnderstanding the Machine Config Operatorを見てみます。
openshift-config namespaceのグローバルプルシークレットまたはプルシークレットへの変更については、MCOが変更を検出すると、ノードをドレインまたは再起動せずに更新を適用する。 ということでよさそうです。
以下、CP4Dのためのグローバルプルシークレットの更新を行い、挙動をOCP4.6とOCP4.8で比較確認した例です。OCP4.8ではノードの再起動なしで、変更が適用されることを確認できました。
確認例
参考手順
Cloud Pak for Data イメージをプルするためのクラスターの構成
1.クラスター管理者としてOCPクラスターにログインします。
2.既存のglobal image pull secretがあるかどうかを確認します。
# oc extract secret/pull-secret -n openshift-config
.dockerconfigjson
.dockerconfigjsonが空でない場合、既存のglobal image pull secretがあります。以下、この空でない場合の手順です。
3.usernameとpasswordをBase64エンコーディングでエンコードした文字列をb64_credentialにセットします。
# b64_credential=`echo -n "cp:$CPD_KEY" | base64 -w0`
4.JSONファイルのauthセクションにコンテナレジストリのエントリーを追加します。
if [ "$(cat .dockerconfigjson | grep '.auths' | grep 'cp.icr.io')" = "" ]; then
echo "updating .dockerconfigjson"
sed -i -e 's|:{|:{"cp.icr.io":{"auth":"'$b64_credential'"\},|' .dockerconfigjson
fi
5.新しい構成をアプライします。
# oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=.dockerconfigjson
OCP4.6 の場合
すべてのノードが自動的に再起動されます。
6.ノードのSTATUS
をチェックし、すべてのノードがReady
になるまで待ちます。
# oc get nodes
### 出力例: 待つべき状態
# oc get nodes
NAME STATUS ROLES AGE VERSION
infra-0 Ready worker 35d v1.19.0+d5ed12c
infra-1 Ready worker 35d v1.19.0+d5ed12c
infra-2 Ready worker 35d v1.19.0+d5ed12c
master-0 Ready,SchedulingDisabled master 36d v1.19.0+d5ed12c
master-1 Ready master 36d v1.19.0+d5ed12c
master-2 Ready master 36d v1.19.0+d5ed12c
worker-0 Ready worker 35d v1.19.0+d5ed12c
worker-1 Ready,SchedulingDisabled worker 35d v1.19.0+d5ed12c
worker-2 Ready worker 35d v1.19.0+d5ed12c
worker-3 Ready worker 35d v1.19.0+d5ed12c
worker-4 Ready worker 35d v1.19.0+d5ed12c
worker-5 Ready worker 35d v1.19.0+d5ed12c
### 出力例: すべてのノードがReadyになった状態
# oc get nodes
NAME STATUS ROLES AGE VERSION
infra-0 Ready worker 36d v1.19.0+d5ed12c
infra-1 Ready worker 36d v1.19.0+d5ed12c
infra-2 Ready worker 36d v1.19.0+d5ed12c
master-0 Ready master 36d v1.19.0+d5ed12c
master-1 Ready master 36d v1.19.0+d5ed12c
master-2 Ready master 36d v1.19.0+d5ed12c
worker-0 Ready worker 36d v1.19.0+d5ed12c
worker-1 Ready worker 36d v1.19.0+d5ed12c
worker-2 Ready worker 36d v1.19.0+d5ed12c
worker-3 Ready worker 36d v1.19.0+d5ed12c
worker-4 Ready worker 36d v1.19.0+d5ed12c
worker-5 Ready worker 36d v1.19.0+d5ed12c
すべてのノードがReady
になった後、各ノードにログインすると、
/var/lib/kubelet/config.json に cp.icr.io の情報が適用されていることを確認できました。
# oc debug node/worker-0
sh-4.4# chroot /host
sh-4.4# ls -l /var/lib/kubelet/config.json
-rw-------. 1 root root 2995 Dec 9 2021 /var/lib/kubelet/config.json
OCP4.8 の場合
ノードは再起動されず、常にReady
のままでしたが、Machine Config Pool Operatorの出力oc get mcp
からノードが順次更新されていることを確認できました。
# oc get nodes
NAME STATUS ROLES AGE VERSION
infra-0 Ready worker 6d v1.21.11+6b3cbdd
infra-1 Ready worker 6d v1.21.11+6b3cbdd
infra-2 Ready worker 6d v1.21.11+6b3cbdd
master-0 Ready master 6d v1.21.11+6b3cbdd
master-1 Ready master 6d v1.21.11+6b3cbdd
master-2 Ready master 6d v1.21.11+6b3cbdd
worker-0 Ready worker 6d v1.21.11+6b3cbdd
worker-1 Ready worker 5d23h v1.21.11+6b3cbdd
worker-2 Ready worker 6d v1.21.11+6b3cbdd
worker-3 Ready worker 6d v1.21.11+6b3cbdd
worker-4 Ready worker 6d v1.21.11+6b3cbdd
worker-5 Ready worker 6d v1.21.11+6b3cbdd
# oc get mcp
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE
master rendered-master-b2f8e48b76335b1e285b5dac02474ace False True False 3 1 1 0 6d
worker rendered-worker-5bd7fe1a029cd154492507193689b559 False True False 9 1 1 0 6d
# oc get nodes
NAME STATUS ROLES AGE VERSION
infra-0 Ready worker 6d v1.21.11+6b3cbdd
infra-1 Ready worker 6d v1.21.11+6b3cbdd
infra-2 Ready worker 6d v1.21.11+6b3cbdd
master-0 Ready master 6d v1.21.11+6b3cbdd
master-1 Ready master 6d v1.21.11+6b3cbdd
master-2 Ready master 6d v1.21.11+6b3cbdd
worker-0 Ready worker 6d v1.21.11+6b3cbdd
worker-1 Ready worker 5d23h v1.21.11+6b3cbdd
worker-2 Ready worker 6d v1.21.11+6b3cbdd
worker-3 Ready worker 6d v1.21.11+6b3cbdd
worker-4 Ready worker 6d v1.21.11+6b3cbdd
worker-5 Ready worker 6d v1.21.11+6b3cbdd
# oc get mcp
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE
master rendered-master-70f5548c06f39a4b28212587ceb063bc True False False 3 3 3 0 6d
worker rendered-worker-5bd7fe1a029cd154492507193689b559 False True False 9 4 4 0 6d
# oc get nodes
NAME STATUS ROLES AGE VERSION
infra-0 Ready worker 6d v1.21.11+6b3cbdd
infra-1 Ready worker 6d v1.21.11+6b3cbdd
infra-2 Ready worker 6d v1.21.11+6b3cbdd
master-0 Ready master 6d v1.21.11+6b3cbdd
master-1 Ready master 6d v1.21.11+6b3cbdd
master-2 Ready master 6d v1.21.11+6b3cbdd
worker-0 Ready worker 6d v1.21.11+6b3cbdd
worker-1 Ready worker 5d23h v1.21.11+6b3cbdd
worker-2 Ready worker 6d v1.21.11+6b3cbdd
worker-3 Ready worker 6d v1.21.11+6b3cbdd
worker-4 Ready worker 6d v1.21.11+6b3cbdd
worker-5 Ready worker 6d v1.21.11+6b3cbdd
# oc get mcp
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE
master rendered-master-70f5548c06f39a4b28212587ceb063bc True False False 3 3 3 0 6d
worker rendered-worker-5bd7fe1a029cd154492507193689b559 False True False 9 6 6 0 6d
# oc get nodes
NAME STATUS ROLES AGE VERSION
infra-0 Ready worker 6d v1.21.11+6b3cbdd
infra-1 Ready worker 6d v1.21.11+6b3cbdd
infra-2 Ready worker 6d v1.21.11+6b3cbdd
master-0 Ready master 6d v1.21.11+6b3cbdd
master-1 Ready master 6d v1.21.11+6b3cbdd
master-2 Ready master 6d v1.21.11+6b3cbdd
worker-0 Ready worker 6d v1.21.11+6b3cbdd
worker-1 Ready worker 5d23h v1.21.11+6b3cbdd
worker-2 Ready worker 6d v1.21.11+6b3cbdd
worker-3 Ready worker 6d v1.21.11+6b3cbdd
worker-4 Ready worker 6d v1.21.11+6b3cbdd
worker-5 Ready worker 6d v1.21.11+6b3cbdd
# oc get mcp
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE
master rendered-master-70f5548c06f39a4b28212587ceb063bc True False False 3 3 3 0 6d
worker rendered-worker-41212b91c87e872023b4b58c7f876d82 True False False 9 9 9 0 6d
oc get mcp
の出力でUPDATING
がFALSE
になった後、各ノードにログインすると、OCP4.6の場合と同様に /var/lib/kubelet/config.json に cp.icr.io の情報が適用されていることを確認できました。