OpenShiftのmust-gather

Red HatでOpenShiftのサポートをしているid:nekopです。

OpenShiftには問題解析のための情報収集を行なうmust-gatherというコマンドおよびイメージ群が用意されています。

特にオプションを指定しないでoc adm must-gatherコマンドを実行した場合、OpenShiftのクラスタを構成するCluster Operatorの情報を取得します。

$ oc adm must-gather

OpenShiftのクラスタを構成するCluster Operatorというのは以下のコマンドで参照できます。

$ oc get co
NAME                                       VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
authentication                             4.10.15   True        False         False      25h     
baremetal                                  4.10.15   True        False         False      25h     
cloud-controller-manager                   4.10.15   True        False         False      25h     
cloud-credential                           4.10.15   True        False         False      25h     
cluster-autoscaler                         4.10.15   True        False         False      25h     
config-operator                            4.10.15   True        False         False      25h     
console                                    4.10.15   True        False         False      3h13m   
csi-snapshot-controller                    4.10.15   True        False         False      25h     
dns                                        4.10.15   True        False         False      3h14m   
etcd                                       4.10.15   True        False         False      25h     
image-registry                             4.10.15   True        False         False      25h     
ingress                                    4.10.15   True        False         False      3h13m   
insights                                   4.10.15   True        False         False      25h     
kube-apiserver                             4.10.15   True        False         False      25h     
kube-controller-manager                    4.10.15   True        False         False      25h     
kube-scheduler                             4.10.15   True        False         False      25h     
kube-storage-version-migrator              4.10.15   True        False         False      3h14m   
machine-api                                4.10.15   True        False         False      25h     
machine-approver                           4.10.15   True        False         False      25h     
machine-config                             4.10.15   True        False         False      25h     
marketplace                                4.10.15   True        False         False      25h     
monitoring                                 4.10.15   True        False         False      25h     
network                                    4.10.15   True        False         False      25h     
node-tuning                                4.10.15   True        False         False      25h     
openshift-apiserver                        4.10.15   True        False         False      25h     
openshift-controller-manager               4.10.15   True        False         False      25h     
openshift-samples                          4.10.15   True        False         False      25h     
operator-lifecycle-manager                 4.10.15   True        False         False      25h     
operator-lifecycle-manager-catalog         4.10.15   True        False         False      25h     
operator-lifecycle-manager-packageserver   4.10.15   True        False         False      25h     
service-ca                                 4.10.15   True        False         False      25h     
storage                                    4.10.15   True        False         False      25h     

オプションなしのoc adm must-gatherコマンドでは、上記Cluster Operatorに関連する全てのリソースyaml、関連namespace内のConfigMapやDeployment, Podといったコアリソースyaml、Podのログを収集します。

oc adm must-gatherコマンドはmust-gatherイメージを利用したコンテナをクラスタ上で実行して、must-gatherコンテナが実際の情報収集を行なうという実行モデルになっています。

類似のコマンドとして oc adm inspect があります。inspectはmust-gatherとは異なり、イメージを利用せず、ocコマンドが直接情報収集を行います。must-gatherコンテナは内部でoc adm inspectコマンドを利用して情報収集をしています。実際のスクリプトはGitHubのmust-gatherリポジトリで参照できます。

たとえば特定ネームスペースの情報を取得するには以下のようにネームスペースを指定します。

$ oc adm inspect ns/myproject

注意点として、must-gatherはCluster Operatorの情報しか取得しないため、アプリケーションのネームスペースなどの情報は基本的に含まれていません。アプリケーションが関連する問題では、must-gatherとアプリケーションのネームスペースのinspectの両方を取得する必要があります。

omcコマンド

must-gatherやinspectが収集する情報は基本的に全てyamlで保存されるため、人間がそのまま見るにはつらいフォーマットとなりますが、このyamlをoc, kubectlコマンドと同じインタフェースにしてくれるomc, OpenShift Must-Gather Clientというツールがあります。oc adm inspectで保存されるデータ形式を処理することができます。

