首页 > 解决方案 > Openshift/Kubernetes - oc 修补数组的所有元素

问题描述

我正在尝试将 openshift 服务从使用命令转换LoadBalancerClusterIP使用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

标签: kubernetesyamlopenshiftpatch

解决方案


推荐阅读