关于kubernetes:聊聊如何将gitlab-ci的环境变量透传给k8s-deploymentyaml

24次阅读

共计 2831 个字符,预计需要花费 8 分钟才能阅读完成。

前言

最近敌人接了一个外包,这家外包公司用 gitlab 来做 cicd,敌人之前自动化部署基本上都是利用 jenkins,没接触过过 gitlab 的 cicd,敌人他对技术也是比拟有谋求,他发现这家公司 k8s 的 yaml 文件,很多字段其实能够抽出来,配合 cicd 动静传入,而不是把那些字段间接写死在 yaml 文件,比方 docker 镜像。刚好我之前也玩过一阵子基于 gitlab 的 cicd,他就问我有没有什么思路,于是就有了本篇的写文素材

前置常识

1、如何用 gitlab 来做 cicd

能够查看官网链接,如下

https://docs.gitlab.com/ee/ci/README.html

2、envsubst 命令理解

a、envsubst 的作用

这个命令能够把环境变量传递给文件,并实现文件的变量替换,要替换的变量格局 $ {var} 或 $ var

b、envsubst 如何应用

  • 替换环境变量 stdin 输入到 stdout:
echo '{{$HOME}}' | envsubst
  • 将输出文件中的环境变量替换为 stdout:
envsubst < {{path/to/input_file}}
  • 将输出文件中的环境变量替换为文件,并将其输入到文件中:

    envsubst < {{path/to/input_file}} > {{path/to/output_file}}
  • 用空格分隔的列表,替换输出文件中的环境变量:
envsubst '{{$USER $SHELL $HOME}}' < {{path/to/input_file}}

上述命令内容来自如下博文,因为命令没有几行,我就也贴了上来

https://blog.csdn.net/oopxiajun2011/article/details/111668011

注: 在 mac 上,须要装置 gettext,能力应用 envsubst

c、如何利用 envsubst 替换 k8s deployment.yaml

假如 deployment.yaml 有个镜像内容形如下

image: $DEPLOY_PROCJECT_IMAGE

咱们能够执行如下命令

 envsubst < deployment.yml | kubectl apply -f -

这行命令的意思就是读取 deployment.yml,并通过 envsubst 把 deployment.yml 中的 $DEPLOY_PROCJECT_IMAGE 替换成相应的环境变量,并通过管道,把 deployment.yml 的内容传递给 kubectl

如何将 gitlab ci 的环境变量透传给 k8s deployment.yaml

示例:

注: 敌人的公司采纳业务服务和部署服务.gitlab-ci.yml 隔离,业务服务.gitlab-ci.yml 通过触发部署服务的触发器进行部署,示例只列和本文相干的内容,其余配置信息做了清理

1、业务服务的.gitlab-ci.yml 配置如下

variables:
  REGISTRY: xxx.docker.com
  PROJECTNAME: hello-demo
  IMAGE: demo/hello-demo
  DEPLOY_VERSION: $CI_COMMIT_TIMESTAMP


stages:
  - triggerDeploy


triggerDeployK8S:
  stage: triggerDeploy
  image: $REGISTRY/devops/busyboxplus:curl
  script:
    - curl -X POST -F token=fc4754200aa027baedf97cf7d45a02 -F ref=master -F "variables[DEPLOY_PROJECT_NAME]=$PROJECTNAME" -F "variables[DEPLOY_PROCJECT_IMAGE]=$REGISTRY/$IMAGE:dev" -F "variables[DEPLOY_VERSION]=$DEPLOY_VERSION" http://xxx.gitlab.com/api/v4/projects/32/trigger/pipeline
  only:
    - dev
  tags:
    - dev

其中

variables[DEPLOY_PROCJECT_IMAGE]=$REGISTRY/$IMAGE:dev

就是环境变量

2、部署服务的.gitlab-ci.yml 配置如下

stages:
  - deploy
deploy:
  stage: deploy
  script:
    - echo $DEPLOY_PROJECT_NAME
    - echo $DEPLOY_PROCJECT_IMAGE
    - echo $DEPLOY_VERSION
    - cd ${DEPLOY_PROJECT_NAME}
    - envsubst < deployment.yml | kubectl apply -f 
  only:
    - triggers
  tags:
    - dev-deploy

3、deployment.yml 示例

apiVersion: v1
kind: Service
metadata:
  namespace: dev
  name: hello-demo
spec:
  selector:
    app: hello-demo
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      nodePort: 30011
  type: NodePort
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800

---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: dev
  name: hello-demo
  labels:
    app: hello-demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-demo
  template:
    metadata:
      labels:
        app: hello-demo
    spec:
      imagePullSecrets:
      - name: default-secret
      containers:
      - name: hello-demo
        image: $DEPLOY_PROCJECT_IMAGE
        imagePullPolicy: Always
        ports:
         - containerPort: 8080
        env:
            # k8s 滚动更新 pod,是依据 deployment.yml 的变动来更新,如果代码更新了,然而 deployment.yml 内容没更新,k8s 会认为
            #pod 没有产生变动,因而就不会进行滚动降级。DEPLOY_VERSION 是用来做每次部署动静更新 deployment.yml 内容
          - name: DEPLOY_VERSION
            value: "$DEPLOY_VERSION"
          

总结

貌似也没啥内容总结,就贴个 gitlab ci 内置的 variables 文档作为总结吧,文档内容如下

https://docs.gitlab.com/ce/ci/variables/predefined_variables.html

正文完
 0