kubevalでmanifestのフォーマットをチェック
YAMLベースのドキュメントのコードレビューって、フォーマットのズレや期待していない値かどうかの確認で不備を見逃してしまい、あとあとリリース時の kubectl apply -f manifest.yaml
などでうまく実行できずに焦ることが経験上、多いです。
今回はコードレビューをする前に機械的にmanifestをバリデーションしてくれるツールである kubeval
について、Macへの導入を試します。
kubevalをインストール
kubeval
とはkubectlを使わずにmanifestファイルをバリデーション(規格にあった構成かどうかをチェック)するツールです。Linuxをはじめ、MacやWindows用にもパッケージが配布されており、ローカル開発環境などで利用されることが多いツールです。
今回はMacOSにインストールしていきます。
wget https://github.com/instrumenta/kubeval/releases/latest/download/kubeval-darwin-amd64.tar.gz tar xf kubeval-darwin-amd64.tar.gz sudo cp kubeval /usr/local/bin
インストールが済んだら
kubeval --version Version: 0.15.0 Commit: df50ea7fd4fd202458002a40a6a39ffbb3125bad Date: 2020-04-14T09:32:50Z
と、バージョンを確認し、うまく起動できたことを確認。
kubevalを使ってみる
試しにサンプルコード(serviceとdeployment)のバリデーションをしてみましょう。 検査対象はこちら。
# manifest.yaml apiVersion: apps/v1 kind: Deployment metadata: name: adservice spec: selector: matchLabels: app: adservice template: metadata: labels: app: adservice spec: serviceAccountName: default terminationGracePeriodSeconds: 5 containers: - name: server image: adservice ports: - containerPort: 9555 env: - name: PORT value: "9555" # - name: DISABLE_STATS # value: "1" # - name: DISABLE_TRACING # value: "1" #- name: JAEGER_SERVICE_ADDR # value: "jaeger-collector:14268" resources: requests: cpu: 200m memory: 180Mi limits: cpu: 300m memory: 300Mi readinessProbe: initialDelaySeconds: 20 periodSeconds: 15 exec: command: ["/bin/grpc_health_probe", "-addr=:9555"] livenessProbe: initialDelaySeconds: 20 periodSeconds: 15 exec: command: ["/bin/grpc_health_probe", "-addr=:9555"] --- apiVersion: v1 kind: Service metadata: name: adservice spec: type: ClusterIP selector: app: adservice ports: - name: grpc port: 9555 targetPort: 9555
kubeval manifest.yaml PASS - adservice.yaml contains a valid Deployment (adservice) PASS - adservice.yaml contains a valid Service (adservice)
どちらのkubernetesリソースも PASS
となっています。これは問題なしという意味の PASS
です。問題がある場合は WARN
ERR
が表示されます。
試しに以下の間違いを混入させて実行してみます。
# manifest.yaml ... apiVersion: v1 kind: Service ## インデントズレ metadata: name: adservice spec: type: ClusterIP selector: app: adservice ports: - name: grpc port: 9555 targetPort: 9555
実行してみます。
kubeval manifest.yaml ERR - Failed to decode YAML from adservice.yaml: error converting YAML to JSON: yaml: line 2: mapping values are not allowed in this context
2行目が何かおかしいぞ、とエラーを出してくれています。
kubeval
でコードをリポジトリにあげるまえにローカルで確認しておくとmanifestの品質を一定まで維持できるので、使っていきたいやつです。