Crash Recovery and Diagnostics for Kubernetesを使って、Kubernetesクラスタのログバンドルを収集する

## Crash Recovery and Diagnostics for Kubernetesとは？

[Crash Recovery and Diagnostics for Kubernetes](https://github.com/vmware-tanzu/crash-diagnostics)は、Kubernetesクラスタの診断ログを収集するためのツールです。指定のファイルに従って、Kubernetesクラスタの情報を収集してくれます。

Tanzu Kubernetes Grid(TKG)では、Crash Recovery and Diagnostics for Kubernetesの署名済みバイナリを提供しています。

## Crash Recovery and Diagnostics for Kubernetesのインストール

Mac OS用バイナリには[既知の問題](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.0/rn/VMware-Tanzu-Kubernetes-Grid-10-Release-Notes.html#installation-issues-known)があるため、今回はLinuxにインストールします。

1. [MyVMware](https://www.vmware.com/go/get-tkg)から、`crash-diagnostics-v0.2.2.tar.gz`をダウンロードします。
2. `tar`コマンドを使ってダウンロードしたファイル展開します。実行権限付与

    ```
    $ tar -xzf crash-diagnostics-v0.2.2.tar.gz
    $ gunzip crash-diagnostics-darwin-v0.2.2.gz
    ```

3. `/usr/local/bin`配下に移動して、実行権限を付与します。

    ```
    $ sudo mv ./crash-diagnostics-darwin-v0.2.2  /usr/local/bin/crash-diagnostics
    $ chmod +x /usr/local/bin/crash-diagnostics
    ```

## Crash Recovery and Diagnostics for Kubernetesの実行

[前回の記事](https://qiita.com/ttani03/items/f7e6a8bb01d14a5c9312)の最後に展開したKubernetesクラスタ`dev-cluster`に対して、Crash Recovery and Diagnostics for Kubernetesを実行します。

1. `crash-diagnostics-v0.2.2.tar.gz`に含まれていた`Diagnostics.file`を以下のように編集します。
    a. KubernetesノードのIPアドレスとポートを指定します。 `dev-cluster`ではマスターノード（192.168.7.50）とワーカーノード（192.168.7.55）を展開しています。

    ```
    # FROM specifies a space-separated host list used to get diagnostics data.
    # Retries is the maximum number of connection attempts made to connect to hosts.
    FROM hosts:"192.168.7.50:22 192.168.7.55:22" retries:"20"
    ```
    
    b. SSHユーザとSSH鍵の絶対パスを指定します。TKGで展開したクラスタの場合、ユーザは`capv`、鍵はManagementクラスタの展開時に指定したものになります。

    ```
    # Environment variables used later in the file
    ENV SSH_USER=capv
    ENV SSH_KEY=/home/ttanigaki/.ssh/id_rsa
    ```
    
    c. 作業用ディレクトリを絶対パスで指定します。今回は`/tmp`配下に作成し`dev-cluster`ディレクトリを作業用ディレクトリとして使用します。

    ```    
    # WORKDIR specifies a location on disk where the tool stages files
    # before they are bundled.
    WORKDIR /tmp/dev-cluster
    ```

    d. ログバンドルの出力先ディレクトリとファイル名を絶対パスで指定します。

    ```
    # OUTPUT specifies a path for the generated tar.gz file output bundle
    OUTPUT /tmp/dev-cluster-logs.tar.gz
    ```

    e. Kubernetesクラスタの設定ファイルを絶対パスで指定します。

    ```    
    # KUBECONFIG specifies the location of a kubeconfig file
    # used by subsequent Kubernetes commands below.
    KUBECONFIG /home/ttanigaki/.kube/config
    ```

2. `Diagnostics.file`ファイルが配置されているディレクトリで、`crash-diagnostics run`コマンドを実行します。

    ```
    $ crash-diagnostics run
    INFO[0000] Parsing script file                          
    INFO[0000] Executing script file                        
    WARN[0055] CAPTURE remote command sudo docker ps -a failed: SSH: error waiting for response: Process exited with status 1 
    WARN[0056] CAPTURE remote command sudo docker ps -a failed: SSH: error waiting for response: Process exited with status 1 
    WARN[0057] CAPTURE remote command sudo systemctl status docker failed: SSH: error waiting for response: Process exited with status 4 
    WARN[0058] CAPTURE remote command sudo systemctl status docker failed: SSH: error waiting for response: Process exited with status 4 
    INFO[0060] KUBEGET: getting API objects (this may take a while) 
    INFO[0060] KUBEGET: getting API objects (this may take a while) 
    INFO[0067] Created output at path /tmp/dev-cluster-logs.tar.gz 
    INFO[0067] Done
    ```
    ※dockerに関するエラーが出力されていますが、これはTKGで展開したノードにはdockerがインストールされていないことが理由です。

3. `/tmp/dev-cluster-logs.tgz`が出力されていることを確認します。

    ```
    $ ls -l /tmp/dev-cluster-logs.tar.gz
    -rw-rw-r-- 1 ttanigaki ttanigaki 374894  4月 26 22:29 /tmp/dev-cluster-logs.tar.gz
    ```

4. 展開すると以下のように、各ノードの情報やKubernetesクラスタの情報が含まれていることが確認できます。

    ```
    └── tmp
        └── dev-cluster
            ├── 192_168_7_50_22
            │   ├── sudo_arp__a.txt
            │   ├── sudo_bash__c__ulimit__a_.txt
            │   ├── sudo_bash__c__umask_.txt
            │   ├── sudo_cat__proc_cpuinfo.txt
    ~~ 略 ~~
            └── kubeget
                ├── default
                │   └── pods.json
                ├── kube-node-lease
                │   └── pods.json
                ├── kube-public
                │   └── pods.json
                └── kube-system
    ~~ 略 ~~
    53 directories, 93 files
    ```