🪂

ラズパイk8sクラスタでsonobuoyを試してみる

2022/01/03に公開

はじめに

業務で新しくKubernetesクラスタを構築するタイミングがあり「sonobuoy」というツールを知ったので試してみました。

最近v1.23にアップグレードしたおうちラズパイクラスタで試してみたのですが、一部プラグインがうまく動作しなかったので、結局AKSを使って確認することになりました。
マネージドのクラスタでsonobuoyを使っても意味ないとの声が聞こえてきそうですが、今回はあくまで試してみることが目的なので、どのように結果が得られるのかを確認できればよいかなと思っています。

sonobuoyとは

Sonobuoyは、Kubernetesクラスタの状態を簡単に把握できる診断ツールのようです。
https://sonobuoy.io/

以下を確認できます

  • Conformance Testing
  • Workload Debugging
  • Custom Tests and Data Collection

ちなみに日本語ではソノブイと発音するらしいです。
こちらの記事に記載ありました。
https://cyberagent.ai/blog/tech/10208/

sonobuoyはプラグインという単位でテストを実行したり、データを収集したりできるようです。
とりあえず、公式ドキュメントを読みながらsonobuoyについて理解していこうと思います。
https://sonobuoy.io/sonobuoy-101/

インストール

ここからはマスターノードで実施しています。

まずは最新リリースをダウンロードします。
※自分の環境にあったバイナリをダウンロードしてください。
https://github.com/vmware-tanzu/sonobuoy/releases

$ wget -q --trust-server-names https://github.com/vmware-tanzu/sonobuoy/releases/download/v0.55.1/sonobuoy_0.55.1_linux_arm64.tar.gz -O sonobuoy_0.55.1_linux_arm64.tar.gz
$ tar -xvf sonobuoy_0.55.1_linux_arm64.tar.gz                                     
x LICENSE
x sonobuoy
$ ls                                                                               
LICENSE                            sonobuoy                           sonobuoy_0.55.1_linux_arm64.tar.gz

抽出したsonobuoyの実行可能ファイルをPATH配下に移動させます。

$ mv sonobuoy /usr/local/bin
$ which sonobuoy     
/usr/local/bin/sonobuoy

ラズパイクラスタでの確認

今回sonobuoyを試す環境

❯❯❯ kubectl get no
NAME    STATUS   ROLES                  AGE    VERSION
hkm01   Ready    control-plane,master   357d   v1.23.1
hkw01   Ready    worker                 357d   v1.23.1
hkw02   Ready    worker                 357d   v1.23.1

sonobuoyでテスト実施

--waitフラグをつけることでsonobuoyの実行が完了または失敗するまでの待ち時間を設定できます。
指定した場合、デフォルトの待ち時間は1日となります。

$ sonobuoy run --wait
time="2021-12-29T15:13:56Z" level=info msg="create request issued" name=sonobuoy namespace= resource=namespaces
time="2021-12-29T15:13:56Z" level=info msg="create request issued" name=sonobuoy-serviceaccount namespace=sonobuoy resource=serviceaccounts
time="2021-12-29T15:13:56Z" level=info msg="create request issued" name=sonobuoy-serviceaccount-sonobuoy namespace= resource=clusterrolebindings
time="2021-12-29T15:13:56Z" level=info msg="create request issued" name=sonobuoy-serviceaccount-sonobuoy namespace= resource=clusterroles
time="2021-12-29T15:13:56Z" level=info msg="create request issued" name=sonobuoy-config-cm namespace=sonobuoy resource=configmaps
time="2021-12-29T15:13:56Z" level=info msg="create request issued" name=sonobuoy-plugins-cm namespace=sonobuoy resource=configmaps
time="2021-12-29T15:13:56Z" level=info msg="create request issued" name=sonobuoy namespace=sonobuoy resource=pods
time="2021-12-29T15:13:56Z" level=info msg="create request issued" name=sonobuoy-aggregator namespace=sonobuoy resource=services
15:14:16          PLUGIN     NODE    STATUS   RESULT   PROGRESS
15:14:16    systemd-logs    hkm01   running
15:14:16    systemd-logs    hkw01   running
15:14:16    systemd-logs    hkw02   running
15:14:16             e2e   global   running
15:14:16
15:14:16 Sonobuoy is still running. Runs can take 60 minutes or more depending on cluster and plugin configuration.
...
15:16:16    systemd-logs    hkm01   complete
15:16:16    systemd-logs    hkw02   complete
15:17:16    systemd-logs    hkw01   complete
...
15:21:36             e2e   global     failed
...
15:22:16    systemd-logs    hkm01   complete   passed
15:22:16    systemd-logs    hkw01   complete   passed
15:22:16    systemd-logs    hkw02   complete   passed
15:22:16             e2e   global     failed   failed
15:22:16 Sonobuoy has completed. Use `sonobuoy retrieve` to get results.

