如何覆盖名称空间覆盖
How to override a namespace override
在以下场景中,我在 ../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
如何撤消仅本地路径-storage.yaml 的名称空间覆盖?
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)
不幸的是,这是不可能的,kustomization 中的命名空间覆盖假定所有资源都应属于同一个命名空间。
您的备选方案是:
- 为不属于同一命名空间的资源创建单独的 kustomization。
- 使用
kubectl apply -f .
部署不需要kustomization的资源
- 使用 Eric Staples 建议的替代方法。
我通常为每组资源创建一个 kustomization,它们一起部署在一个命名空间中,以使 kustomization 简单且独立于任何其他资源。
我也遇到了同样的问题
我解决这个问题的方法是将其分解为多个步骤。
我会有 stepone、steptwo 文件夹。
tree ./project/
./project/
├── stepone
│ ├── base
│ └── overlay
└── steptwo
├── base
└── overlay
现在我可以将部署中不应覆盖命名空间的部分移至步骤二,反之亦然。取决于您的部署需求。
我正在处理来自 heml 模板的复杂转换,模板输出了 200 多个文件。
我只是将部署分解为不同的步骤,并在每个步骤中使用 kustomize 来管理需要隔离的部署部分。
它确实增加了一些工作量,但它仍然提供了我需要的隔离,直到 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
如何撤消仅本地路径-storage.yaml 的名称空间覆盖?
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)
不幸的是,这是不可能的,kustomization 中的命名空间覆盖假定所有资源都应属于同一个命名空间。
您的备选方案是:
- 为不属于同一命名空间的资源创建单独的 kustomization。
- 使用
kubectl apply -f .
部署不需要kustomization的资源
- 使用 Eric Staples 建议的替代方法。
我通常为每组资源创建一个 kustomization,它们一起部署在一个命名空间中,以使 kustomization 简单且独立于任何其他资源。
我也遇到了同样的问题
我解决这个问题的方法是将其分解为多个步骤。
我会有 stepone、steptwo 文件夹。
tree ./project/
./project/
├── stepone
│ ├── base
│ └── overlay
└── steptwo
├── base
└── overlay
现在我可以将部署中不应覆盖命名空间的部分移至步骤二,反之亦然。取决于您的部署需求。 我正在处理来自 heml 模板的复杂转换,模板输出了 200 多个文件。
我只是将部署分解为不同的步骤,并在每个步骤中使用 kustomize 来管理需要隔离的部署部分。
它确实增加了一些工作量,但它仍然提供了我需要的隔离,直到 kustomize 找到一个很好的方法来处理命名空间覆盖的这种复杂性。这需要