Flux2 が Server Side Apply でマニフェストを適用を再現。この時点では test-data
ラベルが存在している。
$ kubectl apply -f 1-configmap.yaml --server-side --field-manager flux-controller
configmap/config serverside-applied
kubectl get cm config -o yaml --show-managed-fields
apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: "2022-02-18T01:38:19Z"
labels:
test-data: value1
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:labels:
f:test-data: {}
manager: flux-controller
operation: Apply
time: "2022-02-18T01:38:19Z"
name: config
namespace: default
resourceVersion: "3839182"
uid: 57278dfe-fb30-4386-ba67-65461c5e8fae
ここでは Flux2 役を人間がやっているので、停止の処理はスキップ。停止することで勝手に再度適用されないということ。
開発者がローカルでマニフェストを修正し、適用する。修正済みのマニフェストファイルは 2-configmap.yaml
。
$ diff -u 1-configmap.yaml 2-configmap.yaml
--- 1-configmap.yaml 2022-02-18 10:36:39.197624382 +0900
+++ 2-configmap.yaml 2022-02-18 10:39:11.703819006 +0900
@@ -3,4 +3,4 @@
metadata:
name: config
labels:
- test-data: value1
+ test-data: value2
$ kubectl apply -f 2-configmap.yaml
Warning: resource configmaps/config is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
configmap/config configured
$ kubectl get cm config -o yaml --show-managed-fields
apiVersion: v1
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"ConfigMap","metadata":{"annotations":{},"labels":{"test-data":"value2"},"name":"config","namespace":"default"}}
creationTimestamp: "2022-02-18T01:38:19Z"
labels:
test-data: value2
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.: {}
f:kubectl.kubernetes.io/last-applied-configuration: {}
f:labels:
f:test-data: {}
manager: kubectl-client-side-apply
operation: Update
time: "2022-02-18T01:39:44Z"
name: config
namespace: default
resourceVersion: "3839331"
uid: 57278dfe-fb30-4386-ba67-65461c5e8fae
ここではそれをしたということにする。
再開されたことで Flux2 が SSA でマニフェストを適用する。
$ kubectl apply -f 2-configmap.yaml --server-side --field-manager flux-controller
configmap/config serverside-applied
$ kubectl get cm config -o yaml --show-managed-fields
apiVersion: v1
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"ConfigMap","metadata":{"annotations":{},"labels":{"test-data":"value2"},"name":"config","namespace":"default"}}
creationTimestamp: "2022-02-18T01:38:19Z"
labels:
test-data: value2
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:labels:
f:test-data: {}
manager: flux-controller
operation: Apply
time: "2022-02-18T01:41:18Z"
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.: {}
f:kubectl.kubernetes.io/last-applied-configuration: {}
f:labels:
f:test-data: {}
manager: kubectl-client-side-apply
operation: Update
time: "2022-02-18T01:39:44Z"
name: config
namespace: default
resourceVersion: "3839492"
uid: 57278dfe-fb30-4386-ba67-65461c5e8fae
変更をコミットしたことで Flux2 がマニフェストを再度適用する。
しかし、削除したはずのラベルが残ったままであることが確認できる。
$ diff -u 2-configmap.yaml 3-configmap.yaml
--- 2-configmap.yaml 2022-02-18 10:39:11.703819006 +0900
+++ 3-configmap.yaml 2022-02-18 10:42:34.234679373 +0900
@@ -3,4 +3,3 @@
metadata:
name: config
labels:
- test-data: value2
$ kubectl apply -f 3-configmap.yaml --server-side --field-manager flux-controller
configmap/config serverside-applied
$ kubectl get cm config -o yaml --show-managed-fields
apiVersion: v1
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"ConfigMap","metadata":{"annotations":{},"labels":{"test-data":"value2"},"name":"config","namespace":"default"}}
creationTimestamp: "2022-02-18T01:38:19Z"
labels:
test-data: value2
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:labels: {}
manager: flux-controller
operation: Apply
time: "2022-02-18T01:43:03Z"
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.: {}
f:kubectl.kubernetes.io/last-applied-configuration: {}
f:labels:
f:test-data: {}
manager: kubectl-client-side-apply
operation: Update
time: "2022-02-18T01:39:44Z"
name: config
namespace: default
resourceVersion: "3839668"
uid: 57278dfe-fb30-4386-ba67-65461c5e8fae
metadata.managedFields
に注目すると、Flux2 (flux-controller
manager) は、test-data
ラベルの所有権をもっていないことがわかる。
しかし、kubectl-client-side-apply
manager が test-data
ラベルの所有権を持っている。そのため、Flux2 が test-data
ラベルのないマニフェストを適用しても、Flux2 がこのフィールドの所有権を持っていないので無視される。
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:labels: {}
manager: flux-controller
operation: Apply
time: "2022-02-18T01:43:03Z"
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.: {}
f:kubectl.kubernetes.io/last-applied-configuration: {}
f:labels:
f:test-data: {}
manager: kubectl-client-side-apply
operation: Update
time: "2022-02-18T01:39:44Z"
つまり、ここでの解決策は、kubectl-client-side-apply
manager が test-data
ラベルのないマニフェストを適用し、そのフィールドの所有権を放棄することでフィールドが削除される。
$ kubectl apply -f 3-configmap.yaml
configmap/config serverside-applied
このあと Flux2 の SSA による適用が自動的に実行される。
$ kubectl apply -f 3-configmap.yaml --server-side --field-manager flux-controller
configmap/config serverside-applied
オブジェクトの状態を確認すると、無事 test-data
ラベルが削除されていることがわかる。
$ kubectl get cm config -o yaml --show-managed-fields
apiVersion: v1
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"ConfigMap","metadata":{"annotations":{},"labels":null,"name":"config","namespace":"default"}}
creationTimestamp: "2022-02-18T01:38:19Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:labels: {}
manager: flux-controller
operation: Apply
time: "2022-02-18T01:44:21Z"
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.: {}
f:kubectl.kubernetes.io/last-applied-configuration: {}
manager: kubectl-client-side-apply
operation: Update
time: "2022-02-18T01:44:00Z"
name: config
namespace: default
resourceVersion: "3839802"
uid: 57278dfe-fb30-4386-ba67-65461c5e8fae