Есть ли способ в «исправлении kubectl» удалить определенный объект в массиве без указания индекса?

#kubernetes #kubectl

#kubernetes #kubectl

Вопрос:

Когда я использую «исправление kubectl» для удаления определенного объекта в массиве, мне нужно сначала проверить индекс этого конкретного объекта, а затем выполнить исправление kubectl с путем json / yaml.

Например, у меня есть ресурс, содержащий объект с несколькими портами:

 spec:
  clusterIP: 100.12.143.76
  externalTrafficPolicy: Cluster
  ports:
  - name: object1
    nodePort: 30681
    port: 1234
    protocol: TCP
    targetPort: 1234
  - name: object2
    nodePort: 31805
    port: 9876
    protocol: TCP
    targetPort: 9876
  

Если мне нужно удалить «object1» в портах, вот команда, которую я использую сейчас (kong-proxy — это имя этого сервисного ресурса):

 kubectl patch service kong-proxy --type=json -p='[{"op": "remove", "path": "/spec/ports/0"}]' -n kong
  

Выполняя приведенную выше команду, он удаляет объект с индексом «0», который имеет имя «object1».

Но для этого требуется, чтобы пользователь заранее знал правильный номер индекса, и если в массиве слишком много объектов, будет сложно управлять и вычислять индекс.

Поэтому мне интересно, не написав отдельный скрипт bash, есть ли способ, которым я могу удалить объект с идентификатором в нем.

Например:

 kubectl patch service kong-proxy --type=json -p='[{"op": "remove", "path": "/spec/ports/{name:object1}"}]' -n kong
  

Ответ №1:

Боюсь, это невозможно. kubectl patch --type=json Команда использует исправление JSON под капотом, которое, в свою очередь, использует указатель JSON. Стандарт указателя JSON довольно прост и не обеспечивает функциональность фильтрации / сопоставления.

Что вы могли бы сделать в качестве обходного пути, так это использовать jq для поиска индекса массива перед вызовом kubectl patch :

 INDEX=$(kubectl get svc kong-proxy -n kong -o json  | jq '.spec.ports | map(.name == "object1") | index(true)')

kubectl patch svc kong-proxy --type=json -p="[{'op': 'remove', 'path': '/spec/ports/$INDEX'}]" -n kong
  

Комментарии:

1. Спасибо за объяснение. На самом деле, я также работаю над тем же обходным путем, который считывает ИНДЕКС из конфигурации ресурса yaml (в основном мы используем YAML для наших ресурсов kube). И поместите ИНДЕКС в команду patch. Я думаю, что нет другого способа сделать это проще.

2. На самом деле это возможно, если вы установите значение ключа null равным .