PONCOTSU

インフラ領域を主にあれしてます

kubevalでmanifestのフォーマットをチェック

YAMLベースのドキュメントのコードレビューって、フォーマットのズレや期待していない値かどうかの確認で不備を見逃してしまい、あとあとリリース時の kubectl apply -f manifest.yaml などでうまく実行できずに焦ることが経験上、多いです。

今回はコードレビューをする前に機械的にmanifestをバリデーションしてくれるツールである kubeval について、Macへの導入を試します。

kubevalをインストール

kubeval とはkubectlを使わずにmanifestファイルをバリデーション(規格にあった構成かどうかをチェック)するツールです。Linuxをはじめ、MacWindows用にもパッケージが配布されており、ローカル開発環境などで利用されることが多いツールです。

公式ドキュメント(英語)

今回は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の品質を一定まで維持できるので、使っていきたいやつです。