最初に
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
はファイルをコマンドへ直接渡すか、標準入力として与えてあげることで実行できます。標準入力で渡してあげればよいということはkustomizeやhelm でファイルを生成する場合でも簡単に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 でプログラムを実行する場合にはノーマルモードで!
をつけることで外部プログラムを実行できる 例としては:!ls
でls
を実行できます。ちなみに、現在編集中ファイルの省略記号である%を使うことで、編集中へのプログラム実行も簡単にできるので下記のコマンドで簡単に編集中の環境もチェックすることができます。
:!kubeval %
最後に
kubeval でマニフェストを確認できるので質問する前に一度、確認お願いします。お互いの為に。