e2eテストのステータスが失敗で終わっていますね。。

結果の確認

namespace内を見てみると、podとserviceが作成されていました。

❯❯❯ kubectl get all -n sonobuoy
NAME           READY   STATUS    RESTARTS   AGE
pod/sonobuoy   1/1     Running   0          24m

NAME                          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/sonobuoy-aggregator   ClusterIP   10.106.51.63   <none>        8080/TCP   24m

テスト結果を確認します。
sonobuoy resultsコマンドを使用すると、最初にtarballからファイルを抽出しなくても、結果を確認できます。詳細については以下ページを参照してください。
https://sonobuoy.io/docs/v0.55.1/results/

$ sonobuoy retrieve
202112291514_sonobuoy_03a65fc1-53a0-47ce-b839-fdac96e38587.tar.gz

$sonobuoy results 202112291514_sonobuoy_03a65fc1-53a0-47ce-b839-fdac96e38587.tar.gz
Plugin: systemd-logs
Status: passed
Total: 3
Passed: 3
Failed: 0
Skipped: 0

Plugin: e2e
Status: failed
Total: 1
Passed: 0
Failed: 1
Skipped: 0

Failed tests:
Container e2e is in a terminated state (exit code 127) due to reason: Error:

「exit code 127」となり、テストが失敗していることがわかりました。もっと詳細を確認してみます。

