はじめに
SRE/バックエンドエンジニアの千田です (@thousan_da) 。
Kubernetesマニフェストを書き換える際、事前に自動的にマニフェストの妥当性が検証されていると、安心して変更を適用することができます。
マニフェストバリデーションツールとしては、Kubeconform が有名です。以前は Kubeval といったツールも使われていました。また、セキュリティや運用上のプラクティスに関する改善を提案してくれるツールとして、KubeLinter や kube-score などもあります。
これらのツールを使うのはもちろん効果的ですが、本記事では、kindというツールを使い、CIプロセスの中でKubernetesクラスターを実際に立ち上げる方法を紹介します。以下のリポジトリにサンプルコードが置いてあります。
kindとは
kindはKubernetes in Docker (Kubernetes IN Docker) の略で、軽量なクラスターを立ち上げることができるツールです。nodeをコンテナで起動してクラスターを構成します。
マニフェスト検証
全体像
サンプルコードでは、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: 後述
詳細
ここからは、先ほど「後述」と書いた各ステップの中身を紹介します。
まずは必要なツールをインストールします。実行ファイルをダウンロードして実行権限を与えているだけです。
- 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のバージョンが指定されています。
- 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.
おもしろいツールなので、ぜひ遊んでみてください。