kubeval でマニフェストを確認できるので質問する前に一度、確認お願いします。

最初に

kubeval というツールを使って、Kubernetesマニフェストをチェックできます。 kubeval は、Kubernetes manifest のファイルを検証するために使用され、単純な記述ミスを検知することができます。yaml の記述ミスは目視だと普通に見逃すことが多いと思います。なので、開発ワークフローの一部やCI、ローカルで使用することで様々なやり取りを減らして開発を円滑に進めることができます。この記事ではkubeval の基本的な使い方を説明することになりますがこれを読み終えた後に皆様がkubeval をインストールしてくれるのを切に願っております。

使い方としては標準入力として与えるかファイルを引数で与える形になります。

kubeval <file> [file...] [flags]

一般的なNginx のDeploymentであるnginx-deployment.yamlを用意します。

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

kubeval インストール

Installing Kubeval よりインストールを行うことが出来ます(関係ないですがGoReleaser 滅茶苦茶便利ですよね~)。

kubeval 実行

kubeval はファイルをコマンドへ直接渡すか、標準入力として与えてあげることで実行できます。標準入力で渡してあげればよいということはkustomizehelm でファイルを生成する場合でも簡単にCIなどに載せたりチェックすることができるということです。嬉しいですよね!?!?!??

$ cat nginx-deployment.yaml | kubeval
PASS - stdin contains a valid Deployment (nginx-deployment)
$ kubeval nginx-deployment.yaml 
PASS - nginx-deployment.yaml contains a valid Deployment (nginx-deployment)

例えば、replicas: 2 の前に無駄な空白がある下記のような場合があります。

spec:
  selector:
    matchLabels:
      app: nginx
   replicas: 2 # tells deployment to run 2 pods matching the template
  template:

実行してみると構文エラーが検出できていると思います。

kubeval err-nginx-deployment.yaml
ERR  - Failed to decode YAML from err-nginx-deployment.yaml: error converting YAML to JSON: yaml: line 8: did not find expected key

次のパターンでは 数字型を与えているはずの部分に下記のように数字を与えてしまっています。

    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: "80"

実行してみるとワーニングが発生しており型errorを検出できていると思います。

kubeval miss-nginx-deployment.yaml
WARN - miss-nginx-deployment.yaml contains an invalid Deployment (miss-nginx-deployment) - spec.template.spec.containers.0.ports.0.containerPort: Invalid type. Expected: integer, given: string

ちなみにkubevalはKubernetesAPIから生成されたスキーマに依存しております。そのため、CRDのリソースは検証できません。--ignore-missing-schemas--skip-kinds で検証を飛ばすことが推奨されております。

vim で使う

vim でプログラムを実行する場合にはノーマルモード!をつけることで外部プログラムを実行できる 例としては:!lslsを実行できます。ちなみに、現在編集中ファイルの省略記号である%を使うことで、編集中へのプログラム実行も簡単にできるので下記のコマンドで簡単に編集中の環境もチェックすることができます。

:!kubeval %

最後に

kubeval でマニフェストを確認できるので質問する前に一度、確認お願いします。お互いの為に。