补丁策略
KubeVela 提供了一系列补丁策略来帮助解决冲突的问题。在编写补丁型运维特征和工作流时,如果你发现值冲突的问题,可以结合使用这些补丁策略。值得注意的是,补丁策略并不是 CUE 官方提供的功能, 而是 KubeVela 扩展开发而来。
我们以编写一个环境变量补丁的运维特征来分别介绍补丁策略的使用方法。
如果你希望为指定容器添加多个环境变量,你可以使用 注释来找到这个容器。此时,KubeVela 会执行 merge 操作,将这些环境变量与已有的环境变量进行合并。这意味着,patchKey 无法处理重复的字段名。
在环境中部署如下 definition:
在如下应用中使用这个策略型补丁:
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
name: webservice-app
spec:
components:
- name: express-server
type: webservice
properties:
image: crccheck/hello-world
env:
- name: OLD
value: old
traits:
- type: myenv
properties:
env:
NEW: new
spec:
containers:
- env:
- name: OLD
value: old
在使用了 myenv
这个补丁特征之后,应用的环境变量为:
spec:
containers:
- env:
- name: OLD
value: old
- name: NEW
value: new
最终,我们可以看到应用的环境变量中包含了两个环境变量:OLD=old
和 NEW=new
。
如果你希望在合并环境变量的同时,能够覆盖重复的环境变量值的话,你可以使用 +patchStrategy=retainKeys
注释。
这个注解的策略,与 Kubernetes 官方的 retainKeys 策略类似。
在如下应用中使用这个策略型补丁:
kind: Application
name: webservice-app
spec:
components:
- name: express-server
type: webservice
properties:
image: crccheck/hello-world
env:
- name: OLD
value: old
- name: OLD2
value: old2
traits:
- type: myenv
properties:
env:
NEW: new
OLD2: override
在不使用 myenv
这个补丁特征之前,应用的环境变量为:
spec:
containers:
- env:
- name: OLD
value: old
- name: OLD2
value: old2
spec:
containers:
- env:
- name: OLD
value: old
- name: OLD2
- name: NEW
value: new
最终,我们可以看到应用的环境变量中包含了三个环境变量:OLD=old
, 和 NEW=new
。
如果你希望直接替换掉整个环境变量数组的话,你可以使用 +patchStrategy=replace
注释。
在如下应用中使用这个策略型补丁:
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
name: webservice-app
spec:
components:
- name: express-server
type: webservice
properties:
image: crccheck/hello-world
env:
- name: OLD
value: old
- name: OLD2
value: old2
traits:
- type: myenv
properties:
env:
NEW: replace
在不使用 myenv
这个补丁特征之前,应用的环境变量为:
spec:
containers:
- env:
- name: OLD
value: old
- name: OLD2
value: old2
在使用了 myenv
这个补丁特征之后,应用的环境变量为:
spec:
containers:
- env:
- name: NEW
最终,我们可以看到应用的环境变量中只保留了新的环境变量:NEW=replace
。