Kustomize - 使用相同的命名空间创建多个和单个部署

Kustomize - Create multi and single deployment using same namespace

自定义目录结构

├── base
│   ├── deployment.yaml
│   └── kustomization.yaml
└── overlays
    └── prod
        ├── kustomization.yaml
        ├── namespace-a
        │   ├── deployment-a1
        │   │   ├── kustomization.yaml
        │   │   └── patch.yaml
        │   ├── deployment-a2
        │   │   ├── kustomization.yaml
        │   │   └── patch.yaml
        │   ├── kustomization.yaml
        │   └── namespace.yaml
        ├── namespace-b
        │   ├── deployment-b1
        │   │   ├── kustomization.yaml
        │   │   └── patch.yaml
        │   ├── deployment-b2
        │   │   ├── kustomization.yaml
        │   │   └── patch.yaml
        │   ├── kustomization.yaml
        │   └── namespace.yaml
        └── namespace-c

正如您在上面所看到的,我有 prod 环境以及 namesapce-anamespace-b 以及其他一些环境。 要为所有人创建部署,我可以简单地 运行 以下命令:

    > kustomize overlays/prod

工作完美,两个命名空间都与其他部署文件一起为所有部署创建。

仅为命名空间-a 创建部署:

    > kustomize overlays/prod/namespace-a

这也行。 :)

但这至少对我来说不是故事的结局。

我想保留当前功能并能够部署 deployment-a1, deployment-a2 ...

    > kustomize overlays/prod/namespace-a/deployment-a1

如果我将 namespace.yaml 放入 deployment-a1 文件夹并将其添加到 kustomization.yaml 然后上面的命令有效,但前 2 个命令失败并出现错误,因为现在我们有 2 个同名的命名空间文件。

我有 2 个问题。

  1. 这个目录结构可以改进吗?
  2. 如何在不破坏其他功能的情况下通过单一部署创建命名空间?

完整代码可见here

在您的特定情况下,在最理想的情况下,所有必需的名称空间都应该在 运行 kustomize 命令之前创建。 但是,我知道您希望根据需要动态创建名称空间。

使用 Bash 脚本作为某种包装器绝对有助于这种方法,但我不确定你是否想使用它。

下面,我将向您展示它是如何工作的,您可以选择它是否适合您。


首先,我创建了一个需要两个参数的 kustomize-wrapper 脚本:

  1. 您要使用的命名空间的名称。
  2. 包含 kustomization.yaml 文件的目录路径。

kustomize-wrapper.sh

$ cat kustomize-wrapper.sh
#!/bin/bash

if [ -z "" ] || [ -z "" ]; then
    echo "Pass required arguments !"
    echo "Usage: [=10=] NAMESPACE KUSTOMIZE_PATH"
    exit 1
else
    NAMESPACE=
    KUSTOMIZE_PATH=
fi

echo "Creating namespace"
sed -i "s/name:.*/name: ${NAMESPACE}/" namespace.yaml
kubectl apply -f namespace.yaml

echo "Setting namespace: ${NAMESPACE} in the kustomization.yaml file"
sed -i "s/namespace:.*/namespace: ${NAMESPACE}/" base/kustomization.yaml

echo "Deploying resources in the ${NAMESPACE}"
kustomize build ${KUSTOMIZE_PATH} | kubectl apply -f -

如您所见,此脚本使用 namespace.yaml 文件作为模板创建了一个命名空间。然后它在 base/kustomization.yaml 文件中设置相同的命名空间,最后使用您提供的路径作为第二个参数运行 kustomize 命令。

namespace.yaml

$ cat namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name:

base/kustomization.yaml

$ cat base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace:

resources:
- deployment.yaml

目录结构

$ tree
.
├── base
│   ├── deployment.yaml
│   └── kustomization.yaml
├── kustomize-wrapper.sh
├── namespace.yaml
└── overlays
    └── prod
        ├── deployment-a1
        │   ├── kustomization.yaml
        │   └── patch.yaml
        ├── deployment-a2
        │   ├── kustomization.yaml
        │   └── patch.yaml
        └── kustomization.yaml
    
    
    

我们可以检查它是否按预期工作。

创建 namespace-a 命名空间以及 app-deployment-a1app-deployment-a2 部署:

$ ./kustomize-wrapper.sh namespace-a overlays/prod
Creating namespace
namespace/namespace-a created
Setting namespace: namespace-a in the kustomization.yaml file
deployment.apps/app-deployment-a1 created
deployment.apps/app-deployment-a2 created

仅创建 namespace-a 命名空间和 app-deployment-a1 部署:

$ ./kustomize-wrapper.sh namespace-a overlays/prod/deployment-a1
Creating namespace
namespace/namespace-a created
Setting namespace: namespace-a in the kustomization.yaml file
deployment.apps/app-deployment-a1 created