当我使用“ kubectl补丁”删除数组中的特定对象时,我需要首先检查该特定对象的索引,然后使用json / yaml路径进行kubectl补丁。
例如,我有一个包含多个端口对象的资源:
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
答案 0 :(得分:1)
恐怕是不可能的。 kubectl patch --type=json
命令在内部使用JSON Patch,而在后面使用JSON Pointer。 JSON指针标准非常简单,并且不提供过滤/匹配功能。
作为解决方法,您可以在调用kubectl patch
之前使用jq查找数组索引:
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