[OpenShift]ノードのデバッグ方法を確認する

#はじめに
今回はOpenShift（OCP）のノードのデバッグ方法を確認しました。

OpenShift4以降は、各ノードのOSがCoreOSを利用することが推奨になっています。CoreOSはコンテナを動かすために機能を絞ったOSです。そのため、OpenShift4では各ノードに直接ログインして操作することは推奨されていません。（できない？未確認）

#OCPの構成確認
以下のバージョン、クラスタです。

```
$ oc version 
Client Version: 4.5.4
Server Version: 4.5.4
Kubernetes Version: v1.18.3+012b3ec
$ oc get node
NAME       STATUS   ROLES           AGE    VERSION
master01   Ready    master,worker   168d   v1.18.3+012b3ec
master02   Ready    master,worker   168d   v1.18.3+012b3ec
master03   Ready    master,worker   168d   v1.18.3+012b3ec
```

#デバッグ用のコンテナの起動
各ノードに直接ログインせずに、`oc debug`コマンドでコンテナを起動します。

```
$ oc debug node/master01
Starting pod/master01-debug ...
To use host binaries, run `chroot /host`
Pod IP: 192.168.50.10
If you don't see a command prompt, try pressing enter.
sh-4.2#
```

##コンテナの構成確認
別ターミナルを開いて、このコンテナの構成を確認します。

```
$ oc get pod
NAME             READY   STATUS    RESTARTS   AGE
master01-debug   1/1     Running   0          3m41s
$ oc describe pod master01-debug 
Name:         master01-debug
Namespace:    default
Priority:     0
Node:         master01/192.168.50.10
Start Time:   Thu, 21 Jan 2021 09:07:36 -0500
Labels:       <none>
Annotations:  debug.openshift.io/source-container: container-00
              debug.openshift.io/source-resource: /v1, Resource=nodes/master01
Status:       Running
IP:           192.168.50.10
IPs:
  IP:  192.168.50.10
Containers:
  container-00:
    Container ID:  cri-o://1654e12ab1bcc40c9b8b7b6b94ce0c5f73152aff31c384786c1b15d3074e1756
    Image:         quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:a60f5a4429d512c7bc8e438ba949b54583d16147e23d30aef9aaa836efa76783
    Image ID:      quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:a60f5a4429d512c7bc8e438ba949b54583d16147e23d30aef9aaa836efa76783
    Port:          <none>
    Host Port:     <none>
    Command:
      /bin/sh
    State:          Running
      Started:      Thu, 21 Jan 2021 09:07:37 -0500
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /host from host (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-p8rss (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  host:
    Type:          HostPath (bare host directory volume)
    Path:          /
    HostPathType:  Directory
  default-token-p8rss:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-p8rss
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason   Age   From               Message
  ----    ------   ----  ----               -------
  Normal  Pulled   12s   kubelet, master01  Container image "quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:a60f5a4429d512c7bc8e438ba949b54583d16147e23d30aef9aaa836efa76783" already present on machine
  Normal  Created  12s   kubelet, master01  Created container container-00
  Normal  Started  12s   kubelet, master01  Started container container-00
```

ポイントはVolumesとMountsですね。
HostPathで"/"がコンテナの/hostにマウントされています。

##コンテナ上での操作

コンテナ起動時のメッセージにもありますが、`chroot /host`でchrootシェルを起動します。

```
sh-4.2# chroot /host
sh-4.4# ls -l
total 18
lrwxrwxrwx.   3 root root    7 Jul 14  2020 bin -> usr/bin
drwxr-xr-x.   8 root root 1024 Aug  5 18:22 boot
drwxr-xr-x.  19 root root 3040 Jan 21 12:56 dev
drwxr-xr-x.  89 root root 8192 Jan 21 12:56 etc
lrwxrwxrwx.   3 root root    8 Jul 14  2020 home -> var/home
lrwxrwxrwx.   3 root root    7 Jul 14  2020 lib -> usr/lib
lrwxrwxrwx.   3 root root    9 Jul 14  2020 lib64 -> usr/lib64
lrwxrwxrwx.   3 root root    9 Jul 14  2020 media -> run/media
lrwxrwxrwx.   3 root root    7 Jul 14  2020 mnt -> var/mnt
lrwxrwxrwx.   3 root root    7 Jul 14  2020 opt -> var/opt
lrwxrwxrwx.   3 root root   14 Jul 14  2020 ostree -> sysroot/ostree
dr-xr-xr-x. 414 root root    0 Jan 21 12:56 proc
lrwxrwxrwx.   3 root root   12 Jul 14  2020 root -> var/roothome
drwxr-xr-x.  44 root root 1120 Jan 21 12:56 run
lrwxrwxrwx.   3 root root    8 Jul 14  2020 sbin -> usr/sbin
lrwxrwxrwx.   3 root root    7 Jul 14  2020 srv -> var/srv
dr-xr-xr-x.  13 root root    0 Jan 21 12:56 sys
drwxr-xr-x.   4 root root   66 Jul 14  2020 sysroot
drwxrwxrwt.   8 root root  160 Jan 21 13:59 tmp
drwxr-xr-x.  12 root root  155 Jan  1  1970 usr
drwxr-xr-x.  24 root root 4096 Aug  5 18:22 var
```

OSのバージョンも確認できます。

```
sh-4.4# cat /etc/redhat-release 
Red Hat Enterprise Linux CoreOS release 4.5
```

kubeletやcri-oも確認できます。

```
sh-4.4# systemctl status kubelet 
● kubelet.service - MCO environment configuration
   Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/kubelet.service.d
           └─10-mco-default-env.conf
   Active: active (running) since Thu 2021-01-21 12:56:22 UTC; 1h 5min ago
  Process: 1491 ExecStartPre=/bin/rm -f /var/lib/kubelet/cpu_manager_state (code=exited, status=0/SUCCESS)
  Process: 1489 ExecStartPre=/bin/mkdir --parents /etc/kubernetes/manifests (code=exited, status=0/SUCCESS)
 Main PID: 1493 (kubelet)
    Tasks: 40 (limit: 102120)
   Memory: 616.3M
      CPU: 7min 12.504s
   CGroup: /system.slice/kubelet.service
           └─1493 kubelet --config=/etc/kubernetes/kubelet.conf --bootstrap-kubeconfig=/etc/kubernetes/kubeconf>
sh-4.4# systemctl status cri-o
● crio.service - MCO environment configuration
   Loaded: loaded (/usr/lib/systemd/system/crio.service; disabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/crio.service.d
           └─10-mco-default-env.conf
   Active: active (running) since Thu 2021-01-21 12:56:15 UTC; 1h 6min ago
     Docs: https://github.com/cri-o/cri-o
 Main PID: 1444 (crio)
    Tasks: 26
   Memory: 744.5M
      CPU: 7min 55.758s
   CGroup: /system.slice/crio.service
           ├─  1444 /usr/bin/crio --enable-metrics=true --metrics-port=9537
           └─258722 [runc]
```

このデバッグコンテナはログアウトすると削除されます。また、一定時間何も操作しないと知らぬ間にログアウトされています。測ってはいませんが、5分くらいでログアウトされてました。