第37章 診断ツール

37.1. 概要

oc adm diagnostics コマンドは一連のチェックを実行し、ホストまたはクラスターのエラーの状態についてチェックします。とくに以下を実行します。

  • デフォルトのレジストリーおよびルーターが実行中であり、正しく設定されていることを確認します。
  • ClusterRoleBindings および ClusterRoles で、ベースポリシーとの整合性を確認します。
  • すべてのクライアント設定コンテキストが有効で接続可能であることを確認します。
  • SkyDNS が適切に機能しており、Pod に SDN 接続があることを確認します。
  • ホストのマスターおよびノード設定を検証します。
  • ノードが実行中で、利用可能であることを確認します。
  • 既知のエラーについてホストログを分析します。
  • systemd ユニットがホストに対して予想通りに設定されていることを確認します。

37.2. 診断ツールの使用

OpenShift Container Platform は数多くの方法でデプロイできます (ソースからのビルド、VM イメージ、コンテナーイメージの使用、またはエンタープライズ RPM の使用など)。それぞれの方法には異なる設定および環境が想定されます。環境について想定される相違を最小限にするために診断は openshift バイナリーに追加されており、OpenShift Container Platform サーバーまたはクライアントがどこに置かれていても、診断を全く同じ環境で実行できるようになっています。

診断ツールを使用するには (マスターホスト上で使用するのが望ましい)、クラスター管理者として以下を実行します。

$ oc adm diagnostics

これは利用可能なすべての診断を実行し、適用されないものは省略します。

名前別に 1 つまたは複数の特定の診断を実行するか、または問題に対応する際に使用する特定の診断を実行することができます。以下は例になります。

$ oc adm diagnostics <name1> <name2>

ほとんどの場合、このオプションには機能する設定ファイルが必要になります。たとえば NodeConfigCheck は、ノード設定が利用可能でない場合は実行されません。

診断では標準的な場所にある設定ファイルを検索します。

  • クライアント:

    • $KUBECONFIG 環境変数で示されます。
    • ~/.kube/config file
  • マスター:

    • /etc/origin/master/master-config.yaml
  • ノード:

    • /etc/origin/node/node-config.yaml

標準以外の場所もフラグ (--config--master-config および --node-config) で指定できます。設定ファイルが見つからないか、または指定されない場合、関連する診断は省略されます。

利用可能な診断には以下が含まれます。

診断名目的

AggregatedLogging

集約されたログ統合を使用して適切な設定および操作を確認します。

AnalyzeLogs

systemd サービスログで問題の有無を確認します。チェックの実行に設定ファイルは不要です。

ClusterRegistry

クラスターにビルドおよびイメージストリーム用の有効な Docker レジストリーがあることを確認します。

ClusterRoleBindings

デフォルトのクラスターロールバインディングが存在し、ベースポリシーに応じて予想されるサブジェクトが含まれることを確認します。

ClusterRoles

クラスターロールが存在し、ベースポリシーに応じて予想されるパーミッションが含まれることを確認します。

ClusterRouter

クラスター内に有効なデフォルトルーターがあることを確認します。

ConfigContexts

クライアント設定の各コンテキストが完成したものであり、その API サーバーへの接続があることを確認します。

DiagnosticPod

アプリケーションの観点で診断を実行する Pod を作成します。これは Pod 内の DNS が予想通りに機能しており、デフォルトサービスアカウントの認証情報がマスター API に対して正しく認証されることを確認します。

EtcdWriteVolume

一定期間における etcd に対する書き込みのボリュームを確認し、操作およびキー別にそれらを分類します。この診断は他の診断と同じ速度で実行されず、かつ etcd への負荷を増えることから、とくに要求される場合にのみ実行されます。

MasterConfigCheck

このホストのマスター設定ファイルで問題の有無を確認します。

MasterNode

このホストで実行されているマスターがノードも実行していることを確認し、それがクラスター SDN のメンバーであることを確認します。

MetricsApiProxy

統合 Heapster メトリクスがクラスター API プロキシー経由でアクセス可能であることを確認します。

NetworkCheck

複数ノードで診断 Pod を作成し、アプリケーションの観点で共通するネットワーク問題を診断します。たとえば、これは Pod がサービスや他の Pod、および外部ネットワークに接続できることを確認します。

