kindを使ってCIでKubernetesマニフェストの妥当性を検証する

はじめに

SRE/バックエンドエンジニアの千田です (@thousan_da) 。

Kubernetesマニフェストを書き換える際、事前に自動的にマニフェストの妥当性が検証されていると、安心して変更を適用することができます。

マニフェストバリデーションツールとしては、Kubeconform が有名です。以前は Kubeval といったツールも使われていました。また、セキュリティや運用上のプラクティスに関する改善を提案してくれるツールとして、KubeLinterkube-score などもあります。

これらのツールを使うのはもちろん効果的ですが、本記事では、kindというツールを使い、CIプロセスの中でKubernetesクラスターを実際に立ち上げる方法を紹介します。以下のリポジトリにサンプルコードが置いてあります。

github.com

kindとは

kindはKubernetes in Docker (Kubernetes IN Docker) の略で、軽量なクラスターを立ち上げることができるツールです。nodeをコンテナで起動してクラスターを構成します。

https://kind.sigs.k8s.io

マニフェスト検証

全体像

サンプルコードでは、GitHub Actionsを使用しました。他のCIツールでも同じようなことができると思います。

kind-ci/.github/workflows/validate-manifest.yml

ジョブは以下のように定義されています。

jobs:
  dry-run-on-kind:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: install kind
        run: 後述
      - name: install kubectl
        run: 後述
      - name: create kind cluster
        run: 後述
      - name: dry run
        run: 後述
  1. kindをインストールする
  2. kubectlをインストールする
  3. kindでクラスターを作成する
  4. dry runでマニフェストを検証する

詳細

ここからは、先ほど「後述」と書いた各ステップの中身を紹介します。

まずは必要なツールをインストールします。実行ファイルをダウンロードして実行権限を与えているだけです。

      - name: install kind
        run: |
          curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.27.0/kind-linux-amd64
          chmod +x ./kind
          ./kind version
      - name: install kubectl
        run: |
          curl -LO https://dl.k8s.io/release/v1.33.0/bin/linux/amd64/kubectl
          chmod +x ./kubectl
          ./kubectl version --client

次に、kindでクラスターを作成します。たった1コマンド & 30秒ほどでクラスターが立ち上がります。はやい。参照しているconfigファイルでは、Kubernetesのバージョンが指定されています。

kind-ci/ci/kind-config.yaml

      - name: create kind cluster
        run: |
          ./kind create cluster --config=./ci/kind-config.yaml
          ./kubectl version

最後にこのクラスターを使ってマニフェストを検証します。今回は、server-side dry-runを実施してみました。kubectl apply --dry-run=server コマンドを使うことで、実際にkindクラスターのAPIサーバーでマニフェストを検証することができます。./manifest/pure にはそのままapply可能なマニフェストが置かれており、./manifest/kustomized にはkustomizeの使用を前提としたマニフェストが置かれています。kubectlコマンドの一般的な使用方法そのままなので、当然どちらにも対応しています。

      - name: dry run for pure manifests
        run: ./kubectl apply -f ./manifest/pure --dry-run=server
      - name: dry run for kustomized manifests
        run: ./kubectl apply -k ./manifest/kustomized --dry-run=server

おわりに

CIの中でkindを使うことで、軽量バージョンではあるものの実際に動くKubernetesクラスターでマニフェストを検証することができました。

今回はdry-runしただけですが、簡単なテストダブルで副作用がハンドリングできるアプリケーションであれば、実際に動かしてしまうことすら可能です。つまり、kindクラスター上で動かしたアプリケーションのE2Eテストといった使い方も考えられます。

また、kindはローカル環境でKubernetes自体の検証を試したいときにも便利です。というか、もともとはこちらの目的のために開発されたようです。

kind was primarily designed for testing Kubernetes itself, but may be used for local development or CI.

おもしろいツールなので、ぜひ遊んでみてください。