GitHub Actionsを使って Kubernetes の Manifests を Validation する
Kubernetes の Manifests は yaml(もしくはjson) で記述されているのですが、正しい schema で記述されているのか判断したいと思ったことはありませんでしょうか。
例えば値のところに数字を書く時に "
で括って strings
として書くのか、そのまま int
で書くのか迷ったり、いつのまにか indent がずれていた、なんて経験あるのではないでしょうか。
例えばこんな yaml があったとしましょう。
この manifest 内には Kubernetes の schema に合っていない記述が 2 つあります。1 つ目は replicas:
の値が strings
になっている部分です。この場合は "1"
ではなく 1
と書くべきですよね。2 つ目は port:
の部分です。これは ports:
が正解になります。
例えば gitops とかで運用されているシステムでは、何らかの理由でこのような不正な manifests が紛れ込んでしまうのは極力避けたいところです。
Manifests の validation
Manifests の validation と聞くと真っ先に考えるのは kubectl
の --validate
オプションです(デフォルトで true
) 。 --dry-run
もしくは --server-dry-run
と組み合わせることで validation することが可能です。
もちろんこの方法でも問題無いとは思いますが、 kubectl
方式だと Kubernets の cluster を用意しないといけません。もちろん RBAC を使っている場合は適切な認証情報も必要ですし、場合によっては Kubernetes の version 毎に kubectl
を用意しないと正しくチェックできないかもしれません。その為 CI に組み込む際にも一手間かけないといけなくなります。
Kubeval を使った validation
そこで登場するのが Kubeval
です。 Kubeval
は Kubernetes の Cluster を用意していなくても実行できる Manifests の validation ツールです。複数の Kubernetes の version の schema に対応しているのでとても使いやすいツールです。
さっそく先程の yaml を引数に与えて実行してみましょう。
このように validation してくれます。問題がある場合は exit code 1 で終了してくれます。
問題のない Manifests の場合はこの様になります。
Kubeval
は schema に準拠してない余計な要素がある場合もチェックすることが出来ます。例えば以下のようなケースでは location: japan
という余計な要素が書かれています。
デフォルトの挙動では無視されるのですが、厳密にチェックをしたい場合は --strict
を付けることでチェックしてくれます。
便利なツールですよね。 Kubeval
が使っている schema はこちらの repository で管理されています。また、 https://kubernetesjsonschema.devでも参照することができます。その他 Kubeval
についての詳細は是非 https://kubeval.instrumenta.dev/ を参照してみて下さい。
Github Actions で CI する
前置きが長くなってしまいましたが、 Kubeval
による validation を Pull Request 時にできるような GitHub Actions を作りました。
GitHub Actions は誰でも簡単に作ることが出来て、Marketplace に公開することが出来ます。この Action も公開してみました。
使い方は README にも書いた通り、 github の repository の .github/workflows/
内に例えば下記のような yaml を配置します。
もし validation に失敗した場合は Pull Request に対して Kubeval
の結果がコメントされます。GitHup の API を叩いてコメントを送り込んでいますが、この際に使う認証情報を token
のパラメーターとして渡してください。 ${{ secrets.GITHUB_TOKEN }}
とすると README の例の通り github-actions
という bot でコメントされます。他で使用している bot とかの権限で書き込みたい場合は Personal Access Token 発行して secrets に登録し、 token
の部分に指定して下さい。例えば token: ${{ secrets.GITHUB_BOT_PAT }}
のようになると思います。(GITHUB_TOKEN
という secrets は予約されているので secrets として登録することができません。別の名前で指定してあげて下さい!)
files
のパラメーターは validation する対象を指定します。 files
になっていますが、ディレクトリも指定可能です。ディレクトリは再帰的に読み込まれます。カンマ区切りの strings として指定して下さい。
その他のパラメーターは README を御覧下さい。
初めて Actions 作ってみたのでこれでいいのかよく分からない部分もあるのですが、皆様のフィードバックを頂けると幸いです!
GitHub の Action の作り方はまた別の機会にでも書こうと思います。
それではよい CI ライフを!