• 聊聊如何将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.ymal有个镜像内容形如下

    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

  • 相关阅读:
    [转]Win7 64位操作系统下配置PHP+MySql+Apache环境
    [转]你必须懂的 T4 模板:深入浅出
    [转]C#反射机制介绍
    [转]RDLC报表,纯文字内容,动态数据源 解决方案
    [转]关于C# 中的Attribute 特性
    [转]MVC中如何使用RDLC报表
    [转]关于用netbeans和xdebug调试php的配置
    1308论文相关时间
    [转].net 使用NPOI或MyXls把DataTable导出到Excel
    [转]MySQL安装总结:Start service没有响应(Win7 64位) 服务启动失败 1067 错误
  • 原文地址:https://www.cnblogs.com/linyb-geek/p/14780281.html
Copyright © 2020-2023  润新知