如何替换或找到 kustomize 的正确路径

how to replace or find correct path for kustomize

我有部署,我想替换 liveness probe 部分中的“路径”值。 kustomize 中的正确路径是什么?

- patch: |-
    - op: replace
      path: ??????????
      value:
        https://xyz.staging.something.eu/ping

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        test: liveness
      name: liveness-http
    spec:
      containers:
      - name: liveness
        image: k8s.gcr.io/liveness
        args:
        - /server
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 3
          periodSeconds: 3

是yaml路径。您按照从父节点向下到要指定的 leaf-node 的节点。

由于您想要 livenessProbehttpGet 上的 path 节点,它将以 livenessProbe.httpGet.path.

结尾

livenessProbe 的父节点有点棘手,注意它是列表的一个元素containers。您可以通过索引或属性 (EG name) 指定它。所以 containers[0]containers[name=liveness].

现在我们有 containers[0].livenessProbe.httpGet.path。缺少的根节点是spec,所以spec.containers[0].livenessProbe.httpGet.path就可以了。

还有很多其他方式可以表达这一点。 https://github.com/wwkimball/yamlpath#illustration 似乎是一个更好的 in-depth 解释。

我正在尝试语法 containers[name=xx],当 containers/0 有效时它失败了。我不确定我是否遗漏了某些内容或不受支持,无法找到有关 Kustomize 语法的更多示例。

详情下方

检查了 kustomize 版本:

  • v4.5.4
  • v4.5.2

test.yaml:

---
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - name: test-container
      env:
      - name: environment
        value: stage
      - name: api_port
        value: "8080"
      image: docker.io/bitname/posgresql:latest
      ...
      ...

kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

...
...

patchesJson6902:
- target:
    version: v1
    kind: Pod
    name: test-pod
  path: replace.yaml

replace.yaml

- op: replace
  path: "/spec/containers[name=test-container]/env/0/value"
  value: "dev"
# doesn't work: `Error: replace operation does not apply: doc is missing path" /spec/containers[name=test-container]/env/0/value: missing value
 

- op: replace
  path: "/spec/containers/0/env/0/value"
  value: "dev"
# works as expected

谢谢!