补丁策略

    KubeVela 提供了一系列补丁策略来帮助解决冲突的问题。在编写补丁型运维特征和工作流时,如果你发现值冲突的问题,可以结合使用这些补丁策略。值得注意的是,补丁策略并不是 CUE 官方提供的功能, 而是 KubeVela 扩展开发而来。

    我们以编写一个环境变量补丁的运维特征来分别介绍补丁策略的使用方法。

    如果你希望为指定容器添加多个环境变量,你可以使用 注释来找到这个容器。此时,KubeVela 会执行 merge 操作,将这些环境变量与已有的环境变量进行合并。这意味着,patchKey 无法处理重复的字段名。

    在环境中部署如下 definition:

    在如下应用中使用这个策略型补丁:

    1. apiVersion: core.oam.dev/v1beta1
    2. kind: Application
    3. metadata:
    4. name: webservice-app
    5. spec:
    6. components:
    7. - name: express-server
    8. type: webservice
    9. properties:
    10. image: crccheck/hello-world
    11. env:
    12. - name: OLD
    13. value: old
    14. traits:
    15. - type: myenv
    16. properties:
    17. env:
    18. NEW: new
    1. spec:
    2. containers:
    3. - env:
    4. - name: OLD
    5. value: old

    在使用了 myenv 这个补丁特征之后,应用的环境变量为:

    1. spec:
    2. containers:
    3. - env:
    4. - name: OLD
    5. value: old
    6. - name: NEW
    7. value: new

    最终,我们可以看到应用的环境变量中包含了两个环境变量:OLD=oldNEW=new

    如果你希望在合并环境变量的同时,能够覆盖重复的环境变量值的话,你可以使用 +patchStrategy=retainKeys 注释。

    这个注解的策略,与 Kubernetes 官方的 retainKeys 策略类似。

    在如下应用中使用这个策略型补丁:

    1. kind: Application
    2. name: webservice-app
    3. spec:
    4. components:
    5. - name: express-server
    6. type: webservice
    7. properties:
    8. image: crccheck/hello-world
    9. env:
    10. - name: OLD
    11. value: old
    12. - name: OLD2
    13. value: old2
    14. traits:
    15. - type: myenv
    16. properties:
    17. env:
    18. NEW: new
    19. OLD2: override

    在不使用 myenv 这个补丁特征之前,应用的环境变量为:

    1. spec:
    2. containers:
    3. - env:
    4. - name: OLD
    5. value: old
    6. - name: OLD2
    7. value: old2
    1. spec:
    2. containers:
    3. - env:
    4. - name: OLD
    5. value: old
    6. - name: OLD2
    7. - name: NEW
    8. value: new

    最终,我们可以看到应用的环境变量中包含了三个环境变量:OLD=old, 和 NEW=new

    如果你希望直接替换掉整个环境变量数组的话,你可以使用 +patchStrategy=replace 注释。

    在如下应用中使用这个策略型补丁:

    1. apiVersion: core.oam.dev/v1beta1
    2. kind: Application
    3. metadata:
    4. name: webservice-app
    5. spec:
    6. components:
    7. - name: express-server
    8. type: webservice
    9. properties:
    10. image: crccheck/hello-world
    11. env:
    12. - name: OLD
    13. value: old
    14. - name: OLD2
    15. value: old2
    16. traits:
    17. - type: myenv
    18. properties:
    19. env:
    20. NEW: replace

    在不使用 myenv 这个补丁特征之前,应用的环境变量为:

    1. spec:
    2. containers:
    3. - env:
    4. - name: OLD
    5. value: old
    6. - name: OLD2
    7. value: old2

    在使用了 myenv 这个补丁特征之后,应用的环境变量为:

    1. spec:
    2. containers:
    3. - env:
    4. - name: NEW

    最终,我们可以看到应用的环境变量中只保留了新的环境变量:NEW=replace