kubernetes 如何覆写命名空间覆写

waxmsbnn  于 2022-11-21  发布在  Kubernetes
关注(0)|答案(4)|浏览(244)

在下面的场景中,我在../base/中定义了容器。
在这个/dev/目录中,我想启动命名空间dev中的所有部署和statefulsets。
问题是我还想在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的命名空间?

x7yiwoj4

x7yiwoj41#

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)
o8x7eapl

o8x7eapl2#

遗憾的是,这是不可能的,自定义中的命名空间覆盖假定所有资源都应属于同一命名空间。
您的备选方案是:

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

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

yyyllmsg

yyyllmsg3#

我也面临着同样的问题。
我解决这个问题的方法是把它分成多个步骤。
我会有第一步,第二步的文件夹。

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

现在我可以将部署中不应该有命名空间覆盖的部分移到第二步,反之亦然。根据您的部署需要。我正在从一个heml模板中处理复杂的转换,模板中输出了200多个文件。
我只是将部署分解为不同的步骤,并在每个步骤中使用kustomize来管理部署中需要隔离的部分。
这确实增加了一些工作量,但它仍然提供了我所需要的隔离,直到kustomize找到一个好的方法来处理名称空间覆盖的复杂性。这采用@Diego-mendes的答案,并将不同的部分封装到各自的文件夹中。

vwhgwdsa

vwhgwdsa4#

可以通过添加一个namespaceTransformer来定制4.5.6。您需要将字段unsetOnly设置为true
以下是一个示例:

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

这会将所有未设置名称空间的资源的名称空间设置为dev。
链接到命名空间Transformer规范:https://kubectl.docs.kubernetes.io/references/kustomize/builtins/#namespacetransformer

相关问题