本記事で紹介している --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
コマンドでは、マニフェスト適用時に前回との差分出力までしてくれるので、場合によってはこちらの方が使い勝手がよいかもしれません。