自定义目录结构
├── 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
答案 0 :(得分:1)
在您的特定情况下,在最理想的情况下,在运行 kustomize
命令之前应该已经创建了所有必需的命名空间。
但是,我知道您希望根据需要动态创建命名空间。
使用 Bash 脚本作为某种包装器肯定有助于这种方法,但我不确定您是否想使用它。
下面,我将向您展示这是如何工作的,您可以选择它是否适合您。
首先,我创建了一个需要两个参数的 kustomize-wrapper
脚本:
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-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