如何将 gitlab ci/cd 变量传递给 kubernetes(AKS) deployment.yaml
Posted
技术标签:
【中文标题】如何将 gitlab ci/cd 变量传递给 kubernetes(AKS) deployment.yaml【英文标题】:How to pass gitlab ci/cd variables to kubernetes(AKS) deployment.yaml 【发布时间】:2019-11-04 10:12:56 【问题描述】:我有一个 node.js (express) 项目已签入 gitlab,它正在 Kubernetes 中运行。我知道我们可以在 deploy.yaml 文件中的 Kubernetes(在 Azure 上,aks)中设置环境变量。
如何将 gitlab ci/cd 环境变量传递给 kubernetes(aks)(deployment.yaml 文件)?
【问题讨论】:
【参考方案1】:您可以开发自己的掌舵图。从长远来看,这将得到回报。
其他方法:有一种简单而通用的方法是将$MY_VARIABLE
占位符放入deployment.yaml 文件中。接下来,在管道运行期间,在部署作业中使用envsubst
命令将变量替换为相应的值并部署文件。
示例部署文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-$MY_VARIABLE
labels:
app: nginx
spec:
replicas: 3
(...)
工作示例:
(...)
deploy:
stage: deploy
script:
- envsubst < deployment.yaml > deployment-$CI_JOB_NAME.yaml
- kubectl apply -f deployment-$CI_JOB_NAME.yaml
【讨论】:
【参考方案2】:我将为您提供一个简单的解决方案,它可能是也可能不是“解决方案”。
要执行您想要的操作,您只需在启动部署之前的 cd 期间将您的 gitlab 环境变量添加到密钥中即可。这将允许您在部署中使用 env secret。
如果你想这样做,当你想更新它们以实现幂等性时,你需要考虑如何删除它们。
【讨论】:
这是一种方法。但我希望我们可以在 gitlab 环境变量中指定它并以某种方式访问它们。如果我们以后想更改它们,那将是最好的方法。【参考方案3】:另一种解决方案是将您要部署的东西创建为Helm 图表。这将允许您拥有可以在模板中使用并在安装/升级时覆盖的特定变量(称为值)。
有很多文章介绍了如何设置类似的东西。
这里有一个专门针对 CI/CD 的上下文:https://medium.com/@gajus/the-missing-ci-cd-kubernetes-component-helm-package-manager-1fe002aac680。 另一个专门围绕 GitLab:https://medium.com/@yanick.witschi/automated-kubernetes-deployments-with-gitlab-helm-and-traefik-4e54bec47dcf【讨论】:
这也是一种方式。到目前为止,我没有使用帮助图表。【参考方案4】:为未来的读者。另一种方法是使用模板文件并使用envsubst
从模板生成deployment.yaml
。
模板文件:
# template/deployment.tmpl
---
apiVersion: apps/v1
kind: deployment
metadata:
name: strapi-deployment
namespace: strapi
labels:
app: strapi
# deployment specifications
spec:
replicas: 1
selector:
matchLabels:
app: strapi
serviceName: strapi
# pod specifications
template:
metadata:
labels:
app: strapi
# pod blueprints
spec:
containers:
- name: strapi-container
image: registry.gitlab.com/repo-name/image:$IMAGE_TAG
imagePullPolicy: Always
imagePullSecrets:
- name: gitlab-registry-secret
deploy
舞台在.gitlab-ci.yml
(...)
deploy:
stage: deploy
script:
# deploy resources in k8s cluster
- envsubst < strapi-deployment.tmpl > strapi-deployment.yaml
- kubectl apply -f strapi-deployment.yaml
这里定义image: registry.gitlab.com/repo-name/image:$IMAGE_TAG
,IMAGE_TAG
是在gitlab中定义的环境变量。 envsubst
将通过 strapi-deployment.tmpl
并替换其中定义的任何变量并生成 strapi-deployment.yaml
文件。
【讨论】:
【参考方案5】:sed
命令帮我解决了这个问题:
在 Deployment.yaml 中使用一些占位符,如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
#Other configs bla-bla-bla
spec:
containers:
- name: app
image: my.registry./myapp:<VERSION>
在.gitlab-ci.yml
中使用 sed:
deploy:
stage: deploy
image: kubectl-img
script:
# - kubectl bla-bla-bla whatever you want to do before the apply command
- sed -i "s/<VERSION>/$CI_COMMIT_SHORT_SHA/g" Deployment.yaml
- kubectl apply -f Deployment.yaml
因此生成的Deployment.yaml
将包含CI_COMMIT_SHORT_SHA
值而不是<VERSION>
Source of the solution
【讨论】:
以上是关于如何将 gitlab ci/cd 变量传递给 kubernetes(AKS) deployment.yaml的主要内容,如果未能解决你的问题,请参考以下文章
如何正确设置环境变量 Gitlab CI/CD 和 Docker