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パイプラインの信頼度を上げるためにも今後そちらも触ってみたい所です。

参考文献