❯❯❯ kubectl -n sonobuoy logs sonobuoy
time="2021-12-29T15:14:10Z" level=info msg="Scanning plugins in ./plugins.d (pwd: /)"
time="2021-12-29T15:14:10Z" level=info msg="Scanning plugins in /etc/sonobuoy/plugins.d (pwd: /)"
time="2021-12-29T15:14:10Z" level=info msg="Directory (/etc/sonobuoy/plugins.d) does not exist"
time="2021-12-29T15:14:10Z" level=info msg="Scanning plugins in ~/sonobuoy/plugins.d (pwd: /)"
time="2021-12-29T15:14:10Z" level=info msg="Directory (~/sonobuoy/plugins.d) does not exist"
time="2021-12-29T15:14:10Z" level=info msg="Filtering namespaces based on the following regex:.*"
time="2021-12-29T15:14:10Z" level=info msg="Namespace cassandra Matched=true"
time="2021-12-29T15:14:10Z" level=info msg="Namespace default Matched=true"
time="2021-12-29T15:14:10Z" level=info msg="Namespace dev Matched=true"
time="2021-12-29T15:14:10Z" level=info msg="Namespace ingress-system Matched=true"
time="2021-12-29T15:14:10Z" level=info msg="Namespace kube-node-lease Matched=true"
time="2021-12-29T15:14:10Z" level=info msg="Namespace kube-public Matched=true"
time="2021-12-29T15:14:10Z" level=info msg="Namespace kube-system Matched=true"
time="2021-12-29T15:14:10Z" level=info msg="Namespace metallb-system Matched=true"
time="2021-12-29T15:14:10Z" level=info msg="Namespace monitoring Matched=true"
time="2021-12-29T15:14:10Z" level=info msg="Namespace prd Matched=true"
time="2021-12-29T15:14:10Z" level=info msg="Namespace sonobuoy Matched=true"
time="2021-12-29T15:14:10Z" level=info msg="Namespace stg Matched=true"
time="2021-12-29T15:14:10Z" level=info msg="Starting server Expected Results: [{hkm01 systemd-logs} {hkw01 systemd-logs} {hkw02 systemd-logs} {global e2e}]"
time="2021-12-29T15:14:10Z" level=info msg="Starting annotation update routine"
time="2021-12-29T15:14:10Z" level=info msg="Starting aggregation server" address=0.0.0.0 port=8080
time="2021-12-29T15:14:10Z" level=info msg="Running plugin" plugin=systemd-logs
time="2021-12-29T15:14:10Z" level=info msg="Running plugin" plugin=e2e
time="2021-12-29T15:15:48Z" level=info msg="received request" client_cert="[systemd-logs]" method=PUT node=hkm01 plugin_name=systemd-logs url=/api/v1/results/by-node/hkm01/systemd-logs
time="2021-12-29T15:16:09Z" level=info msg="received request" client_cert="[systemd-logs]" method=PUT node=hkw02 plugin_name=systemd-logs url=/api/v1/results/by-node/hkw02/systemd-logs
time="2021-12-29T15:17:02Z" level=info msg="received request" client_cert="[systemd-logs]" method=PUT node=hkw01 plugin_name=systemd-logs url=/api/v1/results/by-node/hkw01/systemd-logs
time="2021-12-29T15:21:33Z" level=info msg="received internal aggregator result" node=global plugin_name=e2e
time="2021-12-29T15:21:33Z" level=info msg="Last update to annotations on exit"
time="2021-12-29T15:21:33Z" level=info msg="Shutting down aggregation server"
time="2021-12-29T15:21:33Z" level=info msg="Resources is not set explicitly implying query all resources, but skipping secrets for safety. Specify the value explicitly in Resources to gather this data."
time="2021-12-29T15:21:33Z" level=info msg="Collecting Node Configuration and Health..."
time="2021-12-29T15:21:33Z" level=info msg="Creating host results for hkm01 under /tmp/sonobuoy/03a65fc1-53a0-47ce-b839-fdac96e38587/hosts/hkm01\n"
time="2021-12-29T15:21:33Z" level=info msg="Creating host results for hkw01 under /tmp/sonobuoy/03a65fc1-53a0-47ce-b839-fdac96e38587/hosts/hkw01\n"
time="2021-12-29T15:21:33Z" level=info msg="Creating host results for hkw02 under /tmp/sonobuoy/03a65fc1-53a0-47ce-b839-fdac96e38587/hosts/hkw02\n"
time="2021-12-29T15:21:33Z" level=info msg="Running cluster queries"
W1229 15:21:33.617709       1 warnings.go:70] v1 ComponentStatus is deprecated in v1.19+
time="2021-12-29T15:21:35Z" level=info msg="Running ns query (cassandra)"
time="2021-12-29T15:21:35Z" level=info msg="Running ns query (default)"
time="2021-12-29T15:21:36Z" level=info msg="Running ns query (dev)"
time="2021-12-29T15:21:37Z" level=info msg="Running ns query (ingress-system)"
time="2021-12-29T15:21:38Z" level=info msg="Running ns query (kube-node-lease)"
time="2021-12-29T15:21:40Z" level=info msg="Running ns query (kube-public)"
time="2021-12-29T15:21:41Z" level=info msg="Running ns query (kube-system)"
time="2021-12-29T15:21:42Z" level=info msg="Running ns query (metallb-system)"
time="2021-12-29T15:21:44Z" level=info msg="Running ns query (monitoring)"
time="2021-12-29T15:21:45Z" level=info msg="Running ns query (prd)"
time="2021-12-29T15:21:46Z" level=info msg="Running ns query (sonobuoy)"
time="2021-12-29T15:21:48Z" level=info msg="Running ns query (stg)"
time="2021-12-29T15:21:49Z" level=info msg="Namespace cassandra Matched=false"
time="2021-12-29T15:21:49Z" level=info msg="Namespace default Matched=false"
time="2021-12-29T15:21:49Z" level=info msg="Namespace dev Matched=false"
time="2021-12-29T15:21:49Z" level=info msg="Namespace ingress-system Matched=false"
time="2021-12-29T15:21:49Z" level=info msg="Namespace kube-node-lease Matched=false"
time="2021-12-29T15:21:49Z" level=info msg="Namespace kube-public Matched=false"
time="2021-12-29T15:21:49Z" level=info msg="Namespace kube-system Matched=true"
time="2021-12-29T15:21:49Z" level=info msg="Namespace metallb-system Matched=false"
time="2021-12-29T15:21:49Z" level=info msg="Namespace monitoring Matched=false"
time="2021-12-29T15:21:49Z" level=info msg="Namespace prd Matched=false"
time="2021-12-29T15:21:49Z" level=info msg="Namespace sonobuoy Matched=true"
time="2021-12-29T15:21:49Z" level=info msg="Namespace stg Matched=false"
time="2021-12-29T15:21:49Z" level=info msg="Collecting Pod Logs by namespace (kube-system)"
time="2021-12-29T15:22:00Z" level=info msg="Collecting Pod Logs by namespace (sonobuoy)"
time="2021-12-29T15:22:00Z" level=info msg="Collecting Pod Logs by FieldSelectors []"
time="2021-12-29T15:22:00Z" level=info msg="Log lines after this point will not appear in the downloaded tarball."
time="2021-12-29T15:22:01Z" level=info msg="Results available at /tmp/sonobuoy/202112291514_sonobuoy_03a65fc1-53a0-47ce-b839-fdac96e38587.tar.gz"
time="2021-12-29T15:22:04Z" level=info msg="no-exit was specified, sonobuoy is now blocking"

