Как удалить метку из объекта kubernetes просто с помощью «kubectl apply -f file.yaml»? - PullRequest
0 голосов
/ 01 апреля 2020

Я играю с GitOps и ArgoCD в Redhat Openshift. Моя цель - переключить рабочий узел на инфра-узел.

Я хочу сделать это с помощью описательных файлов YAML, а НЕ вручную с помощью командной строки (это легко сделать с помощью узла меток kubectl ...)

Чтобы сделать узел инфра-узлом, я хочу добавить метку «инфра» и взять из нее метку «работник». Ранее объект выглядел следующим образом (нерелевантные метки опущены):

apiVersion: v1
kind: Node
metadata:
  labels:
    node-role.kubernetes.io/infra: ""
  name: node6.example.com
spec: {}

После применения файла YAML он должен выглядеть следующим образом:

apiVersion: v1
kind: Node
metadata:
  labels:
    node-role.kubernetes.io/worker: ""
  name: node6.example.com
spec: {}

Если я поставлю последний конфиг в файле и выполните «kubectl apply -f», узел имеет как инфра-, так и рабочие метки. Таким образом, добавить метку или изменить значение метки легко, но есть ли способ удалить метку в метаданных объектов, применив файл YAML?

Ответы [ 3 ]

0 голосов
/ 02 апреля 2020

Я бы сказал, что это невозможно сделать с kubectl apply, по крайней мере я пытался и не смог найти никакой информации об этом.

Как упоминал @Petr Kotas, вы всегда можете использовать

kubectl label node node6.example.com node-role.kubernetes.io/infra-

Но я вижу, что вы ищете что-то еще

Я хочу сделать это с помощью описательных файлов YAML, а НЕ вручную, используя командную строку (это легко с узлом метки kubectl .. .)


Так что, возможно, ответом может быть использование клиентов API, например python? Я нашел этот пример здесь , сделанный @Prafull Ladha

Как уже упоминалось, исправьте пример kubectl для удаления метки, но нет упоминания об удалении меток с помощью клиентов API. если вы хотите удалить метку с помощью API, вам нужно предоставить новое тело с labelname: None и затем прикрепить это тело к узлу или модулю. Я использую клиентский API kubernetes python для примера

from pprint import pprint
from kubernetes import client, config

config.load_kube_config()
client.configuration.debug = True

api_instance = client.CoreV1Api()

body = {
    "metadata": {
        "labels": {
            "label-name": None}
        }
}

api_response = api_instance.patch_node("minikube", body)

print(api_response)
0 голосов
/ 06 апреля 2020

Я довольно успешно изменил метку узла в моем кластере 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. Он может содержать не все параметры и метки, присутствующие в активном объекте.

0 голосов
/ 02 апреля 2020

вы можете удалить метку с помощью

kubectl label node node6.example.com node-role.kubernetes.io/infra-

, чем вы можете снова запустить kubectl apply с новой меткой. Вы будете в рабочем состоянии.

...