#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
равным .