kubernetes - 如何使用 gitlab-ci 动态分配命名空间名称?
问题描述
一旦我在 Gitlab 中运行管道,我正在尝试创建一个新的命名空间,这个命名空间将具有我推送到它的分支的名称!
那么我如何传递一个命名空间清单文件可以读取的变量呢?有没有办法用 gitlab-ci.yml 传递它?
我在想的例子:
apiVersion: v1
kind: Namespace
metadata:
name: $CI_COMMIT_BRANCH
解决方案
因此,这里最好的答案是推荐Helm,因为您实际上是在要求动态 yaml 模板。由于Helm 的第 3 版,它不需要像 Tiller 这样的任何服务器端组件,因此它更易于使用。
但是,如果您不想将所有文件都转换为 Helm 模板,还有两种更实用的方法
sed
通过使用sed你可以在你的(假设)中找到/替换 env 变量,namespace.yml
如下所示:
script:
- sed -i "s/\$CI_COMMIT_BRANCH/$CI_COMMIT_BRANCH/g" namespace.yml
- kubectl apply -f namespace.yml
代表“-i
就地”,如果要保存到新文件或 STDOUT,请保留它。
envsubst
如果您有多个 yaml 文件并且需要批量查找/替换,则使用envsubst(gnu gettext实用程序的一部分)是另一种选择。
它在文件中查找所有环境变量,并将它们替换为当前环境中存在的实际值。这看起来像这样(原始答案):
script:
- envsubst < "namespace.yml" > "namespace-replaced.yml"
- kubectl apply -f namespace-replaced.yml
请注意,如相关答案中所述:如果您想为两者使用相同的文件,则必须使用类似 moreutil's 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_SLUG
用作预定义的 CI 变量,因为这是为其构建项目的分支或标记名称,小写,缩短为 63 个字节,并且除了 0-9 和 az 以外的所有内容都替换为 -。没有前导/尾随 -。在 URL、主机名和域名中使用。
推荐阅读
- javascript - 倒计时结束后,javascript和HTML中的倒计时页面不会重定向到另一个页面
- javascript - 具有自己的事件侦听器的动态查询选择器
- mysql - 删除 MySQL 表中的相同条目
- java - 如何修复代码中已添加的片段?
- reactjs - React 应用程序部署到 IIS StaticFile 处理程序问题
- python - 如何让 python 应用程序在主机上 24/7 全天候运行?
- python - 将大整数键均匀分布到 N 个桶中
- c++ - 不能在 VS19 中从 'const char*' 转换为 'char*',虽然之前可以
- python - 更改某个角色的频道权限 discord.py
- php - 当前路由的 Laravel 8 前缀