🐳

kube-scoreでKubernetes ManifestにLintをかける

2022/03/21に公開

はじめに

KubernetesのManifestのLinterをいくつか触ってみたのでそのうちの一つ kube-score を紹介したいと思います。

ググると最も頻繁に出ていそうな KubeLinter より開発が活発(リリース頻度が高い)なようなのと、触ってみて色々使いやすいと感じたので選定してみました。

使い方

下記なんの変哲もないManifestをベースにしますが、オンラインデモもあるのでシュッと試してみたい方はこちらを使うとよいでしょう。
https://kube-score.com/

Manifestは日付と環境変数の一覧を表示してその後何もしないという挙動です。

manifest.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-deployment
  labels:
    app: sample
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sample
  template:
    metadata:
      labels:
        app: sample
    spec:
      containers:
      - name: sample
        image: busybox
        command:
        - /bin/sh
        - -c
        - date; env; tail -f /dev/null

インストール

macOSはbrew一発で楽チン。

brew install kube-score

その他の環境

チェック実行

実際に実行してみると以下のような警告が出ます。
どれも基本的には無視せずちゃんと設定した方がよさそうなものばかりです。

  • PodのNetworkPolicyが未設定
  • 実行時のUserGroupIDが未指定
  • ファイルシステムのRootが書き込み可になっている
  • コンテナイメージのタグが未指定(latest)になっている
  • コンテナイメージのpullポリシーがAlwaysになっていない
  • コンテナリソース(Request or Limit)が未指定
    • CPU
    • メモリ
    • エフェメラルストレージ
$ kube-score score manifest.yaml 
apps/v1/Deployment sample-deployment                                         💥
    [CRITICAL] Container Resources
        · sample -> CPU limit is not set
            Resource limits are recommended to avoid resource DDOS. Set resources.limits.cpu
        · sample -> Memory limit is not set
            Resource limits are recommended to avoid resource DDOS. Set resources.limits.memory
        · sample -> CPU request is not set
            Resource requests are recommended to make sure that the application can start and run without crashing. Set resources.requests.cpu
        · sample -> Memory request is not set
            Resource requests are recommended to make sure that the application can start and run without crashing. Set resources.requests.memory
    [CRITICAL] Container Ephemeral Storage Request and Limit
        · sample -> Ephemeral Storage limit is not set
            Resource limits are recommended to avoid resource DDOS. Set resources.limits.ephemeral-storage
    [CRITICAL] Pod NetworkPolicy
        · The pod does not have a matching NetworkPolicy
            Create a NetworkPolicy that targets this pod to control who/what can communicate with this pod. Note, this feature needs to be supported by the CNI implementation used in the Kubernetes cluster to have an
            effect.
    [CRITICAL] Container Image Tag
        · sample -> Image with latest tag
            Using a fixed tag is recommended to avoid accidental upgrades
    [CRITICAL] Container Security Context User Group ID
        · sample -> Container has no configured security context
            Set securityContext to run the container in a more secure context.
    [CRITICAL] Container Security Context ReadOnlyRootFilesystem
        · sample -> Container has no configured security context
            Set securityContext to run the container in a more secure context.

Manifestの動的生成ツール

標準入力からもチェックできるのでhelm, kustomizeのチェックもできます。

helm template my-app | kube-score score -
kustomize build . | kube-score score -

一部のチェックを無視したい

実行時に --ignore-test xxx,yyy という形で指定します。
例えば上記エラーを全て無視する場合は以下のようになります。
ちなみに項目の一覧は https://github.com/zegl/kube-score/blob/master/README_CHECKS.md にあるので目的のものを探しましょう。

$ kube-score score manifest.yaml --ignore-test pod-networkpolicy,container-resources,container-image-pull-policy,container-security-context-privileged,container-security-context-user-group-id,container-security-context-readonlyrootfilesystem,container-ephemeral-storage-request-and-limit,container-image-tag
apps/v1/Deployment sample-deployment                                         ✅

Manifestで無視する項目を設定する

CI環境ではCLI上で無視項目を設定しようとすると面倒な実装をしなければなりませんが、Manifestのannotationsにも書けて便利です(使用するIDはCLIと同じ)。

metadata:
  name: sample-deployment
  labels:
    app: sample
+ annotations:
+   kube-score/ignore: pod-networkpolicy,container-resources,container-image-pull-policy,container-security-context-privileged,container-security-context-user-group-id,container-security-context-readonlyrootfilesystem,container-ephemeral-storage-request-and-limit,container-image-tag

Optionalチェック

https://github.com/zegl/kube-score/blob/master/README_CHECKS.mdEnabledOptionalの項目はデフォルトではチェックが実行されません。チェックしたい場合は以下のように設定します。

$ kube-score score manifest.yaml --enable-optional-test container-seccomp-profile
apps/v1/Deployment sample-deployment                                         🤔
    [WARNING] Container Seccomp Profile
        · The pod has not configured Seccomp for its containers
            Running containers with Seccomp is recommended to reduce the kernel attack surface

なおOptionalはManifestのannotationsに定義できないようです。
(コントリビュートチャンス?)

終わりに

Kubernetes ManifestのLinterであるkube-scoreを紹介しましたが、簡単に使えてCI環境や動的生成にも対応できる良いツールなのではという印象です。

Discussion