【问题标题】:Kustomize - Create multi and single deployment using same namespaceKustomize - 使用相同的命名空间创建多个和单个部署
【发布时间】:2021-07-12 20:48:33
【问题描述】:

自定义目录结构

├── 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 best practices。关于命名空间最重要的部分:1. Create separate component bases for resources that are intended to be deployed in different namespaces.2. Create one live overlay per namespace. Do not set the namespace directly in resources or patches. Set the namespace with the namespace transformer.
  • @matt_j 首先非常感谢您提供的链接 :) 非常有帮助 1. 为了这个问题,我们假设我只有一个命名空间,我想多次部署同一个应用程序不同的部署名称。同时能够一次性部署所有应用程序或仅使用 kustomize 构建命令部署单个应用程序(将在 GitHub Actions 中使用它)。

标签: kubernetes kustomize


【解决方案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

【讨论】:

  • 现在我很清楚,仅使用 kustomize 并单独创建命名空间是不可能的,因为您建议在这种情况下是最理想的解决方案。感谢您抽出宝贵时间! @matt_j :)
猜你喜欢
  • 2019-12-26
  • 2013-08-14
  • 1970-01-01
  • 2021-09-14
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
相关资源
最近更新 更多