エラーがある場合は、この診断は詳細な分析用としてローカルディレクトリー (デフォルトで /tmp/openshift/) に結果および取得されたファイルを保存します。ディレクトリーは --network-logdir フラグで指定することができます。

NodeConfigCheck

このホストのノード設定ファイルで問題の有無を確認します。

NodeDefinitions

マスター API で定義されたノードが利用可能な状態にあり、Pod をスケジュールできることを確認します。

RouteCertificateValidation

すべてのルート証明書で、拡張される検証で拒否される可能性のあるものがあるかどうかを確認します。

ServiceExternalIPs

マスター設定に基づいて無効にされている外部 IP を指定する既存サービスの有無を確認します。

UnitStatus

OpenShift Container Platform に関連して、このホストでユニットについての systemd ステータスを確認します。チェックの実行に設定ファイルは不要です。

37.3. サーバー環境における診断の実行

マスターおよびノードの診断は、Ansible でデプロイされるクラスターで最も役立ちます。この場合、いくつかの診断上のメリットがあります。

  • マスターおよびノード設定は標準的な場所にある設定ファイルに基づく。
  • systemd ユニットがサーバーを管理するように設定される。
  • すべてのコンポーネントが journald に対してログを記録する。

Ansibleが指定する場所に設定ファイルが置かれるため、それらを検索する場所を指定する必要がなくなります。フラグなしで oc adm diagnostics を実行すると、標準的な場所にあるマスターおよびノード設定ファイルを検索でき、それらが見つかり次第使用することができます。これにより、Ansible を使用してインストールする場合のされるユースケースをできる限り単純にすることができます。さらに、予想される場所にない設定ファイルを指定することも容易になります。

$ oc adm diagnostics --master-config=<file_path> --node-config=<file_path>

systemd ユニットおよび journald のログエントリーは現在のログ診断ロジックに必要です。他のデプロイメントタイプの場合、ログはファイルに記録されるか、標準出力に出力されるか、またはノードとマスターを組み合わせる可能性もあります。このような場合にログ診断は適切に機能せず、省略されます。

37.4. クライアント環境での診断の実行

通常のユーザーまたは cluster-admin ユーザーとしてのアクセスを持つ場合、OpenShift Container Platform マスターまたはノードが動作するホストでの実行が可能です。診断はユーザーが利用できるアクセスをできるだけ多く使用することを試みます。

通常のアクセスを持つクライアントはマスターへの接続を診断し、診断 Pod を実行することができます。複数のユーザーまたはマスターが設定されている場合、接続のテストはそれらすべてを対象に実行されますが、診断 Pod は現行ユーザー、サーバー、またはプロジェクトに対してのみ実行されます。

(すべてのユーザーが利用できるが、現行マスターのみで) 利用可能な cluster-admin アクセスを持つクライアントは、ノード、レジストリー、ルーターなどのインフラストラクチャーのステータスを診断できます。いずれの場合も、oc adm diagnostics を実行すると、標準的な場所にあるクライアント設定を検索でき、利用可能な場合はこれを使用できます。

37.5. Ansible ベースの正常性チェック

追加の正常性診断チェックは、OpenShift Container Platform クラスターのインストールおよび管理に使用される Ansible ベースのツールで利用できます。それらは現行 OpenShift Container Platform インストールによくあるデプロイメントの問題を報告します。

これらのチェックは、ansible-playbook コマンドの使用 (通常インストール (Advanced installation)で使用されるのと同じ方式) によるか、または openshift-ansibleコンテナー化されたバージョンとして実行できます。ansible-playbook 方式については、チェックは atomic-openshift-utils RPM パッケージを使って行われます。コンテナー化方式の場合は、openshift3/ose-ansible コンテナーイメージが Red Hat Container Registry 経由で配布されます。各方式の使用例については、後続のセクションで説明されます。|

以下の正常性チェックは、デプロイされた OpenShift Container Platform クラスターを対象に、指定された health.yml playbook を使用して Ansible インベントリーファイルに対して実行されることが意図されている診断タスクのセットのこと指します。

警告

