CI で Kubernetes を使いたい場合、自前の Kubernetes 環境か GKE や EKS を利用して常時クラスターを使えるようにしておく方法があります。
しかし、ワーカーのノード数を色々変えてテストしたい、Kubernetes のバージョンを色々変えてテストしたい、常設のクラスターを準備するのがコスト的に厳しい・・などの場合、Docker 環境さえあれば揮発的に素早くクラスターを構築して終了後に破棄できる kind (Kubernetes in Docker) が有効です。
GitHub Actions の Marketplace でも kind を使う Actions が公開されていました。
workflow の steps で以下のように指定するだけで kind でクラスターを構築できます。
steps: : - uses: engineerd/setup-kind@v0.2.0 :
kind の Config ファイルも width:
に指定できます。
- uses: engineerd/setup-kind@v0.2.0 with: config: "k8s/kind.yml"
Kubernetes のバージョンを指定したいときは、kindest/node イメージのバージョンを指定すれば OK です。
- uses: engineerd/setup-kind@v0.2.0 with: image: kindest/node:v1.14.9
kind を手動起動する場合 Config ファイル内で kubeadmConfigPatches
を使って kubeadm のオプションを与えるのですが、この Action では workflow 内で指定可能です。
複数バージョンの Kubernetes を使う Matrix build のサンプルを作ってみました。kindest/node のタグを matrix にしています。
name: "Create cluster using KinD" on: push: paths: - k8s/** - .github/workflows/it_k8s.yml jobs: kind: strategy: matrix: k8s: [1.14.9, 1.15.7] runs-on: ubuntu-latest steps: - uses: actions/checkout@master - uses: engineerd/setup-kind@v0.2.0 with: config: "k8s/kind.yml" image: kindest/node:v${{ matrix.k8s }} - name: Testing run: | kubectl version kubectl cluster-info kubectl get node -o wide kubectl get pods -n kube-system kubectl apply -f k8s/nginx_deploy.yml kubectl describe deployment nginx-deployment
テストでは kubectl で nginx のマニフェストを apply して deployment を describe する処理を書いています (本来はデプロイしたアプリケーションのエンドポイントに対して E2E のテストを実行します)。
クラスターはデフォルトでシングルノード構成で起動されるので、複数ワーカー構成にしたい場合 Config ファイルで指定します。今回は、master (1) / worker (2) で構築しました。
# three node (two workers) cluster config kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - role: worker - role: worker
実行すると Kubernetes バージョン毎の結果が表示されます。
kind と Matrix build は相性がいいですね。