OCP4.7.4からグローバルプルシークレットの変更の適用にノードドレインや再起動が不要になった


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 イメージをプルするためのクラスターの構成](https://www.ibm.com/docs/ja/cloud-paks/cp-data/4.0?topic=tasks-configuring-your-cluster-pull-images)

さて、OCP 4.8 のドキュメントに次の記述があります。
[5.4.3. グローバルクラスターのプルシークレットの更新](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.8/html/images/images-update-global-pull-secret_using-image-pull-secrets)

>現在のプルシークレットを置き換えるか、新しいプルシークレットを追加することで、クラスターのグローバルプルシークレットを更新できます。

>注記
OpenShift Container Platform 4.7.4 の時点で、グローバルプルシークレットへの変更によってノードドレインまたは再起動がトリガーされなくなりました。


`「OpenShift Container Platform 4.7.4 の時点で、グローバルプルシークレットへの変更によってノードドレインまたは再起動がトリガーされなくなりました。 」`というのは、次のどちらの意味？　という疑問がわきました。

- ノードドレインまたは再起動がトリガーされないが、変更が適用される
- ノードドレインまたは再起動がトリガーされないので、変更の適用には手動でノードドレインまたは再起動がトリガーが必要


release notesを見てみます。
[OpenShift Container Platform 4.7 release notes](https://docs.openshift.com/container-platform/4.7/release_notes/ocp-4-7-release-notes.html)

> 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](https://docs.openshift.com/container-platform/4.7/architecture/control-plane.html#understanding-machine-config-operator_control-plane).

まだ曖昧です。リンク先のUnderstanding the Machine Config Operatorを見てみます。
![mco_important_changes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/3d85a924-6e02-351a-e924-2972286f6dfd.png)

**openshift-config namespaceのグローバルプルシークレットまたはプルシークレットへの変更については、MCOが変更を検出すると、ノードをドレインまたは再起動せずに更新を適用する。** ということでよさそうです。

以下、CP4Dのためのグローバルプルシークレットの更新を行い、挙動をOCP4.6とOCP4.8で比較確認した例です。OCP4.8ではノードの再起動なしで、変更が適用されることを確認できました。

## 確認例

参考手順
[Cloud Pak for Data イメージをプルするためのクラスターの構成](https://www.ibm.com/docs/ja/cloud-paks/cp-data/4.0?topic=tasks-configuring-your-cluster-pull-images)

１．クラスター管理者としてOCPクラスターにログインします。

２．既存のglobal image pull secretがあるかどうかを確認します。
```
# oc extract secret/pull-secret -n openshift-config
.dockerconfigjson
```
.dockerconfigjsonが空でない場合、既存のglobal image pull secretがあります。以下、この空でない場合の手順です。


３．usernameとpasswordをBase64エンコーディングでエンコードした文字列をb64_credentialにセットします。
```
# b64_credential=`echo -n "cp:$CPD_KEY" | base64 -w0`
```
４．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
```

５．新しい構成をアプライします。

```
# oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=.dockerconfigjson
```

### OCP4.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 の情報が適用されていることを確認できました。