omcコマンドではまずuseオプションで対象のmust-gatherやinspectのディレクトリを指定します。そのあとは通常のoc, kubectlコマンドと同じオプションで操作します。

$ omc use ./must-gather.local.754454620684116043/
$ omc get nodes
NAME                                             STATUS   ROLES           AGE   VERSION
ip-10-0-205-20.ap-northeast-1.compute.internal   Ready    master,worker   28h   v1.23.5+3afdacb
ip-10-0-209-54.ap-northeast-1.compute.internal   Ready    master,worker   28h   v1.23.5+3afdacb
ip-10-0-235-32.ap-northeast-1.compute.internal   Ready    master,worker   28h   v1.23.5+3afdacb

クラスタの状態を確認するときのバターンとして、以下のコマンドを実行します。omc alert rules はomcコマンドの独自拡張で、must-gather内に保存されたalertの状況を確認できるコマンドです。omc etcdというコマンドもあります。

  • omc get clusterverion
  • omc get co
  • omc get node
  • omc get pod -A
  • omc alert rules --status=firing

これらの出力に問題がある場合はcoのstatusフィールドや関連するPodのログなどを参照して、問題をブレークダウンしていきます。

$ omc get clusterversion
NAME      VERSION   AVAILABLE   PROGRESSING   SINCE   STATUS
version   4.10.15   True        False         28h     Cluster version is 4.10.15
$ omc get co
NAME                                       VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE
authentication                             4.10.15   True        False         False      26h
(省略)
storage                                    4.10.15   True        False         False      28h
$ omc get node
NAME                                             STATUS   ROLES           AGE   VERSION
ip-10-0-205-20.ap-northeast-1.compute.internal   Ready    master,worker   28h   v1.23.5+3afdacb
ip-10-0-209-54.ap-northeast-1.compute.internal   Ready    master,worker   28h   v1.23.5+3afdacb
ip-10-0-235-32.ap-northeast-1.compute.internal   Ready    master,worker   28h   v1.23.5+3afdacb
$ omc get pod -A
$ omc get pod -A | head
NAMESPACE                                          NAME                                                                            READY   STATUS      RESTARTS   AGE
openshift-apiserver                                apiserver-6864bc57fd-92jnv                                                      2/2     Running     1          28h
(省略)
openshift-service-ca-operator                      service-ca-operator-989b7b6b9-bcmcz                                             1/1     Running     2          28h
$ omc alert rule --state firing
RULE                                 STATE    AGE   ALERTS   ACTIVE SINCE
UpdateAvailable                      firing   7s    1        24 Jun 22 01:44 UTC
APIRemovedInNextEUSReleaseInUse      firing   29s   3        24 Jun 22 03:10 UTC
Watchdog                             firing   20s   1        24 Jun 22 01:43 UTC
AlertmanagerReceiversNotConfigured   firing   0s    1        24 Jun 22 01:43 UTC

他のmust-gatherイメージ

Cluster Operatorではない、追加したOperatorの情報を取得するため、Operator側で専用のmust-gatherイメージが提供されているものがあります。以下のようなOperatorです。

  • OpenShift Logging
  • OpenShift Service Mesh
  • OpenShift Serverless
  • OpenShift Data Foundation
  • OpenShift Virtualization

基本的には各must-gatherイメージについて oc adm must-gather --image=xxx として指定すればいいのですが、利用頻度が高めのOpenShift Loggingについては慣例としてバージョン指定のため以下の形式で実行します。

$ oc adm must-gather --image=$(oc -n openshift-logging get deployment.apps/cluster-logging-operator \
    -o jsonpath='{.spec.template.spec.containers[?(@.name == "cluster-logging-operator")].image}')

各Operatorのmust-gatherイメージで収集されるデータはinspect形式ではないものも多く、それらはomcコマンドで参照することはできません。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。