事象
yamlファイルをapplyすると以下エラーでapplyに失敗する。
Error from server (Conflict): error when applying patch: {"metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"... ... for: "hoge.yaml": Operation cannot be fulfilled on deployments.apps "hoge": the object has been modified; pleaseapply your changes to the latest version and try again
環境情報
原因と対応策
kubeletが展開しようとしているyamlのresourceVersionがkube-controller-managerが保持しているresourceVersionと一致していない。
よってyamlファイルの以下の箇所を
resourceVersion: "12345"
以下に修正すると
resourceVersion: null
エラーは解消してapplyが通る。
$ kubectl apply -f hoge.yaml Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply deployment.apps/hoge configured
以下、補足です。
補足
現状動いているDeploymentを修正する際に、動いているオブジェクトを以下のようにyamlで書き出すことができます。
$ kubectl get deploy hoge -o=yaml > hoge.yaml
そのyamlを修正してapplyすると冒頭のエラーになる場合があります。
ここで、一度deleteしてからapplyすると再現しないのでマスター側で過去の情報を持っていることが原因です。
Kubernetesでは変更する設定ファイルに対し「前回」「現在」「未来」の3つの設定から差分を計算して反映する機構があるため、そこでのチェックに失敗するとエラーになるようです。Warningで出ている「--save-config」をつけましょうという警告も作成時に前回と現在に設定を反映させるオプションです。
この前回適用したapplyがmetadata.annotations.kubectl.kubernetes.io/last-applied-configuration
にJSON形式にて保持されている仕様は覚えておきたいです。
$ kubectl get deploy -o=yaml ... metadata: annotations: deployment.kubernetes.io/revision: "1" kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"creationTimestamp":null,"labels":{"app":"nginxdep"},"name":"nginxdep","name space":"default"},"spec":{"replicas":1,"selector":{"matchLabels":{"app":"nginxdep"}},"strategy":{},"template":{"metadata":{"creationTimestamp":null,"labels": {"app":"nginxdep"}},"spec":{"containers":[{"image":"nginx","name":"nginx","resources":{}}]}}},"status":{}} creationTimestamp: "XX"
同様のエラーとなっている方の参考になれば幸いです。