英文:
Kustomize: Patch multiple resources that starts with same name
问题
我想要对以相同的namePrefix开头而不是针对特定资源进行多个部署的修补。
例如,我有两个nginx部署deployment-v1.yaml和deployment-v2.yaml。我想要使用**nginx-**前缀来修补这两个部署。
deployment-v1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-v1
labels:
app: web
spec:
selector:
matchLabels:
app: web
replicas: 5
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
deployment-v2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: web
spec:
selector:
matchLabels:
app: web
replicas: 5
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
ports:
- containerPort: 80
现在,我想要使用通用的overlay-patch覆盖这两个部署。我尝试像这样做。
overlay.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
namePrefix: nginx-
spec:
replicas: 10
kustomization.yml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment-v1.yaml
- deployment-v2.yaml
patchesStrategicMerge:
- overlay.yaml
但它不起作用,因为它期望一个名称与目标匹配,完全忽略了namePrefix。任何帮助都将不胜感激。
英文:
I want to patch multiple deployments that starts with same namePrefix instead of targeting specific resource.
For example, I have 2 deployments of nginx deployment-v1.yaml and deployment-v2.yaml. I want to patch both the deployment using nginx- prefix.
deployment-v1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-v1
labels:
app: web
spec:
selector:
matchLabels:
app: web
replicas: 5
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: web
spec:
containers:
—name: nginx
image: nginx
ports:
—containerPort: 80
deployment-v2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: web
spec:
selector:
matchLabels:
app: web
replicas: 5
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: web
spec:
containers:
—name: nginx
image: nginx
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
ports:
—containerPort: 80
Now I want to overlay both the deployments with common overlay-patch. I am trying something like this.
overlay.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
namePrefix: nginx-
spec:
replicas: 10
kustomization.yml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment-v1.yaml
- deployment-v2.yaml
patchesStrategicMerge:
- overlay.yaml
But it is not working as it is expecting a name to match the target and totally ignoring namePrefix. Any help is appreciated.
答案1
得分: 1
你可以使用补丁中的 target
属性来将补丁应用于多个资源。根据您的示例(在我评论中指出错误后进行修正),我们可以编写一个像这样的 kustomization.yaml
:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment-v1.yaml
- deployment-v2.yaml
patches:
- target:
kind: Deployment
patch: |
apiVersion: apps/v1
kind: Deployment
metadata:
name: this_value_is_ignored
spec:
replicas: 10
target
属性控制了此补丁将应用于哪些资源。使用上述配置运行 kustomize build
会得到以下结果:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
name: nginx-deployment
spec:
replicas: 10
.
.
.
以及:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
name: nginx-v1
spec:
replicas: 10
.
.
.
上述配置将会将补丁应用于 所有 在您的 kustomization 中的部署。如果您想将补丁限制为仅适用于名称前缀匹配的部署,您可以编写如下:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment-v1.yaml
- deployment-v2.yaml
patches:
- target:
kind: Deployment
name: nginx.*
patch: |
apiVersion: apps/v1
kind: Deployment
metadata:
name: this_value_is_ignored
spec:
replicas: 10
请注意,name
模式是正则表达式,而不是 shell 风格的通配符。
英文:
You can apply a patch to multiple resources using the target
attribute in a patch. Given your examples (after fixing the errors I pointed out in my comment), we can write a kustomization.yaml
like this:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment-v1.yaml
- deployment-v2.yaml
patches:
- target:
kind: Deployment
patch: |
apiVersion: apps/v1
kind: Deployment
metadata:
name: this_value_is_ignored
spec:
replicas: 10
The target
attribute controls to what resources this patch will apply. With the above configuration, running kustomize build
results in:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
name: nginx-deployment
spec:
replicas: 10
.
.
.
and:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
name: nginx-v1
spec:
replicas: 10
.
.
.
The above configuration would apply the patch to all deployments in your kustomization. If you wanted to limit the patching to only deployments matching a specific name prefix, you could write:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment-v1.yaml
- deployment-v2.yaml
patches:
- target:
kind: Deployment
name: nginx.*
patch: |
apiVersion: apps/v1
kind: Deployment
metadata:
name: this_value_is_ignored
spec:
replicas: 10
Note that the name
pattern is regular expression, not a shell-style glob.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论