kubernetes - “kubectl patch”中有没有办法在不指定索引的情况下删除数组中的特定对象?
问题描述
当我使用“kubectl patch”删除数组中的特定对象时,我需要先检查该特定对象的索引,然后使用 json/yaml 路径执行 kubectl patch。
例如,我有一个资源包含多个端口对象:
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
解决方案
恐怕这是不可能的。该kubectl patch --type=json
命令在后台使用JSON Patch,而后者又使用JSON Pointer。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
推荐阅读
- php - 在 jQuery 中,我使用 ajax 在 codeigniter 中为搜索用户调用 api 但 respose 不显示
- sql - 将表定义克隆到 SQL Server 中的表变量
- php - 在 Codeigniter 上创建权限而不检查 URI 段
- java - 外网访问内网MongoDB
- excel - 打开存储在字符串变量中的路径和文件名的工作簿
- ios - 为什么我们在核心数据中使用 performWait?
- javascript - 如果一个为空,则获取另一个值表单对象 angular 6
- php - PHP如何将关联数组(不是它的值)推送到另一个数组?
- python - 可以利用列表而不是正则表达式的 re.findall 的最佳替代品
- java - 如何修复:403 Forbidden 您无权修改此应用程序 (app_id=u'b~con-cen-225506')