(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】apply your changes to the latest version and try againというエラー

スポンサーリンク

事象

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"

同様のエラーとなっている方の参考になれば幸いです。