Я довольно успешно изменил метку узла в моем кластере Kubernetes (созданном с использованием kubeadm), используя kubectl replace
и kubectl apply
.
Обязательно: Если конфигурация вашего узла была изменена вручную, используя императивную команду, такую как kubectl label
, необходимо исправить аннотацию last-applied-configuration
, используя следующую команду (замените node2 именем вашего узла) :
kubectl get node node2 -o yaml | kubectl apply -f -
Примечание: Работает одинаково со всеми типами объектов Kubernetes (с немного отличающимися последствиями. Всегда проверяйте результаты).
Примечание2 : аргумент --export
для kubectl get
устарел и работает без него, но если вы его используете, аннотация last-applied-configuration
выглядит намного короче и проще для читать.
Без применения существующей конфигурации следующая команда kubectl apply
будет игнорировать все поля, которых нет в аннотации last-applied-configuration
.
Следующий пример иллюстрирует, что поведение :
kubectl get node node2 -o yaml | grep node-role
{"apiVersion":"v1","kind":"Node","metadata":{"annotations":{"flannel.alpha.coreos.com/backend-data":"{\"VtepMAC\":\"46:c6:d1:f0:6c:0a\"}","flannel.alpha.coreos.com/backend-type":"vxlan","flannel.alpha.coreos.com/kube-subnet-manager":"true","flannel.alpha.coreos.com/public-ip":"10.156.0.11","kubeadm.alpha.kubernetes.io/cri-socket":"/var/run/dockershim.sock","node.alpha.kubernetes.io/ttl":"0","volumes.kubernetes.io/controller-managed-attach-detach":"true"},"creationTimestamp":null,
"labels":{
"beta.kubernetes.io/arch":"amd64",
"beta.kubernetes.io/os":"linux",
"kubernetes.io/arch":"amd64",
"kubernetes.io/hostname":"node2",
"kubernetes.io/os":"linux",
"node-role.kubernetes.io/worker":""}, # <--- important line
"name":"node2","selfLink":"/api/v1/nodes/node2"},"spec":{"podCIDR":"10.244.2.0/24"},"status":{"daemonEndpoints":{"kubeletEndpoint":{"Port":0}},"nodeInfo":{"architecture":"","bootID":"","containerRuntimeVersion":"","kernelVersion":"","kubeProxyVersion":"","kubeletVersion":"","machineID":"","operatingSystem":"","osImage":"","systemUUID":""}}}
node-role.kubernetes.io/santa: ""
node-role.kubernetes.io/worker: ""
Давайте проверим, что произошло с меткой node-role.kubernetes.io/santa
, если я попытаюсь заменить worker на infra и удалить santa , ( worker присутствует в аннотации):
kubectl get node node2 -o yaml | sed 's@node-role.kubernetes.io/worker: ""@node-role.kubernetes.io/infra: ""@' | sed 's@node-role.kubernetes.io/santa: ""@@'| kubectl diff -f -
diff -u -N /tmp/LIVE-380689040/v1.Node..node2 /tmp/MERGED-682760879/v1.Node..node2
--- /tmp/LIVE-380689040/v1.Node..node2 2020-04-08 17:20:18.108809972 +0000
+++ /tmp/MERGED-682760879/v1.Node..node2 2020-04-08 17:20:18.120809972 +0000
@@ -18,8 +18,8 @@
kubernetes.io/arch: amd64
kubernetes.io/hostname: node2
kubernetes.io/os: linux
+ node-role.kubernetes.io/infra: "" # <-- created
node-role.kubernetes.io/santa: "" # <-- ignored
- node-role.kubernetes.io/worker: "" # <-- removed
name: node2
resourceVersion: "60973814"
selfLink: /api/v1/nodes/node2
exit status 1
После исправления аннотации kubectl apply
работает довольно хорошо, заменяя и удаляя метки:
kubectl get node node2 -o yaml | sed 's@node-role.kubernetes.io/worker: ""@node-role.kubernetes.io/infra: ""@' | sed 's@node-role.kubernetes.io/santa: ""@@'| kubectl diff -f -
diff -u -N /tmp/LIVE-107488917/v1.Node..node2 /tmp/MERGED-924858096/v1.Node..node2
--- /tmp/LIVE-107488917/v1.Node..node2 2020-04-08 18:01:55.776699954 +0000
+++ /tmp/MERGED-924858096/v1.Node..node2 2020-04-08 18:01:55.792699954 +0000
@@ -18,8 +18,7 @@
kubernetes.io/arch: amd64
kubernetes.io/hostname: node2
kubernetes.io/os: linux
- node-role.kubernetes.io/santa: "" # <-- removed
- node-role.kubernetes.io/worker: "" # <-- removed
+ node-role.kubernetes.io/infra: "" # <-- created
name: node2
resourceVersion: "60978298"
selfLink: /api/v1/nodes/node2
exit status 1
Вот еще несколько примеры:
# Check the original label ( last filter removes last applied config annotation line)
$ kubectl get node node2 -o yaml | grep node-role | grep -v apiVersion
node-role.kubernetes.io/infra: ""
# Replace the label using kubectl replace syntax
$ kubectl get node node2 -o yaml | sed 's@node-role.kubernetes.io/infra: ""@node-role.kubernetes.io/worker: ""@' | kubectl replace -f -
node/node2 replaced
# check the new state of the label
$ kubectl get node node2 -o yaml | grep node-role | grep -v apiVersion
node-role.kubernetes.io/worker: ""
# Replace the label using kubectl apply syntax
$ kubectl get node node2 -o yaml | sed 's@node-role.kubernetes.io/worker: ""@node-role.kubernetes.io/infra: ""@' | kubectl apply -f -
node/node2 configured
# check the new state of the label
$ kubectl get node node2 -o yaml | grep node-role | grep -v apiVersion
node-role.kubernetes.io/infra: ""
# Remove the label from the node ( for demonstration purpose)
$ kubectl get node node2 -o yaml | sed 's@node-role.kubernetes.io/infra: ""@@' | kubectl apply -f -
node/node2 configured
# check the new state of the label
$ kubectl get node node2 -o yaml | grep node-role | grep -v apiVersion
# empty output
При использовании kubectl apply -f
на ресурсе, созданном с помощью обязательных команд, таких как kubectl create
или kubectl expose
, вы можете увидеть следующее предупреждение:
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
В этом случае будет создана аннотация last-applied-configuration
с содержимым файла, используемого в команде kubectl apply -f filename.yaml
. Он может содержать не все параметры и метки, присутствующие в активном объекте.