5

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

 3 years ago
source link: https://segmentfault.com/a/1190000040019391
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

最近朋友接了一个外包,这家外包公司用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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK