我想看看除了使用数组索引之外,是否有其他方法可以将自定义patchTransformer应用到pod中的特定容器。例如,如果我在一个pod中有3个容器(0,1,2),并且我想为容器"1"打补丁,我通常会这样做:
patch: |-
- op: add
path: /spec/containers/1/command
value: ["sh", "-c", "tail -f /dev/null"]
这在很大程度上依赖于容器顺序保持静态。如果容器"1"由于任何原因被删除,数组将被重新 Shuffle ,容器"2"突然变成容器"1",使我的补丁不再适用。
有没有办法按名称打补丁,或者以标签/注解为目标,或者其他一些机制?
path: /spec/containers/${NAME_OF_CONTAINER}/command
任何见解都不胜感激。
2条答案
按热度按时间soat7uwm1#
这更多的是Json6902修补程序的限制,以及在K8s pod中将容器定义为数组而不是哈希的事实,在哈希中,类似于以下内容:
您可以尝试StrategicMergePatch,这基本上就是
kubectl apply
的功能。x一个一个一个一个x一个一个二个一个x一个一个三个一个
✌️
g2ieeal72#
对于未来的读者:您可能已经在互联网上看到过类似这样的 * JSONPath * 语法,并希望可以选择一个列表项并使用Kustomize对其进行修补。
正如his answer中提到的@Rico:这是JSON6902的一个限制-它只接受使用 * JSONPointer * 语法的路径,由JSON6901定义。
因此,不可以,在使用kustomize的
patchesJson6902
时,您当前无法使用[key=value]
语法来寻址列表项。但是,原始问题强调的有关列表项可能重新排序的问题的解决方案确实存在,而无需转移到策略合并补丁(这可能取决于CRD作者正确注解应如何应用列表项合并)。
只需将另一个JSON6902操作添加到
test
的补丁中,使该项保留在您指定的索引中。如果指定路径中的值与提供的值不匹配,
test
操作将使您的修补失败。这样,您可以确保其他修补操作对项目索引的依赖仍然有效!我特别在处理自定义资源时使用此技巧,因为我:
"x-kubernetes-patch-merge-key": "name"
),以确保我对列表项的策略合并补丁按照我需要的方式工作。