GitHub Actions & kind (Kubernetes IN Docker) で Matrix build の CI を構築

CI で Kubernetes を使いたい場合、自前の Kubernetes 環境か GKE や EKS を利用して常時クラスターを使えるようにしておく方法があります。

しかし、ワーカーのノード数を色々変えてテストしたい、Kubernetes のバージョンを色々変えてテストしたい、常設のクラスターを準備するのがコスト的に厳しい・・などの場合、Docker 環境さえあれば揮発的に素早くクラスターを構築して終了後に破棄できる kind (Kubernetes in Docker) が有効です。

blog.kondoumh.com

GitHub Actions の Marketplace でも kind を使う Actions が公開されていました。

github.com

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 バージョン毎の結果が表示されます。

f:id:kondoumh:20200114231329p:plain

kind と Matrix build は相性がいいですね。