正常性チェック Playbook はホストに変更を加える可能性があります。そのため、これらの Playbook は Ansible を使ってデプロイされたクラスターで、デプロイ時に使用したものと同じインベントリーファイルを使う場合にのみ使用できます。ほとんどの場合、発生する変更はチェックでの必須情報の収集に必要な依存関係のインストールに関係するものですが、特定のシステムコンポーネント (docker またはネットワークなど) も、現在の状態がインベントリーファイルの設定と異なる場合に変更される可能があります。これらの正常性チェックは、使用するインベントリーファイルが現在のクラスター設定に変更を加えないことが予想される場合にのみ実行してください。

表37.1 正常性診断チェック

チェック名目的

etcd_imagedata_size

このチェックは、etcd クラスターの OpenShift Container Platform イメージデータの合計サイズを測定します。このチェックは計算されたサイズがユーザー定義の制限を超える場合に失敗します。制限が指定されない場合、このチェックはイメージデータのサイズが etcd クラスターで現在使用されている領域の 50 % 以上になる場合に失敗します。

このチェックに失敗することは、etcd の多くの領域が OpenShift Container Platform イメージデータによって使用されていることを示し、これにより、最終的には etcd クラスターがクラッシュする可能性があります。

ユーザー定義の制限は etcd_max_image_data_size_bytes 変数を渡すことで設定できます。たとえば、etcd_max_image_data_size_bytes=40000000000 を設定する場合、etcd に保存されるイメージデータの合計サイズが 40 GB を超えるとチェックが失敗します。

etcd_traffic

このチェックは、etcd ホストの通常よりも高いレベルのトラフィックを検知します。etcd 期間の警告と共に journalctl ログエントリーが見つかる場合に失敗します。

etcd パフォーマンスを強化する方法についての詳細は、「Recommended Practices for OpenShift Container Platform etcd Hosts」および「Red Hat Knowledgebase」を参照してください。

etcd_volume

このチェックにより、etcd クラスターのボリューム使用がユーザー指定の最大しきい値を超えないようにできます。最大しきい値が指定されていない場合、デフォルトは合計ボリュームサイズの 90% に設定されます。

ユーザー定義の制限は、etcd_device_usage_threshold_percent 変数を渡すことで設定できます。

docker_storage

docker デーモン (ノードおよびコンテナー化されたインストール) に依存するホストでのみ実行されます。docker の合計使用量がユーザー定義制限を超えないこと確認します。ユーザー定義の制限が設定されていない場合、docker 使用量の最大しきい値のデフォルトは利用可能な合計サイズの 90% になります。

合計パーセントの使用量についてのしきい値の制限は、max_thinpool_data_usage_percent=90 などのようにインベントリーファイルの変数で設定できます。

また、このチェックは docker のストレージがサポートされる設定を使用していることを確認します。

curatorelasticsearchfluentdkibana

この一連のチェックは、Curator、Kibana、Elasticsearch、および Fluentd Pod がデプロイされており、これらが running 状態であることを検証し、接続を制御ホストと公開される Kibana URL 間で確立できることを検証します。これらのチェックは、openshift_logging_install_logging インベントリー変数が true に設定されている場合にのみ実行され、それらがクラスターロギングが有効にされているデプロイメントで実行されるようにします。

logging_index_time

このチェックは、ロギングスタックデプロイメントにおけるログ作成から Elasticsearch によるログ集計までの通常の時間差よりも値が高くなるケースを検知します。新規のログエントリーがタイムアウト内 (デフォルトでは 30 秒内) に Elasticserach によってクエリーされない場合に失敗します。このチェックはロギングが有効にされている場合にのみ実行されます。

ユーザー定義のタイムアウトは、openshift_check_logging_index_timeout_seconds 変数を渡すことで設定できます。たとえば、openshift_check_logging_index_timeout_seconds=45 を設定すると、新規作成されるログエントリーが 45 秒を経過しても Elasticsearch でクエリーされない場合に失敗します。

注記

インストールプロセスの一部として実行されることが意図されている同様のチェックセットについては、「Configuring Cluster Pre-install Checks」を参照してください。証明書の有効期限をチェックするための別のチェックのセットについては、「Redeploying Certificates」を参照してください。

37.5.1. ansible-playbook による正常性チェックの実行

