kubernetes - 如何使用 gitlab-ci 动态分配命名空间名称?

标签 kubernetes namespaces gitlab gitlab-ci pipeline

一旦我在 Gitlab 中运行管道,我就会尝试创建一个新的命名空间,这个命名空间将具有我推送到它的分支的名称!

那么如何传递命名空间 list 文件可以读取的变量呢?
有没有办法用 gitlab-ci.yml 传递它?

我在想什么的例子:

apiVersion: v1
kind: Namespace
metadata:
  name: $CI_COMMIT_BRANCH

最佳答案

所以这里最好的答案是推荐 Helm因为您实际上是在要求动态 yaml 模板。 Since version 3 Helm 不需要像 Tiller 这样的任何服务器端组件,因此使用起来要容易得多。

但是,如果您不想将所有文件转换为 Helm 模板,还有两种更实用的方法

sed

通过使用 sed您可以在(假设)namespace.yml 中找到/替换 env 变量像这样:

script:
  - sed -i "s/\$CI_COMMIT_BRANCH/$CI_COMMIT_BRANCH/g" namespace.yml
  - kubectl apply -f namespace.yml
-i代表“就地”,如果要保存到新文件或标准输出,请保留它。

envsubst

如果您有多个 yaml 文件并且需要批量查找/替换,请使用 envsubst (gnu gettext 实用程序的一部分)是另一种选择。

它查找文件中的所有环境变量,并将它们替换为当前环境中存在的实际值。这看起来像这样( original answer ):
script:
  - envsubst < "namespace.yml" > "namespace-replaced.yml"
  - kubectl apply -f namespace-replaced.yml

请注意,如相关答案中所述:如果您想对两者使用相同的文件,则必须使用类似 moreutil 的 sponge 之类的文件。 :envsubst < "namespace.yml" | sponge "namespace.yml". (因为 shell 重定向将在读取文件之前清空文件。

最后提示:
  • 请不要在 yaml 文件中定义命名空间(namespace.yml 除外),因为这不是最佳实践。使用 kubectl 来设置目标命名空间:kubectl apply -f deployment.yml --namespace=$CI_COMMIT_BRANCH
  • 不要使用 $CI_COMMIT_BRANCH关于k8s。它是完整的分支名称,可以包含特殊字符和空格。而是使用 $CI_COMMIT_REF_SLUGpredefined CI variable因为这是为其构建项目的分支或标记名称,所以小写,缩短为 63 字节,并且除了 0-9 和 a-z 之外的所有内容都替换为 -。没有前导/尾随 -。在 URL、主机名和域名中使用。
  • 关于kubernetes - 如何使用 gitlab-ci 动态分配命名空间名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61808416/

    相关文章:

    kubernetes - 续订Kubernetes丛集凭证

    kubernetes - GKE |集群不会在任何区域配置

    scala - 为什么方法体中的顶级 val 会影响 Scala 中的方法参数?

    c# - 使用和程序集引用不会从 C# 代码段自动导入

    continuous-integration - Gitlab CI 如何使用规则语法忽略目录?

    kubernetes - 访问prometheus服务器的入口路由规则

    python - Python(pip)未在kubernetes上安装ElasticSearch库

    ruby-on-rails - 是否可以在 RoR 项目的根级别为不同的应用程序保留不同的文件夹

    gitlab - 在 Gitlab CI 中向 Rocket.Chat 推送通知

    ubuntu - 在 gitlab(也可能是 github)中运行 Flutter Web 集成测试 Ubuntu VM 因 Chromedriver 而失败