如何将 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_TAGIMAGE_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 值而不是&lt;VERSION&gt;

Source of the solution

【讨论】:

以上是关于如何将 gitlab ci/cd 变量传递给 kubernetes(AKS) deployment.yaml的主要内容,如果未能解决你的问题,请参考以下文章

如何正确设置环境变量 Gitlab CI/CD 和 Docker

GitLab CI/CD中的常用预设变量

Gitlab CI/CD 自动标记发布

GItLab CI/CD 只为开发分支添加变量

在 Gitlab CI/CD 管道脚本中使用 shell 变量?

如何使用GitLab和Rancher构建CI/CD流水线 – Part 2