logの確認では欲しい情報は得られませんでした。sonobuoy resultsにオプションをつけて確認してみます。--modeは出力形式を変更できます。有効なオプションとして、reportdetaileddumpを指定できます。デフォルトはreportです。

$ sonobuoy results 202112291514_sonobuoy_03a65fc1-53a0-47ce-b839-fdac96e38587.tar.gz --plugin e2e --mode detailed -s | jq '.error, .pod.status'
"Container e2e is in a terminated state (exit code 127) due to reason: Error: "
{
  "phase": "Running",
  "conditions": [
    {
      "type": "Initialized",
      "status": "True",
      "lastProbeTime": null,
      "lastTransitionTime": "2021-12-29T15:14:10Z"
    },
    {
      "type": "Ready",
      "status": "False",
      "lastProbeTime": null,
      "lastTransitionTime": "2021-12-29T15:14:10Z",
      "reason": "ContainersNotReady",
      "message": "containers with unready status: [e2e]"
    },
    {
      "type": "ContainersReady",
      "status": "False",
      "lastProbeTime": null,
      "lastTransitionTime": "2021-12-29T15:14:10Z",
      "reason": "ContainersNotReady",
      "message": "containers with unready status: [e2e]"
    },
    {
      "type": "PodScheduled",
      "status": "True",
      "lastProbeTime": null,
      "lastTransitionTime": "2021-12-29T15:14:10Z"
    }
  ],
  "hostIP": "192.168.13.103",
  "podIP": "10.244.2.24",
  "podIPs": [
    {
      "ip": "10.244.2.24"
    }
  ],
  "startTime": "2021-12-29T15:14:10Z",
  "containerStatuses": [
    {
      "name": "e2e",
      "state": {
        "terminated": {
          "exitCode": 127,
          "reason": "Error",
          "startedAt": "2021-12-29T15:16:28Z",
          "finishedAt": "2021-12-29T15:16:28Z",
          "containerID": "docker://44d56066a3fce59a374c77f6ee977a0f5078746165d29eecdf215fcb12efa6c2"
        }
      },
      "lastState": {},
      "ready": false,
      "restartCount": 0,
      "image": "k8s.gcr.io/conformance:v1.20.14",
      "imageID": "docker-pullable://k8s.gcr.io/conformance@sha256:400c5376d4e515e40d3d434e9eed9214357333f9577c2134368f3a9e1cd3c9d8",
      "containerID": "docker://44d56066a3fce59a374c77f6ee977a0f5078746165d29eecdf215fcb12efa6c2",
      "started": false
    },
    {
      "name": "sonobuoy-worker",
      "state": {
        "running": {
          "startedAt": "2021-12-29T15:16:30Z"
        }
      },
      "lastState": {},
      "ready": true,
      "restartCount": 0,
      "image": "sonobuoy/sonobuoy:v0.55.1",
      "imageID": "docker-pullable://sonobuoy/sonobuoy@sha256:9f0818cca26dd8e126bf6187b933f51557a6ac7de342e0fe6a789f55fc047eb9",
      "containerID": "docker://d09706c34e011191a1c4675b8a80434578d74ce662be89bd51c9da2ca65319c5",
      "started": true
    }
  ],
  "qosClass": "BestEffort"
}

詳細を確認してもわからなかったので一度sonobuoyを削除し、もう一度実行して起動中のpodのステータスを確認します。

