Blog
[Kubernetes] Sonobuoy を使って Kubernetes Cluster の E2E テストを行なう
こんにちは。
Central Infrastructure Agency の青山 真也です。
もうじき KubeCon + CloudNativeCon 2017 ですね。今から非常に楽しみです。
本日は GKE like な弊社のオンプレコンテナ基盤 AKE でも利用している E2E テストツールの Sonobuoy と Certified Kubernetes Platform & Distribution についてご紹介したいと思います。
AKE では、”type LoadBalancer” のために Kubernetes に対してパッチをあてていたり、1 から Kubernetes Cluster を構築しているため E2E テストが欠かせません。
そのため、AKE でもこの Conformance Program でも使われている Sonobuoy を使った E2E テストを実施しています。
現状は商用利用かつ CNCF のメンバーでもないため Certified Kubernetes に認定はされていないのですが、E2E テスト自体はパスしているため事実上互換性のある Kubernetes Platform として提供出来ています。
CNCF と Certified Kubernetes Platform & Distribution
コンテナオーケストレーションエンジンのデファクトスタンダードともなってきた Kubernetes ですが、様々なクラウドプロバイダーが提供する Kubernetes Platform、OSS ツールや各ベンダーが拡張して出している Kubernetes Distribution など色々な Kubernetes 環境が存在します。
そのため、ユーザはこれらの Kubernetes 環境を利用する際に Kubernetes としての機能を正しく保有しているかどうかを確認することが必要でした。
Kubernetes を管理・運営している Cloud Native Computing Foundation (CNCF) はこの問題に対して、これらの Kubernetes Platform & Distribution が正しく Kubernetes として動作していることを保証するために Conformance Program を提供しています。
Conformance Program は Kubernetes 1.7 以降に対応しています。
Conformance Program では、下記の 4 つのフェーズを行なう必要があります。
1.Certified Kubernetes についての説明を読む
2.Sonobuoy による E2E テストを行なう
3.CNCF に連絡・Github にデータを PR であげる
4.CNCF からの回答を待つ
1つ目の項目に関しては Certified Kubernetes に認定された場合にロゴマークの使用が許可される等の規約的なものやこのプログラムの目的などが書かれています。
4つ目の項目に関しては、3 で申請した後のレビュー待ちの状態です。
そのため、認定を受ける際に行なう作業は主に2番目と3番目の項目になります。
E2E テストツール Sonobuoy
Kubernetes クラスタが機能として機能しているかどうかを確認するために、Conformance Program では E2E テストツールの Sonobuoy を利用します。
ちなみに日本語ではソノブイと発音します。
Sonobuoy は航空機から海へ投下して利用するソナー内蔵の対潜水艦用捜索機のことだそうです。
Sonobuoy は Sonar(ソナー)+ Buoy(ブイ、浮き)の造語です。
Kubernetes が正しく動作するかどうかをチェックするというような意味合いが込められてるんじゃないでしょうか。
Sonobuoy を実行するには下記のコマンドを実行します。
実行後は Sonobuoy 用の Pod や Pod が利用する ConfigMap の他にも ClusterRole や ClusterRoleBinding や ServiceAccount などが展開されます。
また、全てのリソースは sonobuoy Namespace に配置されます。
なお、kubectl を実行するユーザは、ClusterRole や ClusterRoleBinding が作成可能なユーザで行って下さい。
1 |
$ curl -L https://raw.githubusercontent.com/cncf/k8s-conformance/master/sonobuoy-conformance.yaml | kubectl apply -f - |
テスト自体は、
- 各 Kubernetes API リソースのチェック
- ネットワークの疎通性チェック
- Internal Cluster Network のセグメントチェック
- kubedns のドメイン名チェック
- その他多岐にわたるテスト
など、結構細かく実施されます。
また、テストされている E2E テスト自体は Golang で書かれており、https://github.com/kubernetes/kubernetes/tree/master/test/e2e に実体があります。
Sonobuoy のチェック自体は大体 1 時間ちょっとかかるため、気長に待っている必要があります。
テストが終わった判定として下記のようにログを確認し、no-exit was specified, sonobuoy is now blocking が表示するまで待つ方法が公式に書かれていますが、終了判定の自動化が出来ません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
$ kubectl logs -f -n sonobuoy sonobuoy time="2017-11-19T15:21:18Z" level=info msg="Scanning plugins in ./plugins.d (pwd: /)" time="2017-11-19T15:21:18Z" level=warning msg="Unsupported plugin file detected ..119811_20_11_00_21_04.915096861" time="2017-11-19T15:21:18Z" level=warning msg="Unsupported plugin file detected ..data" time="2017-11-19T15:21:18Z" level=info msg="Scanning plugins in /etc/sonobuoy/plugins.d (pwd: /)" time="2017-11-19T15:21:18Z" level=info msg="Directory (/etc/sonobuoy/plugins.d) does not exist" time="2017-11-19T15:21:18Z" level=info msg="Scanning plugins in ~/sonobuoy/plugins.d (pwd: /)" time="2017-11-19T15:21:18Z" level=info msg="Directory (~/sonobuoy/plugins.d) does not exist" time="2017-11-19T15:21:18Z" level=info msg="Loading plugin driver Job" time="2017-11-19T15:21:18Z" level=info msg="Namespace default Matched=true" time="2017-11-19T15:21:18Z" level=info msg="Namespace kube-public Matched=true" time="2017-11-19T15:21:18Z" level=info msg="Namespace kube-system Matched=true" time="2017-11-19T15:21:18Z" level=info msg="Namespace sonobuoy Matched=true" time="2017-11-19T15:21:18Z" level=info msg="Starting server Expected Results: [{ e2e}]" time="2017-11-19T15:21:18Z" level=info msg="Running (e2e) plugin" time="2017-11-19T15:21:18Z" level=info msg="Listening for incoming results on 0.0.0.0:8080\n" time="2017-11-19T16:13:35Z" level=info msg="got e2e result\n" time="2017-11-19T16:13:35Z" level=info msg="Creating directory /tmp/sonobuoy/de1791ab-33f2-4aa2-9767-e6fd32215bf0/plugins/e2e" time="2017-11-19T16:13:35Z" level=info msg="extracted results tarball into /tmp/sonobuoy/de1791ab-33f2-4aa2-9767-e6fd32215bf0/plugins/e2e/results" time="2017-11-19T16:13:35Z" level=info msg="Running non-ns query" time="2017-11-19T16:13:35Z" level=info msg="Running ns query (default)" time="2017-11-19T16:13:35Z" level=info msg="Running ns query (kube-public)" time="2017-11-19T16:13:35Z" level=info msg="Running ns query (kube-system)" time="2017-11-19T16:13:35Z" level=info msg="Running ns query (sonobuoy)" time="2017-11-19T16:13:35Z" level=info msg="Results available at /tmp/sonobuoy/201711191521_sonobuoy_de1791ab-33f2-4aa2-9767-e6fd32215bf0.tar.gz" time="2017-11-19T16:13:35Z" level=info msg="no-exit was specified, sonobuoy is now blocking" |
もう一つの方法としてはテストが終了すると結果をアーカイブして保存することを利用してチェックを行なうと良いかと思います。
上の例だと、/tmp/sonobuoy/201711191521_sonobuoy_de1791ab-33f2-4aa2-9767-e6fd32215bf0.tar.gz がアーカイブされたファイルになります。
AKE でもバージョンアップや変更などがあった場合にオリジナルのシナリオテストの他に Sonobuoy による E2E テストを行っているため、自動化するために下記のようなことを行っています。
1 2 3 |
until ${KUBECTL} -n sonobuoy exec -it sonobuoy -- sh -c "ls /tmp/sonobuoy/*.tar.gz"; do sleep 60 done |
アーカイブの中に結果のログなどが保存されているため、解凍後に確認します。
1 2 3 4 5 |
$ kubectl -n sonobuoy exec -it sonobuoy -- sh -c "tar -xvf /tmp/sonobuoy/*.tar.gz" $ kubectl -n sonobuoy exec -it sonobuoy -- sh -c "cat plugins/e2e/results/e2e.log" ...(省略)... Ran 125 of 697 Specs in 3119.168 seconds SUCCESS! -- 125 Passed | 0 Failed | 0 Pending | 572 Skipped PASS |
テスト結果が SUCCESS になっていれば問題ありませんが、FAIL している場合にはログを確認する必要があります。
少しログのメッセージが直結的ではない場合があるため、エラーが出たテストコードを直接 https://github.com/kubernetes/kubernetes/tree/master/test/e2e から確認したほうが楽だと思います。
テストコード自体は kubectl と同じく、In-cluster config を使った kubernetes/go-client を利用して行っていることがほとんどです。
認定依頼と Github への PR
晴れて E2E テストが完了したら、PR と CNCF への申請を行い Certified Kubernetes として認定してもらいます。
なお AKE は商用利用(プライベートクラウド)かつ CNCF のメンバーではないため、現状は認定依頼自体はしていません。
PR を行なう際には、https://github.com/cncf/k8s-conformance に対して各バージョン毎にディレクトリを切って申請する形になります。
例えば GKE の場合には v1.7/gke/ を作成し、conformance テストの結果や PRODUCT.yaml を配置して PR を出します。
PRODUCT.yaml には ベンダー名やバージョンといった情報を記載して提出します。
1 2 3 4 5 6 |
vendor: Yoyodyne name: Turbo Encabulator version: v1.7.4 website_url: https://yoyo.dyne/turbo-encabulator documentation_url: https://yoyo.dyne/turbo-encabulator/docs product_logo_url: https://yoyo.dyne/assets/turbo-encabulator.svg |
PR 提出後は、ここ にあるフォームに記載した上で CNCF にメールを提出し、やりとりすることで認定してもらうことになるようです。
Certified Kubernetes Distribution & Platform の例
現状認定されている Certified Kubernetes の一覧は ここ から確認することが可能です。
GKE は勿論のこと Pivotal の PKS や Azure の AKS、他にも Rancher、kubeadm、Tectonic なども登録されています。
ちなみに、この Certified Kubernetes の認定を受けることで初めて、プロダクト名に “Kubernetes” を含むことが許されるようになります。 Google の GKE も Certified Kubernetes 認定されたタイミングで Google Container Engine から Google Kubernetes Engine に改名したのもそのためです。
AKE も OSS として公開すれば Certified Kubernetes として認定してもらいやすいかなとざっくり考えてもいます。
Author