kube-scoreでKubernetes ManifestにLintをかける
はじめに
KubernetesのManifestのLinterをいくつか触ってみたのでそのうちの一つ kube-score を紹介したいと思います。
ググると最も頻繁に出ていそうな KubeLinter より開発が活発(リリース頻度が高い)なようなのと、触ってみて色々使いやすいと感じたので選定してみました。
使い方
下記なんの変哲もないManifestをベースにしますが、オンラインデモもあるのでシュッと試してみたい方はこちらを使うとよいでしょう。
Manifestは日付と環境変数の一覧を表示してその後何もしないという挙動です。
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.md のEnabled
がOptional
の項目はデフォルトではチェックが実行されません。チェックしたい場合は以下のように設定します。
$ 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