$ sonobuoy delete --wait
INFO[0000] delete request issued                         kind=namespace namespace=sonobuoy
INFO[0000] delete request issued                         kind=clusterrolebindings
INFO[0000] delete request issued                         kind=clusterroles

Namespace "sonobuoy" has status {Phase:Terminating Conditions:[]}

Namespace "sonobuoy" has status {Phase:Terminating Conditions:[{Type:NamespaceDeletionDiscoveryFailure Status:False LastTransitionTime:2021-12-29 16:41:33 +0000 UTC Reason:ResourcesDiscovered Message:All resources successfully discovered} {Type:NamespaceDeletionGroupVersionParsingFailure Status:False LastTransitionTime:2021-12-29 16:41:33 +0000 UTC Reason:ParsedGroupVersions Message:All legacy kube types successfully parsed} {Type:NamespaceDeletionContentFailure Status:False LastTransitionTime:2021-12-29 16:41:33 +0000 UTC Reason:ContentDeleted Message:All content successfully deleted, may be waiting on finalization} {Type:NamespaceContentRemaining Status:True LastTransitionTime:2021-12-29 16:41:33 +0000 UTC Reason:SomeResourcesRemain Message:Some resources are remaining: pods. has 1 resource instances} {Type:NamespaceFinalizersRemaining Status:False LastTransitionTime:2021-12-29 16:41:33 +0000 UTC Reason:ContentHasNoFinalizers Message:All content-preserving finalizers finished}]}

Namespace "sonobuoy" has been deleted

Deleted all ClusterRoles and ClusterRoleBindings.

再度実行します。

$ sonobuoy run --wait
INFO[0000] create request issued                         name=sonobuoy namespace= resource=namespaces
INFO[0000] create request issued                         name=sonobuoy-serviceaccount namespace=sonobuoy resource=serviceaccounts
INFO[0000] create request issued                         name=sonobuoy-serviceaccount-sonobuoy namespace= resource=clusterrolebindings
INFO[0000] create request issued                         name=sonobuoy-serviceaccount-sonobuoy namespace= resource=clusterroles
INFO[0000] create request issued                         name=sonobuoy-config-cm namespace=sonobuoy resource=configmaps
INFO[0000] create request issued                         name=sonobuoy-plugins-cm namespace=sonobuoy resource=configmaps
INFO[0000] create request issued                         name=sonobuoy namespace=sonobuoy resource=pods
INFO[0000] create request issued                         name=sonobuoy-aggregator namespace=sonobuoy resource=services

# リソースの確認
❯❯❯ kubectl -n sonobuoy get all 
NAME                                                          READY   STATUS    RESTARTS   AGE
pod/sonobuoy                                                  1/1     Running   0          34s
pod/sonobuoy-e2e-job-b81fa37e30b04850                         1/2     Error     0          31s
pod/sonobuoy-systemd-logs-daemon-set-afebfddfa43f4f62-6jsc4   2/2     Running   0          31s
pod/sonobuoy-systemd-logs-daemon-set-afebfddfa43f4f62-8cwrp   2/2     Running   0          31s
pod/sonobuoy-systemd-logs-daemon-set-afebfddfa43f4f62-prpxz   2/2     Running   0          31s

NAME                          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/sonobuoy-aggregator   ClusterIP   10.98.138.113   <none>        8080/TCP   34s

NAME                                                               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/sonobuoy-systemd-logs-daemon-set-afebfddfa43f4f62   3         3         3       3            3           kubernetes.io/os=linux   31s

sonobuoy-e2e-jobのところでエラーになっているのでlogを確認します。

❯❯❯ kubectl -n sonobuoy logs sonobuoy-e2e-job-b81fa37e30b04850  
error: a container name must be specified for pod sonobuoy-e2e-job-b81fa37e30b04850, choose one of: [e2e sonobuoy-worker]

❯❯❯ kubectl -n sonobuoy logs ls-b81fa37e30b04850 -c e2e  
+ /gorunner
/run_e2e.sh: line 43: /gorunner: No such file or directory
+ ret=127
+ exit 127

run_e2e.shで呼び出しているgorunnerがうまく実行できていないようです。
今回使用しているラズパイクラスタはエミュレータ使ってx86_64のイメージを動作できるようにしているのですが、そこらへんの影響でうまくいっていない気がします。(あまり細かいことは知識が足らずわかりませんでした。)