ansible-playbook コマンドを使用して openshift-ansible 正常性チェックを実行するには、クラスターのインベントリーファイルを指定し、health.yml playbook を実行します。

# ansible-playbook -i <inventory_file> \
    /usr/share/ansible/openshift-ansible/playbooks/openshift-checks/health.yml

コマンドラインに変数を設定するには、key=value 形式の必要な変数に -e フラグを組み込みます。以下は例になります。

# ansible-playbook -i <inventory_file> \
    /usr/share/ansible/openshift-ansible/playbooks/openshift-checks/health.yml
    -e openshift_check_logging_index_timeout_seconds=45
    -e etcd_max_image_data_size_bytes=40000000000

特定のチェックを無効にするには、Playbook を実行する前にインベントリーファイルのカンマ区切りのチェック名の一覧と共に変数 openshift_disable_check を組み込みます。以下は例になります。

openshift_disable_check=etcd_traffic,etcd_volume

または、ansible-playbook コマンドの実行時に -e openshift_disable_check=<check1>,<check2> で変数として無効にするチェックを設定します。

37.5.2. Docker CLI での正常性チェックの実行

Docker コンテナーで openshift-ansible playbook を実行し、Docker CLI で ose-ansible イメージを実行できるホストでの Ansible のインストールおよび設定の手間を省くことができます。

これを実行するには、以下の docker run コマンドをコンテナーの実行権限を持つ非 root ユーザーとして実行する際にクラスターのインベントリーファイルと health.yml playbook を指定します。

# docker run -u `id -u` \ 1
    -v $HOME/.ssh/id_rsa:/opt/app-root/src/.ssh/id_rsa:Z,ro \ 2
    -v /etc/ansible/hosts:/tmp/inventory:ro \ 3
    -e INVENTORY_FILE=/tmp/inventory \
    -e PLAYBOOK_FILE=playbooks/openshift-checks/health.yml \ 4
    -e OPTS="-v -e openshift_check_logging_index_timeout_seconds=45 -e etcd_max_image_data_size_bytes=40000000000" \ 5
    openshift3/ose-ansible
1
これらのオプションにより、コンテナーは現行ユーザーと同じ UID で実行されます。これは SSH キーをコンテナー内で読み取られるようにするようにパーミッションで必要になります (SSH プライベートキーはその所有者によってのみ読み取り可能であることが予想されます)。
2
SSH キーは、コンテナーを非 root ユーザーとして実行するなどの通常の使用では /opt/app-root/src/.ssh の下にマウントします。
3
/etc/ansible/hosts は、異なる場合はクラスターのインベントリーファイルの場所に切り替えます。このファイルは、コンテナーの INVENTORY_FILE 環境変数に基づいて使用される /tmp/inventory にバインドおよびマウントされます。
4
PLAYBOOK_FILE 環境変数は、コンテナー内の /usr/share/ansible/openshift-ansible に関連して health.yml playbook の場所に設定されます。
5
-e key=value 形式で単一の実行に必要な変数を設定します。

上記のコマンドでは、SSH キーは :Z フラグを使ってマウントされ、コンテナーが SSH キーを制限付き SELinux コンテキストから読み取れるようにします。これは、元の SSH キーファイルのラベルが system_u:object_r:container_file_t:s0:c113,c247 などに変更されることを意味しています。:Z についての詳細は、docker-run(1) man ページを参照してください。

これらのボリュームマウント仕様に関連して予期しない影響が生じる可能性があることに注意してください。たとえば、$HOME/.ssh ディレクトリーをマウント (したがってラベルを変更) する場合、sshd はパブリックキーにアクセスしてリモートログインを許可できなくなります。元のファイルラベルの変更を防ぐには、SSH キー (またはディレクトリー) のコピーをマウントすることが推奨されています。

.ssh ディレクトリー全体をマウントする理由はいくつかあります。たとえば、これにより SSH 設定を使用してキーをホストに一致させたり、他の接続パラメーターを変更したりできます。また known_hosts ファイルを指定したり、 SSH にホストキーを検証させたりすることができます。このホストキーの検証はデフォルトでは無効にされていますが、-e ANSIBLE_HOST_KEY_CHECKING=Truedocker コマンドラインに追加することで環境変数を使用して再度有効にすることができます。