如何覆盖命名空间覆盖

Dan*_*ite 6 kubernetes kustomize

在以下场景中,我在 ../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
Run Code Online (Sandbox Code Playgroud)

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

小智 14

从 kustomize 4.5.6 开始,可以通过添加命名空间转换器来实现。您想将该字段设置unsetOnlytrue

这是一个例子:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
 - ../base    
resources:
 - local-path-storage.yaml
transformers:
  - |-
    apiVersion: builtin
    kind: NamespaceTransformer
    metadata:
      name: notImportantHere
      namespace: dev
    unsetOnly: true
Run Code Online (Sandbox Code Playgroud)

对于没有设置命名空间的所有资源,这应该将命名空间设置为 dev。

链接到namespaceTransformer规范:https://kubectl.docs.kubernetes.io/references/kustomize/builtins/#_namespacetransformer _


ers*_*les 8

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

这里最快的解决方案是删除 中的namespace设置dev/kustomize.yaml并手动设置所有资源中的命名空间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
blacklist = [
    "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 blacklist:
            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)
Run Code Online (Sandbox Code Playgroud)


Die*_*des 8

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

您的选择是:

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

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