本記事で紹介している --server-dry-run オプションですが、v1.18 以降では --dry-run=server への置き換えが必要です。
https://kubernetes.io/blog/2019/01/14/apiserver-dry-run-and-kubectl-diff/
kubectl apply 実行時に --dry-run オプションを付けると、マニフェストファイルが適切かどうかをオブジェクトを作ることなく確認できます。
$ kubectl apply -f xxx.yaml --dry-run
しかし、このオプションはマニフェストファイルの文法チェックなど Local でのチェックしかしてくれず、kube-apiserver を通した挙動は確認できません。
そこで、代わりに --server-dry-run オプションや kubectl diff コマンドの使用をおススメします。
$ kubectl apply -f xxx.yaml --server-dry-run
$ kubectl diff -f xxx.yaml
※ 本機能は Kubernetes 1.13 以降でベータ版となっているものです。
実際に違いを検証してみた
例えば、以下のように image を故意にコメントアウトした deployment マニフェストファイルを用意します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
# image: nginx:1.17.9
ports:
- containerPort: 443
この状態で --dry-run と --server-dry-run / kubectl diff の挙動を比較してみると、
$ kubectl apply -f dryrun-nginx.yaml --dry-run
deployment.apps/nginx created (dry run)
$ kubectl apply -f dryrun-nginx.yaml --server-dry-run
The Deployment "nginx" is invalid: spec.template.spec.containers[0].image: Required value
$ kubectl diff -f dryrun-nginx.yaml
The Deployment "nginx" is invalid: spec.template.spec.containers[0].image: Required value
このように、--dry-run オプションでは異常は検知できず、--server-dry-run / kubectl diff では正しく検知できます。
kubectl diff コマンドでは、マニフェスト適用時に前回との差分出力までしてくれるので、場合によってはこちらの方が使い勝手がよいかもしれません。