kubernetes - Openshift/Kubernetes - oc 修补数组的所有元素
问题描述
我正在尝试将 openshift 服务从使用命令转换LoadBalancer
为ClusterIP
使用oc patch
命令,这需要删除一些元素:
oc -n default patch svc router --type json -p '[\
{ "op" : "remove", "path" : "/spec/externalIPs" },\
{ "op" : "remove", "path" : "/spec/ports/0/nodePort" },\
{ "op" : "replace", "path" : "/spec/type", "value" : "ClusterIP" }]'
这适用于具有单个.spec.ports
条目的服务,但是当有多个时,无法将它们全部删除,并且补丁操作失败。
具体来说,它在这部分失败,"op" : "remove", "path" : "/spec/ports/0/nodePort"
因为我只指定索引 0。
.spec.ports
修补数组的所有元素的正确语法是什么?
这是什么路径语言?它似乎与yamlpath
但它只接受有限形式的正斜杠表示法有关。
我尝试了多种变体,它们总是以错误消息结尾,例如Error from server: jsonpatch remove operation does not apply: doc is missing path: /spec/ports/*/nodePort
.
一种可能的解决方案是显式删除每个数组索引,直到某个足够高的值,但这很糟糕。
oc -n default patch svc router --type json -p '[\
{ "op" : "remove", "path" : "/spec/externalIPs" },\
{ "op" : "remove", "path" : "/spec/ports/0/nodePort" },\
{ "op" : "remove", "path" : "/spec/ports/1/nodePort" },\
{ "op" : "remove", "path" : "/spec/ports/2/nodePort" },\
{ "op" : "remove", "path" : "/spec/ports/3/nodePort" },\
...
{ "op" : "remove", "path" : "/spec/ports/99/nodePort" },\
{ "op" : "replace", "path" : "/spec/type", "value" : "ClusterIP" }]'
示例服务 YAML:
apiVersion: v1
kind: Service
metadata:
annotations:
prometheus.openshift.io/password: OhsPYf5Ae3
prometheus.openshift.io/username: admin
service.alpha.openshift.io/serving-cert-generation-error: secret/router-certs
references serviceUID , which does not match 9ce61b57-9f35-11e9-af68-0050569ec26d
service.alpha.openshift.io/serving-cert-generation-error-num: "10"
service.alpha.openshift.io/serving-cert-secret-name: router-certs
creationTimestamp: 2019-07-05T15:00:22Z
labels:
bah: bah
router: router
name: router
namespace: default
resourceVersion: "56450329"
selfLink: /api/v1/namespaces/default/services/router
uid: 9ce61b57-9f35-11e9-af68-0050569ec26d
spec:
clusterIP: 172.31.122.90
externalIPs:
- 10.66.11.44
- 10.66.11.41
externalTrafficPolicy: Cluster
ports:
- name: 80-tcp
nodePort: 31380
port: 80
protocol: TCP
targetPort: 80
- name: 443-tcp
nodePort: 30816
port: 443
protocol: TCP
targetPort: 443
- name: 1936-tcp
nodePort: 32677
port: 1936
protocol: TCP
targetPort: 1936
selector:
router: router
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 10.66.11.41
解决方案
推荐阅读
- amazon-ses - 如何使用 SES “从”客户的电子邮件发送电子邮件
- go - 带有交互式提示的 golang 简单服务器
- postgresql - 如何将 Postgres CLI 中的转储数据库从远程服务器传输到远程服务器或本地计算机?
- flutter - 如何做流构建器以在颤动中从 bloc 获取数据
- javascript - 未按正确顺序调用 Javascript 函数,需要异步
- microsoft-edge - 我的边缘启动非常缓慢。如何解决?
- angular - 从 Typescript 中的动态字符串数组中获取值
- python-3.x - 如果python中不满足条件,如何转到函数的第一行?
- javascript - 如何为 Google 自定义搜索 API json 结果设置 HTML 元素的样式?
- javascript - 如何确保在调用函数之前履行承诺?