kustomize 修补特定容器而不是通过数组 (/containers/0)

poc*_*ers 11 arrays containers patch kubernetes kustomize

我正在尝试查看是否有一种方法可以将 kustomize patchTransformer 应用到 pod 中的特定容器,而不是使用其数组索引。例如,如果我的 pod 中有 3 个容器 (0, 1, 2),并且我想修补容器“1”,我通常会执行以下操作:

patch: |-
  - op: add
    path: /spec/containers/1/command
    value:  ["sh", "-c", "tail -f /dev/null"]
Run Code Online (Sandbox Code Playgroud)

这在很大程度上取决于集装箱订单保持静态。如果容器“1”由于某种原因被删除,数组将被重新洗牌,容器“2”突然变成容器“1”,使我的补丁不再适用。

有没有办法按名称修补,或定位标签/注释,或其他机制?

path: /spec/containers/${NAME_OF_CONTAINER}/command
Run Code Online (Sandbox Code Playgroud)

任何见解都将受到高度赞赏。

Zev*_*ert 15

您可能已经在互联网上看到过这样的JSONPath语法,并希望您可以选择一个列表项并使用 Kustomize 对其进行修补。

/spec/containers[name=my-app]/command
Run Code Online (Sandbox Code Playgroud)

正如 @Rico 在他的回答中提到的:这是JSON6902的限制- 它只接受使用JSONPointer语法的路径,由JSON6901定义。

[key=value]因此,不,当前在使用 kustomize 时无法使用语法来处理列表项patchesJson6902

然而,围绕处理列表项顺序更改的原始问题中提出的问题确实有一个使用JSONPointer语法 (JSON6901) 的解决方案,而无需转移到战略合并补丁(这可能取决于 CRD 作者正确注释列表项合并应该如何进行)被应用)。

只需将另一个 JSON6902 操作添加到您的补丁中,即可使test该项目保留在您指定的索引处。

# First, test that the item is still at the list index you expect
- op: test
  path: /spec/containers/0/name
  value: my-app

# Now that you know your item is still at index-0, it's safe to patch its command
- op: replace
  path: /spec/containers/0/command
  value: ["sh", "-c", "tail -f /dev/null"]
Run Code Online (Sandbox Code Playgroud)

test如果指定路径中的值与提供的值不匹配,则操作将使您的补丁失败。这样,您可以确保其他修补操作对项目索引的依赖仍然有效!

我特别在处理自定义资源时使用这个技巧,因为我:

  • A) 不必为 kustomize 提供全新的 openAPI 规范,并且
  • B) 不必依赖 CRD 作者添加正确的扩展注释(例如:)"x-kubernetes-patch-merge-key": "name"来确保列表项上的战略合并补丁按照我需要的方式工作。


Ric*_*ico 1

这更多是Json6902补丁的限制,加上容器在 K8s pod 中被定义为数组而不是哈希,这样的东西可以工作:

\n
path: /spec/containers/${NAME_OF_CONTAINER}/command\n
Run Code Online (Sandbox Code Playgroud)\n

您可以尝试使用StrategyMergePatch。这本质上kubectl apply是什么。

\n
cat <<EOF > deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: my-app\nspec:\n  selector:\n    matchLabels:\n      run: my-app\n  replicas: 2\n  template:\n    metadata:\n      labels:\n        run: my-app\n    spec:\n      containers:\n      - name: my-container\n        image: myimage\n        ports:\n        - containerPort: 80\nEOF\n
Run Code Online (Sandbox Code Playgroud)\n
cat <<EOF > set_command.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: my-nginx\nspec:\n  template:\n    spec:\n      containers:\n      - name: my-app\n        command: ["sh", "-c", "tail -f /dev/null"]\nEOF\n
Run Code Online (Sandbox Code Playgroud)\n
cat <<EOF >./kustomization.yaml\nresources:\n- deployment.yaml\npatchesStrategicMerge:\n- set_command.yaml\nEOF\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x9c\x8c\xef\xb8\x8f

\n