$ docker run -it k8s.gcr.io/conformance:v1.20.14 /bin/bash

root@d730a2ab27ce:/usr/local/bin# ls /
bin   dev  gorunner  kubernetes  lib64	mnt  proc  run	       sbin  sys  usr
boot  etc  home      lib	 media	opt  root  run_e2e.sh  srv   tmp  var

root@d730a2ab27ce:/usr/local/bin# /gorunner
bash: /gorunner: No such file or directory

root@d730a2ab27ce:/usr/local/bin# file /gorunner
/gorunner: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, stripped

root@d730a2ab27ce:/usr/local/bin# uname -a
Linux d730a2ab27ce 5.4.0-1045-raspi #49-Ubuntu SMP PREEMPT Wed Sep 29 17:49:16 UTC 2021 x86_64 GNU/Linux

いろいろと確認してみましたが、やはりコンテナがx86_64で動作しているのにARMのgorunnerを実行しようとしていることが問題なのでしょうか。
ちなみにsonobuoyのamdバイナリを取得して再度試してみましたが、上記と同じ結果でうまくいきませんでした。

ラズパイクラスタのE2Eテストは今回は一旦諦めます。また進展があったら追記したいと思います。

AKSでの確認

ラズパイクラスタでうまくいかなかったのですが、どのような結果が得れるのかを知りたかったのでAKSでも確認してみました。

手順はラズパイクラスの時と同じなので結果だけ記載します。

❯❯❯ sonobuoy run --wait
INFO[0001] create request issued                         name=sonobuoy namespace= resource=namespaces
INFO[0001] create request issued                         name=sonobuoy-serviceaccount namespace=sonobuoy resource=serviceaccounts
INFO[0001] create request issued                         name=sonobuoy-serviceaccount-sonobuoy namespace= resource=clusterrolebindings
INFO[0001] create request issued                         name=sonobuoy-serviceaccount-sonobuoy namespace= resource=clusterroles
INFO[0001] create request issued                         name=sonobuoy-config-cm namespace=sonobuoy resource=configmaps
INFO[0001] create request issued                         name=sonobuoy-plugins-cm namespace=sonobuoy resource=configmaps
INFO[0001] create request issued                         name=sonobuoy namespace=sonobuoy resource=pods
INFO[0001] create request issued                         name=sonobuoy-aggregator namespace=sonobuoy resource=services
20:19:15          PLUGIN                                NODE     STATUS   RESULT             PROGRESS
20:19:15    systemd-logs   aks-agentpool-89104932-vmss000000   complete
20:19:15    systemd-logs   aks-agentpool-89104932-vmss000001   complete
20:19:15             e2e                              global    running            4/337 (0 failures)
20:19:15
20:19:15 Sonobuoy is still running. Runs can take 60 minutes or more depending on cluster and plugin configuration.
20:19:35             e2e                              global    running            11/337 (0 failures)
20:19:55             e2e                              global    running            18/337 (0 failures)
20:20:35             e2e                              global    running            21/337 (0 failures)
20:21:35             e2e                              global    running            24/337 (0 failures)
...
...
21:48:35             e2e                              global    running            312/337 (0 failures)
21:48:55             e2e                              global    running            316/337 (0 failures)
21:49:15             e2e                              global    running            319/337 (0 failures)
21:49:35             e2e                              global    running            321/337 (0 failures)
21:49:55             e2e                              global    running            331/337 (0 failures)
21:50:15             e2e                              global    running            333/337 (0 failures)
...
21:50:55    systemd-logs   aks-agentpool-89104932-vmss000000   complete   passed
21:50:55    systemd-logs   aks-agentpool-89104932-vmss000001   complete   passed
21:50:55             e2e                              global   complete   passed   337/337 (0 failures)
21:50:55 Sonobuoy has completed. Use `sonobuoy retrieve` to get results.

完了するまでに1時間半ぐらいかかりました。結構長いですね。
どんなテストが実行されているかはテスト名からある程度推測できそうです。
実際のテスト内容についてですが、Goで書かれており以下から実装の詳細を確認できます。
https://github.com/kubernetes/kubernetes/tree/master/test/e2e

