kubevalを使ってお手軽にKubernetes manifestをValidateする
Kubernetesのmanifestファイルを検査するためにツールを探していた所以下の記事を見つけました。
紹介されていた中から今回はkubevalを使ってみます。
kubevalとは?
- Go製のKubernetes manifestのValidateツール
- Kubernetesのクラスタが無くてもmanifestファイルのチェックができる
- 複数のKubernetesクラスタのversionにも対応
- 対象はjsonかyamlのmanifestファイルである必要がある
dry-runではダメなのか?
kubectlには kubectl apply --validate=true --dry-run=true -f manifest.yaml
のようにオプションでmanifestファイルの検証を行う事ができますが、kubectlを使った検証方法では実際に対象のmanifestファイルを実行するためのRBACの権限や対象のKubernetesクラスタが必要になります。
そのためCIなどでmanifestの検査を行う際に適切に権限を割り当てて実行する必要があるという障壁があります。
kubevalを使う場合はkubectlの権限を必要とせず、manifestを検査する事ができます。
インストール方法
とりあえずMac版だけ、他のOSに関してはREADME.mdを参照。
brew tap garethr/kubeval
brew install kubeval
kubevalを使ってみた
正しいmanifest
使い方はとてもシンプルで標準入力でmanifestファイルを食わせるだけです。
試しにKubernetesのゲストブックを検査してみます。
$ cat redis-master-controller.json | kubeval
The document stdin contains a valid ReplicationController
json、yamlフォーマットのmanifestファイルが対象のため、以前紹介したkustomizeとの相性も良し!
間違いのあるmanifest
間違った値のmanifestファイルを与えてみる。
$ cat redis-master-controller.json | yq -y . # 読みづらかったのでyamlに変換
kind: ReplicationController
apiVersion: v1
metadata:
name: redis-master
labels:
app: redis
role: master
spec:
replicas: 1
selector:
app: redis
role: master
template:
metadata:
labels:
app: redis
role: master
spec:
containers:
- name: redis-master
image: redis:2.8.23
ports:
- name: redis-server
containerPort: hoge # Portはintegerである必要があるが適当な文字列に変更
$ cat redis-master-controller.json | yq -y . | kubeval
The document stdin contains an invalid ReplicationController
---> spec.template.spec.containers.0.ports.0.containerPort: Invalid type. Expected: integer, given: string
$ echo $? # 終了ステータスコードもきちんとエラー
1
間違った値のファイルを与えると上記のようにエラーが出ます。
versionを指定したチェック
例えばv1.12.0を指定してみる。
$ cat redis-master-controller.json | yq -y . | kubeval -v 1.12.0
The document stdin contains a valid ReplicationController
対応しているバージョンは以下のリポジトリを参照。
kubevalの問題
- テストツールでは無いので設定値がこちらの期待した値であるかはチェックできない
- 現在(2019/04/02)、ツールがv1.12.x系までしか対応していない
Kubernetesの最新はv1.14.0が数日前にリリース
1.13.x系対応のプルリクはある
一応自前で検査に利用するjsonschemaを用意する方法もあるみたいだが… - 意味のないパラメータのValidateが問題なく通ってしまう
例えば{"hoge": "fuga"}
のような特に意味のないパラメータを追加して検査する。
$ cat redis-master-controller.json | yq -y .
kind: ReplicationController
apiVersion: v1
metadata:
name: redis-master
labels:
app: redis
role: master
spec:
replicas: 1
selector:
app: redis
role: master
template:
metadata:
labels:
app: redis
role: master
spec:
containers:
- name: redis-master
image: redis:2.8.23
ports:
- name: redis-server
containerPort: 6379
hoge: fuga # 追加
$ cat redis-master-controller.json | yq -y . | kubeval # kubeval的にはOK
The document stdin contains a valid ReplicationController
$ echo $? # ステータスコードも問題なし
0
$ kubectl apply -f redis-master-controller.json # 検査は通ったがapplyで失敗
error: error validating "redis-master-controller.json": error validating data: ValidationError(ReplicationController.spec.template.spec.containers[0]): unknown field "hoge" in io.k8s.api.core.v1.Container; if you choose to ignore these errors, turn validation off with --validate=false
意味のないパラメータのValidateが問題なく通ってしまう
テストツールとして機能しないのは仕方がないとして、この問題はちょっと気になる所です…
まとめ
KubernetesクラスタがなくてもmanifestファイルのValidateができるツール、kubevalを簡単に利用、紹介しました。 気になる点はありますが、CIなどで手始めにmanifestファイルの検査を行うには良いツールだと思います。 今回紹介したツールとは別にmanifestのテストを行うツールもいくつかあるようなので、CI/CDパイプラインの信頼度を上げるためにも今後そちらも触ってみたい所です。