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

时间:2021-07-12 20:48:33

标签: kubernetes kustomize

自定义目录结构

├── 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

1 个答案:

答案 0 :(得分:1)

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

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

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


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

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

kustomize-wrapper.sh

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

if [ -z "$1" ] || [ -z "$2" ]; then
    echo "Pass required arguments !"
    echo "Usage: $0 NAMESPACE KUSTOMIZE_PATH"
    exit 1
else
    NAMESPACE=$1
    KUSTOMIZE_PATH=$2
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