❯❯❯ sonobuoy results 202201021118_sonobuoy_95d74bff-b3fb-484c-b5a6-4539b10a4a2e.tar.gz --plugin e2e --mode detailed | jq 'select(.status!="skipped").name' | head
"[sig-storage] Projected configMap updates should be reflected in volume [NodeConformance] [Conformance]"
"[sig-node] InitContainer [NodeConformance] should invoke init containers on a RestartNever pod [Conformance]"
"[sig-cli] Kubectl client Kubectl patch should add annotations for pods in rc  [Conformance]"
"[sig-api-machinery] AdmissionWebhook [Privileged:ClusterAdmin] patching/updating a mutating webhook should work [Conformance]"

ちなみにデフォルトでは337項目のテストが実行されるようですが、全て合わせると5770項目もあるようです。CNCFの認定プログラムであるCertified Kubernetesに認定されるには全ての項目に合格する必要があるのでしょうか。大変ですね。。

❯❯❯ sonobuoy results 202201021118_sonobuoy_95d74bff-b3fb-484c-b5a6-4539b10a4a2e.tar.gz --plugin e2e --mode detailed | jq 'select(.status!="skipped").name' | wc -l
     337
[~/w/k/sonobuoy] (01:05:35)
❯❯❯ sonobuoy results 202201021118_sonobuoy_95d74bff-b3fb-484c-b5a6-4539b10a4a2e.tar.gz --plugin e2e --mode detailed | jq .name | wc -l
    5770

クイックモードで実行することも可能なようです。これはクラスターを作成したばかりで、ポッドを期待通りに実行できることを確認したい場合などに使用するようです。
https://sonobuoy.io/understanding-e2e-tests/

❯❯❯ sonobuoy run --mode=quick
INFO[0001] create request issued                         name=sonobuoy namespace= resource=namespaces
INFO[0001] create request issued                         name=sonobuoy-serviceaccount namespace=sonobuoy resource=serviceaccounts
INFO[0001] create request issued                         name=sonobuoy-serviceaccount-sonobuoy namespace= resource=clusterrolebindings
INFO[0001] create request issued                         name=sonobuoy-serviceaccount-sonobuoy namespace= resource=clusterroles
INFO[0001] create request issued                         name=sonobuoy-config-cm namespace=sonobuoy resource=configmaps
INFO[0001] create request issued                         name=sonobuoy-plugins-cm namespace=sonobuoy resource=configmaps
INFO[0001] create request issued                         name=sonobuoy namespace=sonobuoy resource=pods
INFO[0001] create request issued                         name=sonobuoy-aggregator namespace=sonobuoy resource=services
[~/W/k/sonobuoy] (01:13:44)
❯❯❯ sonobuoy status
PLUGIN    STATUS   RESULT   COUNT   PROGRESS
            e2e   running                1
   systemd-logs   running                2

Sonobuoy is still running. Runs can take 60 minutes or more depending on cluster and plugin configuration.
[~/W/k/sonobuoy] (01:13:52)
❯❯❯ sonobuoy results 202201020847_sonobuoy_c82b5cd4-52f5-4401-b3f2-90ec613d4483.tar.gz --plugin e2e --mode detailed | jq ' select(.status!="skipped")'
{
  "name": "[sig-node] Pods should be submitted and removed [NodeConformance] [Conformance]",
  "status": "passed",
  "meta": {
    "path": "e2e|junit_01.xml|Kubernetes e2e suite"
  }
}

おまけ

sonobuoy runのオプション

今回使用したオプションのみ記載

Flag description
--context kubeconfigのコンテキストを指定
--kube-conformance-image E2Eプラグインのコンテナimageを上書きする
--kubeconfig kubeconfigファイルへのパスを指定
--kubernetes-version kubernetesのバージョンを指定(デフォルトはautoでE2Eイメージのバージョンを使用)
--mode E2Eプラグインを動作させるモードを指定
--namespace Sonobuoyを実行するためのnamespaceを指定
--wait sonobuoyの実行が完了または失敗するまでのCLIが待つ時間を指定。デフォルトは1日。

まとめ

当初予定していたラズパイクラスタでsonobuoyのE2Eテストを試すことはできませんでしたが、なんとなくsonobuoyの使い方を理解できたのでよしとします。
時間があればどのようなテストを実行しているのかなども見てみようと思っています。

参考

https://cyberagent.ai/blog/tech/10208/
https://sonobuoy.io/docs/v0.55.1/

Discussion