“ {kubectl补丁”中是否有一种方法可以删除数组中的特定对象而不指定索引?

时间:2020-10-14 14:48:28

标签: kubernetes kubectl

当我使用“ 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

1 个答案:

答案 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