【问题标题】:How to override a namespace override如何覆盖命名空间覆盖
【发布时间】:2019-09-30 19:03:02
【问题描述】:

在以下场景中,我的容器定义在 ../base/.

在这个 /dev/ 目录中,我想启动命名空间 dev 中的所有部署和状态集。

问题是我还想在 local-path-storage 命名空间中运行 local-path-storage CSI。 kustomize 将覆盖它并在“dev”命名空间中创建它。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: dev
bases:
  - ../base    
resources:
  - local-path-storage.yaml

如何撤消仅针对 local-path-storage.yaml 的命名空间覆盖?

【问题讨论】:

    标签: kubernetes kustomize


    【解决方案1】:

    此功能在 Kustomize 中尚不存在。有一个 open issue 解决了这个问题,但在撰写本文时还没有公开的 PR。

    这里最快的解决方案是删除dev/kustomize.yaml中的namespace设置,并在dev中的所有资源中手动设置命名空间。

    另一个选项,厚颜无耻地从我之前引用的问题中复制而来,是创建一个转换器来解决这个问题:

    #!/usr/bin/env /usr/bin/python3
    
    import sys
    import yaml
    
    with open(sys.argv[1], "r") as stream:
        try:
            data = yaml.safe_load(stream)
        except yaml.YAMLError as exc:
            print("Error parsing NamespaceTransformer input", file=sys.stderr)
    
    # See kubectl api-resources --namespaced=false
    denylist = [
        "ComponentStatus",
        "Namespace",
        "Node",
        "PersistentVolume",
        "MutatingWebhookConfiguration",
        "ValidatingWebhookConfiguration",
        "CustomResourceDefinition",
        "APIService",
        "MeshPolicy",
        "TokenReview",
        "SelfSubjectAccessReview",
        "SelfSubjectRulesReview",
        "SubjectAccessReview",
        "CertificateSigningRequest",
        "ClusterIssuer",
        "BGPConfiguration",
        "ClusterInformation",
        "FelixConfiguration",
        "GlobalBGPConfig",
        "GlobalFelixConfig",
        "GlobalNetworkPolicy",
        "GlobalNetworkSet",
        "HostEndpoint",
        "IPPool",
        "PodSecurityPolicy",
        "NodeMetrics",
        "PodSecurityPolicy",
        "ClusterRoleBinding",
        "ClusterRole",
        "ClusterRbacConfig",
        "PriorityClass",
        "StorageClass",
        "VolumeAttachment",
    ]
    
    try:
        for yaml_input in yaml.safe_load_all(sys.stdin):
            if yaml_input['kind'] not in denylist:
                if "namespace" not in yaml_input["metadata"]:
                    yaml_input["metadata"]["namespace"] = data["namespace"]
            print("---")
            print(yaml.dump(yaml_input, default_flow_style=False))
    except yaml.YAMLError as exc:
        print("Error parsing YAML input\n\n%s\n\n" % input, file=sys.stderr)
    

    【讨论】:

    • 这才是真正的长期解决方案。
    【解决方案2】:

    很遗憾,这是不可能的,kustomization 中的命名空间覆盖假定所有资源都应该属于同一个命名空间。

    您的选择是:

    • 为不属于同一命名空间的资源创建单独的自定义。
    • 使用kubectl apply -f .部署不需要自定义的资源
    • 使用 Eric Staples 建议的替代替换方法。

    我通常为每组资源创建一个自定义,它们一起部署在一个命名空间中,以使自定义简单且独立于任何其他资源。

    【讨论】:

    • 我很伤心。两者都回答了我的问题,我选择实施此解决方案,但将另一个标记为解决方案。我猜是战术与战略。谢谢迭戈。
    • 这是我倾向于做的,因为我是 KISS 的粉丝,我确信 python 可以工作,但它一目了然。我将为属于其他命名空间的随机内容创建一个专用的 kustomization.yaml 文件,并且只制作资源: [object1.yaml, object2.yaml] 引用,然后在 object1.yaml 中写入 namespace1,在 object2.yaml 中写入 namespace2跨度>
    【解决方案3】:

    我也面临同样的问题。
    我解决这个问题的方法是将其分解为多个步骤。

    我会有 stepone、steptwo 文件夹。

    tree ./project/
    ./project/
    ├── stepone
    │   ├── base
    │   └── overlay
    └── steptwo
        ├── base
        └── overlay
    

    现在我可以将不应具有命名空间覆盖的部署部分移动到 steptwo 中,反之亦然。取决于您的部署需求。 我正在处理从模板输出的超过 200 个文件的 heml 模板的复杂转换。

    我只是将部署分解为不同的步骤,并在每个步骤中使用 kustomize 来管理需要隔离的部署部分。

    它确实增加了一些努力,但它仍然提供了我需要的隔离,直到 kustomize 找到一种处理命名空间覆盖的这种复杂性的好方法。这需要@Diego-mendes 回答并将不同的部分封装到它们自己的文件夹中。

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多