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-a
和 namespace-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 个问题。
- 这个目录结构可以改进吗?
- 如何在不破坏其他功能的情况下通过单一部署创建命名空间?
完整代码可见here
在您的特定情况下,在最理想的情况下,所有必需的名称空间都应该在 运行 kustomize
命令之前创建。
但是,我知道您希望根据需要动态创建名称空间。
使用 Bash 脚本作为某种包装器绝对有助于这种方法,但我不确定你是否想使用它。
下面,我将向您展示它是如何工作的,您可以选择它是否适合您。
首先,我创建了一个需要两个参数的 kustomize-wrapper
脚本:
- 您要使用的命名空间的名称。
- 包含
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-a1
和 app-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
自定义目录结构
├── 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-a
和 namespace-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 个问题。
- 这个目录结构可以改进吗?
- 如何在不破坏其他功能的情况下通过单一部署创建命名空间?
完整代码可见here
在您的特定情况下,在最理想的情况下,所有必需的名称空间都应该在 运行 kustomize
命令之前创建。
但是,我知道您希望根据需要动态创建名称空间。
使用 Bash 脚本作为某种包装器绝对有助于这种方法,但我不确定你是否想使用它。
下面,我将向您展示它是如何工作的,您可以选择它是否适合您。
首先,我创建了一个需要两个参数的 kustomize-wrapper
脚本:
- 您要使用的命名空间的名称。
- 包含
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-a1
和 app-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