このページでは、gkectl
コマンドライン インターフェース(CLI)ツールを使用して GKE On-Prem クラスタの問題を診断する方法について説明します。
概要
gkectl
ツールには、クラスタの問題を解決するために 2 つのコマンド(gkectl diagnose cluster
と gkectl diagnose snapshot
)が用意されています。これらのコマンドは、管理者クラスタとユーザー クラスタの両方で機能します。
gkectl diagnose cluster
GKE On-Prem クラスタでヘルスチェックを実行し、エラーを報告します。次のコンポーネントでヘルスチェックを実行します。
- クラスタ オブジェクト
- マシン オブジェクトと対応するクラスタノード
- kube-system と gke-system の Namespace にある Pod
- ターゲット クラスタがユーザー クラスタの場合のユーザー コントロール プレーン
gkectl diagnose snapshot
クラスタのステータス、構成、ログを tarball ファイルに圧縮します。具体的には、このコマンドのデフォルト構成で、クラスタに関する次の情報が取得されます。
- Kubernetes のバージョン
- kube-system と gke-system Namespace 内の Kubernetes リソースのステータス: クラスタ、マシン、ノード、Service、Endpoint、ConfigMap、ReplicaSet、CronJob、Pod とそのオーナー(Deployment、DaemonSet、StatefulSet を含む)
- ターゲット クラスタがユーザー クラスタである場合のユーザー コントロール プレーンのステータス(ユーザー クラスタのコントロール プレーンは管理クラスタで実行されます)
- 各ノードの構成の詳細(IP アドレス、iptables ルール、マウント ポイント、ファイル システム、ネットワーク接続、実行中のプロセスなど)
認証情報(vSphere と F5 の認証情報など)は、tarball が作成される前に削除されます。
クラスタの診断
gke diagnose cluster
を実行すると、クラスタに関する一般的な問題を確認できます。
管理クラスタの診断
管理クラスタは、その名前か kubeconfig を渡すだけで診断できます。
管理クラスタの kubeconfig の使用
管理クラスタの kubeconfig を渡すと、gkectl
は自動的に管理クラスタを選択します。
gkectl diagnose cluster --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG]
管理クラスタ名の使用
管理クラスタ名を取得するには、次のコマンドを実行します。
kubectl get cluster --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG]
次に、管理クラスタ名を gkectl diagnose cluster
に渡します。
gkectl diagnose cluster --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --cluster-name=[ADMIN_CLUSTER_NAME]
管理クラスタが正常に機能している場合、gkectl diagnose cluster
は次の出力を返します。
Diagnosing admin cluster "[ADMIN_CLUSTER_NAME]"... Checking cluster object...PASS Checking machine objects...PASS Checking kube-system pods...PASS Cluster is healthy.
ユーザー クラスタの診断
クラスタを診断するには、まずユーザー クラスタの名前を取得します。
kubectl get cluster --kubeconfig=[USER_CLUSTER_KUBECONFIG]
次に、管理クラスタの kubeconfig とユーザー クラスタの名前を渡します。
gkectl diagnose cluster --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --cluster-name=[USER_CLUSTER_NAME]
ユーザー クラスタが正常に機能している場合、gkectl diagnose cluster
は次の出力を返します。
Diagnosing user cluster "[USER_CLUSTER_NAME]"... Checking cluster object...PASS Checking control plane pods...PASS Checking machine objects...PASS Checking other kube-system pods...PASS Cluster is healthy.
クラスタの状態のキャプチャ
gkectl diagnose cluster
がエラーを見つけた場合、クラスタの状態をキャプチャし、Google に情報を提供する必要があります。そのためには、gkectl diagnose snapshot
コマンドを使用します。
管理クラスタの状態のキャプチャ
管理クラスタの状態をキャプチャするには、次のコマンドを実行します。
gkectl diagnose snapshot --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG]
出力には、ファイルの一覧と tarball ファイルの名前が含まれます。
Taking snapshot of admin cluster "[ADMIN_CLUSTER_NAME]"... Using default snapshot configuration... Setting up "[ADMIN_CLUSTER_NAME]" ssh key file...DONE Taking snapshots... commands/kubectl_get_pods_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_kube-system commands/kubectl_get_deployments_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_kube-system commands/kubectl_get_daemonsets_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_kube-system ... nodes/[ADMIN_CLUSTER_NODE]/commands/journalctl_-u_kubelet nodes/[ADMIN_CLUSTER_NODE]/files/var/log/startup.log ... Snapshot succeeded. Output saved in [TARBALL_FILE_NAME].tar.gz.
tarball ファイルをディレクトリに抽出するには、次のコマンドを実行します。
tar -zxf [TARBALL_FILE_NAME] --directory [EXTRACTION_DIRECTORY_NAME]
スナップショットにより生成されたファイルのリストを表示するには、次のコマンドを実行します。
cd [EXTRACTION_DIRECTORY_NAME]/[EXTRACTED_SNAPSHOT_DIRECTORY] ls kubectlCommands ls nodes/[NODE_NAME]/commands ls nodes/[NODE_NAME]/files
特定の操作の詳細を確認するには、表示されたファイルのいずれかを開きます。
管理クラスタの SSH 認証鍵の指定
管理クラスタのスナップショットを取得すると、gkectl
は管理クラスタの秘密 SSH 認証鍵を自動的に検索します。--admin-ssh-key-path
パラメータを使用して、鍵を明示的に指定することもできます。
base64 エンコードされた秘密 SSH 認証鍵は、GKE On-Prem 構成ファイルに admincluster.spec.ssh.privatekey
の値として含まれています。鍵を抽出するには、base64 デコードして、新しいファイルに保存し、次のコマンドを実行します。
grep privatekey /path/to/config.yaml | awk '{print $2}' | base64 -d > [PATH_TO_DECODED_KEY]
次に、gkectl diagnose snapshot
コマンドで、--admin-ssh-key-path
をデコードされた鍵ファイルパスに設定します。
gkectl diagnose snapshot --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --admin-ssh-key-path=[PATH_TO_DECODED_KEY]
ユーザー クラスタの状態のキャプチャ
ユーザー クラスタの状態をキャプチャするには、次のコマンドを実行します。
gkectl diagnose snapshot --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --cluster-name=[USER_CLUSTER_NAME]
出力には、ファイルの一覧と tarball ファイルの名前が含まれます。
Taking snapshot of user cluster "[USER_CLUSTER_NAME]"... Using default snapshot configuration... Setting up "[USER_CLUSTER_NAME]" ssh key file...DONE commands/kubectl_get_pods_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_user commands/kubectl_get_deployments_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_user commands/kubectl_get_daemonsets_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_user ... commands/kubectl_get_pods_-o_yaml_--kubeconfig_.tmp.user-kubeconfig-851213064_--namespace_kube-system commands/kubectl_get_deployments_-o_yaml_--kubeconfig_.tmp.user-kubeconfig-851213064_--namespace_kube-system commands/kubectl_get_daemonsets_-o_yaml_--kubeconfig_.tmp.user-kubeconfig-851213064_--namespace_kube-system ... nodes/[USER_CLUSTER_NODE]/commands/journalctl_-u_kubelet nodes/[USER_CLUSTER_NODE]/files/var/log/startup.log ... Snapshot succeeded. Output saved in [FILENAME].tar.gz.
スナップショットのシナリオ
gkectl diagnose snapshot
コマンドは、4 つのシナリオをサポートしています。シナリオを指定するには、--scenario
フラグを使用します。使用できる値は、次のリストのとおりです。
system
: (デフォルト)システム Namespace(kube-system
とgke-system
)のスナップショットを収集します。system-with-logs
: ログを含むsystem
スナップショットを収集します。all
: すべての Namespace のスナップショットを収集します。all-with-logs
: ログを含むall
スナップショットを収集します。
4 つのシナリオはそれぞれ管理クラスタまたはユーザー クラスタで使用できるため、考えられる置換は 8 つあります。いくつかの方法を、次に例として示します。
system
シナリオを使用して、管理クラスタのスナップショットを作成する場合:
gkectl diagnose snapshot \ --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --admin-ssh-key-path=/path/to/decoded_key \ --scenario=system
system-with-logs
シナリオを使用して、ユーザー クラスタのスナップショットを作成する場合:
gkectl diagnose snapshot \ --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --user-cluster=[USER_CLUSTER_NAME] \ --scenario=system-with-logs
all
シナリオを使用して、ユーザー クラスタのスナップショットを作成する場合:
gkectl diagnose snapshot \ --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --cluster-name=[USER_CLUSTER_NAME] \ --scenario=all
all-with-logs
シナリオを使用して、管理クラスタのスナップショットを作成する場合:
gkectl diagnose snapshot \ --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --admin-ssh-key-path=/path/to/decoded_key \ --scenario=all-with-logs
スナップショットのドライランの実行
--dry-run
フラグを使用して、実行するアクションとスナップショット構成を表示できます。
管理クラスタでドライランを実行するには、次のコマンドを入力します。
gkectl diagnose snapshot --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --cluster-name=[ADMIN_CLUSTER_NAME] \ --admin-ssh-key-path=[PATH_TO_DECODED_KEY] \ --dry-run
ユーザー クラスタでドライランを実行するには、次のコマンドを入力します。
gkectl diagnose snapshot --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --cluster-name=[USER_CLUSTER_NAME] \ --dry-run
スナップショット構成の使用
4 つのシナリオがニーズを満たさない場合は、--config
フラグを使用して構成ファイルを渡すことで、カスタマイズされたスナップショットを作成できます。
gkectl diagnose snapshot --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --cluster-name=[USER_CLUSTER_NAME] \ --config=[SNAPSHOT_CONFIG_FILE]
いずれかのシナリオのスナップショット構成を表示するには、--dry-run
フラグを使用します。たとえば、ユーザー クラスタのデフォルトのシナリオ(system
)のスナップショット構成を表示するには、次のコマンドを入力します。
gkectl diagnose snapshot \ --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --cluster-name=[USER_CLUSTER_NAME] \ --scenario=system --dry-run
出力は次のようになります。
numOfParallelThreads: 10 excludeWords: - password kubectlCommands: - commands: - kubectl get clusters -o wide - kubectl get machines -o wide - kubectl get clusters -o yaml - kubectl get machines -o yaml - kubectl describe clusters - kubectl describe machines namespaces: - default - commands: - kubectl version - kubectl cluster-info - kubectl get nodes -o wide - kubectl get nodes -o yaml - kubectl describe nodes namespaces: [] - commands: - kubectl get pods -o wide - kubectl get deployments -o wide - kubectl get daemonsets -o wide - kubectl get statefulsets -o wide - kubectl get replicasets -o wide - kubectl get services -o wide - kubectl get jobs -o wide - kubectl get cronjobs -o wide - kubectl get endpoints -o wide - kubectl get configmaps -o wide - kubectl get pods -o yaml - kubectl get deployments -o yaml - kubectl get daemonsets -o yaml - kubectl get statefulsets -o yaml - kubectl get replicasets -o yaml - kubectl get services -o yaml - kubectl get jobs -o yaml - kubectl get cronjobs -o yaml - kubectl get endpoints -o yaml - kubectl get configmaps -o yaml - kubectl describe pods - kubectl describe deployments - kubectl describe daemonsets - kubectl describe statefulsets - kubectl describe replicasets - kubectl describe services - kubectl describe jobs - kubectl describe cronjobs - kubectl describe endpoints - kubectl describe configmaps namespaces: - kube-system - gke-system - gke-connect.* prometheusRequests: [] nodeCommands: - nodes: [] commands: - uptime - df --all --inodes - ip addr - sudo iptables-save --counters - mount - ip route list table all - top -bn1 - sudo docker ps -a - ps -edF - ps -eo pid,tid,ppid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm,args,cgroup - sudo conntrack --count nodeFiles: - nodes: [] files: - /proc/sys/fs/file-nr - /proc/sys/net/nf_conntrack_max
numOfParallelThreads
: スナップショットの作成に使用される並列スレッドの数。excludeWords
: スナップショットから除外する単語のリスト(大文字と小文字は区別されません)。これらの単語を含む行はスナップショットの結果から削除されます。指定したかどうかにかかわらず、「パスワード」は常に除外されます。kubectlCommands
: 実行する kubectl コマンドのリスト。結果は保存されます。コマンドは、対応する Namespace に対して実行されます。kubectl logs
コマンドの場合、対応する Namespace 内のすべての Pod とコンテナが自動的に追加されます。正規表現が、Namespace の指定に使用されます。Namespace を指定しない場合は、default
Namespace が使用されます。nodeCommands
: 対応するノードで実行するコマンドのリスト。結果は保存されます。ノードが指定されていない場合、ターゲット クラスタ内のすべてのノードが考慮されます。nodeFiles
: 対応するノードから収集されるファイルのリスト。ファイルは保存されます。ノードが指定されていない場合、ターゲット クラスタ内のすべてのノードが考慮されます。prometheusRequests
: Prometheus リクエストのリスト。結果は保存されます。