テストkubectlのプラグインを開発していると、ユニットテストだけでなく、本物のKubernetesクラスタを利用したテストが欲しくなります。プラグインの振る舞いが複雑な場合は自動テストがあると安心してリリースできます。本稿では、本物のKubernetesクラスタを利用してkubectlプラグインをテストする方法を考えます。本物のクラスタを利用してプラグインをテストするための構成を下図に示します。必要なのは以下の3つです。テスト対象のプラグインテスト対象が依存するクラスタやリソーステストシナリオテストの流れは以下のようになります。必要なリソースをデプロイする。kubectlを実行する。pluginが実行される。実行結果が期待通りか検証する。このようなテストはプラグインのリリース前に手動でやっていることが多いと思います。Requestの契機で不具合を検出できるクリーンな環境でテストできるので信頼性が高い手動では手間のかかる組合せテストが可能になる(複数のクラスタバージョンなど)といったメリットがあります。kubectl-treeのテストを書いてみるここでは、kubectl-treeというプラグインをテストする例を考えます。これはクラスタにあるリソースを木構造で表示してくれる便利なプラグインです。簡単のため、テストシナリオはMakefileで書くことにします。Makefileをよく知らない方はシェルスクリプトだと思って読んでみてください。クラスタの作成とリソースのデプロイまずは新しいクラスタを作成するターゲットを定義します。Kindを利用すると、Docker上に簡単にクラスタを作成できます。$(KUBECONFIG)これでmakeを実行すると新しいクラスタが作成される仕組みができました。実行にはDockerとKindが必要です。/kubectl-tree-e2e-test/output/kubeconfig.yamlテストを行うにはクラスタだけでなく適当なリソースも必要です。ここではechoserverをデプロイすることにします。applyコマンドを追記します。deployment/echoserverこれで、テストに必要なクラスタとリソースが揃いました。treeコマンドを実行すると以下のような結果が表示されます。46sここでは簡単のため、grepで必要な文字列が表示されているかチェックします。複雑な条件判定が必要な場合はスクリプトを書く方がよいでしょう。$(OUTPUT_DIR)/actualmakeを実行してみましょう。以下のようにテストに合格するはずです。4m55sこれでローカルでのテストは完了です。CIで実行する品質を継続的に向上させるにはCIが不可欠です。Actionsでテストを実行します。18.04にはすでにKindがインストールされていますが、バージョンが古いので改めて最新版をインストールすることにします。CIの最初のステップでは以下のツールをインストールします。Kindkrewkubectl-treeそれからmakeを実行します。最終的に、workflowは以下のようになります。makeここまでの内容は下記のリポジトリにまとめてあります。CIの実行時間や実行結果が気になる方はぜひご覧ください。OPを利用したテストを下図の構成で行っています。pluginのテストを実現できます。ライフハックお店やネットで買い物する時のビジネスルールが複雑になってきたので書き出してみました。以下の順に評価して条件を満たす決済手段で支払います。(0.5%)現金ただし、以下の例外条件があります。コード決済のキャンペーン期間中は還元率の高い決済手段を優先的に選択します。2/4時点では一部店舗でPayPay(40%)があります。楽天カード)で支払います。楽天カード)で支払います。EPOSカードの年間支払いが100万円を超えた場合は楽天カードで支払います。支払い前に以下を考慮します。決済とは別にdポイントを付与できる場合があります。Storeなどの場合はRebatesを経由してから発注します。ポイントサイトのキャンペーンがある場合があります。(最近あまり見ていない)上記はFeliCa/NFC決済を考慮していません。FeliCa/NFC決済が使える場合はビジネスルールが変わってくると思います。幅広い決済手段に対応したプロキシがあったとしても、これらのビジネスルールを実装してテストするのは大変そうです。コマンドでKubernetesクラスタが起動しない場合、以下のようなメッセージが表示されます。1クラスタが起動しない原因を調査するには以下の方法があります。オプションを渡すと詳細なログが表示されるようになります。渡すと以下のようなログが表示されます。Planeの各設定ファイルのパスなどが分かります。kindコンテナの内部に入って調査する時の材料になります。kindノードコンテナの内部にあるログkindではノードコンテナの内部でKubernetesクラスタが動いています。psコマンドで確認できます。kind-control-planekindノードコンテナの内部ではsystemdが動いています。logsコマンドで確認できます。Planeの各コンポーネントが実行される流れになっています。各コンポーネントのログを確認するには、以下のようにノードコンテナの内部に入る必要があります。/bin/bashkindノードコンテナの内部では以下のプロセスが動いています。apiserver(コンテナとして動作)kube-controller-manager(コンテナとして動作)kube-scheduler(コンテナとして動作)etcd(コンテナとして動作)kubelet(プロセスとして動作)これらが立ち上がると以下のコンテナも動き始めます。