前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊如何将gitlab ci的环境变量透传给k8s deployment.yaml

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

作者头像
lyb-geek
发布2022-01-07 09:41:08
2.1K0
发布2022-01-07 09:41:08
举报
文章被收录于专栏:Linyb极客之路Linyb极客之路

01

前言

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

02

前置知识

01

如何用gitlab来做cicd

可以查看官网链接,如下

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

02

envsubst命令了解

a、envsubst的作用

这个命令可以把环境变量传递给文件,并实现文件的变量替换,要替换的变量格式 {var}或 var

b、envsubst如何使用

  • 替换环境变量stdin输出到stdout:
代码语言:javascript
复制
echo '{{$HOME}}' | envsubst
  • 将输入文件中的环境变量替换为stdout:
代码语言:javascript
复制
envsubst < {{path/to/input_file}}
  • 将输入文件中的环境变量替换为文件,并将其输出到文件中:
代码语言:javascript
复制
envsubst < {{path/to/input_file}} > {{path/to/output_file}}
  • 用空格分隔的列表,替换输入文件中的环境变量:
代码语言:javascript
复制
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有个镜像内容形如下

代码语言:javascript
复制
image: $DEPLOY_PROCJECT_IMAGE

我们可以执行如下命令

代码语言:javascript
复制
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通过触发部署服务的触发器进行部署,示例只列和本文相关的内容,其他配置信息做了清理

01

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

代码语言:javascript
复制
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

其中

代码语言:javascript
复制
variables[DEPLOY_PROCJECT_IMAGE]=$REGISTRY/$IMAGE:dev

就是环境变量

02

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

代码语言:javascript
复制
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

03

deployment.yml示例

代码语言:javascript
复制
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"

03

总结

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linyb极客之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档