GitHub Actionsを使って Kubernetes の Manifests を Validation する

kubeval 編

makocchi
6 min readJan 22, 2020

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 を引数に与えて実行してみましょう。

kubeval with invalid-deployment.yaml

このように validation してくれます。問題がある場合は exit code 1 で終了してくれます。

問題のない Manifests の場合はこの様になります。

kubeval with valid-depoyment.yaml

Kubeval は schema に準拠してない余計な要素がある場合もチェックすることが出来ます。例えば以下のようなケースでは location: japan という余計な要素が書かれています。

invalid property

デフォルトの挙動では無視されるのですが、厳密にチェックをしたい場合は --strict を付けることでチェックしてくれます。

kubeval with additional property check

便利なツールですよね。 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 ライフを!

P.S

実は本家が作成した Kubeval の Action があるんですが、結果をコメントしたりといった機能を持っていなかったので、せっかくなので練習がてら新しく作ってみました。

--

--

makocchi

Makoto Hasegawa | kubernetes | CKA(#CKA-1700–0150–0100) | CKAD(CKAD-1800–0005–0100) | docker | container | OpenStack