• k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins


    cicd的结合组件

     需要代码仓库如gitlab、github。包构建工具Maven等,持续集成工具如jenkins,github/cicd。结合自己脚本实现重复式任务自动化。

    传统服务发布流程:

     提交代码到仓库使用maven工具构建包,发布到指定服务器上(正式测试等),调用脚本或ansible执行发布。

    传统存在问题:

     传统服务常见的是通过负载均衡器更新单个服务测试好在挂载。需要部署多个环境,重复性操作。通过k8s可以把多个环境放置不同的namespace中,通过yaml文件去指定不同namespace,ingress-controller来控制不同域名。实现分流测试。

     容器部署:

     git提交代码maven构建,然后build镜像,将镜像push到私有库。k8s运行进行健康检查。多个环境只需构建一次即可。有不同环境相关东西,可以写入configmap中挂载进去,比如不同环境连接数据库,不要写死地址,通过环境变量去拿相应的地址。k8s传入需要的环境变量。上线后可以通过service version实现A B版本权重分流测试,或通过controller-ingress进行分流及AB版本测试。

    环境安装:

    宿主机环境安装git、maven、jenksion

    jenkins 官网下载地址:jenkins.io

    下载包后直接后台运行

    nohup java -jar jenkins.war --httpPort=8081 &

    进入jenkins后台

    创建一个新的job

    构建一个流水线pipeline管道

    通过script去构建cicd

     ###通过点击右侧可以出现一个构建基本模板。更多语法可以参考pipeline语法。

    定义Pipoline script

    node {
         env.BUILD_DIR = "/root/build-workspace" #定义build目录
         env.MODULE = "web-demo" #定义当前名称
         env.HOST = "www.cswjh.com" #定义ingress 域名
        stage('Preparation') { // for display purposes
            // Get some code from a GitHub repository
            git 'http://172.17.166.172/root/k8s-web-demo.git' #拷贝代码
        }
        stage('maven build'){//build images
        
            sh "mvn -pl ${MODULE} -am clean package" #构建包
        }
        stage('build images'){//build docker images
           
            sh "/root/script/build-image-web.sh" #执行build 及push脚本
        }
        stage('Deplay'){//kubectl apply
            
            sh "/root/script/deploy.sh" #k8s部署
        }
    
    }  


    build-image-web.sh

    #!/bin/bash
    if [ ${BUILD_DIR} == "" ];then   #判断jenkins 默认定义的变量 build目录是否生效
        echo "env 'BUILD_DIR' is not set"
        exit 1
    fi
    
    DOCKER_DIR=${BUILD_DIR}/${JOB_NAME} #在build目录下创建一个工作目录 工作目录以jenkins默认变量 name命名
    
    echo "${DOCKER_DIR}" #输出当前docker 工作目录
    
    if [ ! -d ${DOCKER_DIR} ];then #判断目录是否存在 不存在则建立
        mkdir -p ${DOCKER_DIR}
    fi
    
    echo "docker workspace: ${DOCKER_DIR}" #docker 工作目录
    
    JENKINS_DIR=${WORKSPACE}/${MODULE} #定义jenksin目录 取jenksin默认变量 jenksion的工作目录下的预定义web-demo目录
    
    echo "jenkins workspace: ${JENKINS_DIR}" #输出目录变量是否生效
    
    if [ ! -f ${JENKINS_DIR}/target/*.war ];then #查看工作目录下 是否存在war包 无war包则退出
        echo "target/*.war not found"       
        exit 1
    fi
    
    cd ${DOCKER_DIR} #跳转docker build 目录
    
    rm -rf * #删除上个构建留下东西
    
    unzip -oq ${JENKINS_DIR}/target/*.war -d ./ROOT #将war包解压到当前文件中 或使用docker 中
    
    mv ${JENKINS_DIR}/Dockerfile .  ##将jenksion web-demo工作目录下的Dockerfile 移动到docker build工作目录中 
    
    if [ -d ${JENKINS_DIR}/dockerfiles ];then #如果存在dockerfiles目录也移动到当前目录中 dockerfiles中包含了启动脚本文件 及前台运行命令
        mv ${JENKINS_DIR}/dockerfiles .
    fi
    
    VERSION=$(date +%Y%m%d%H) #为镜像生成时间序列
    
    IMAGE_NAME=172.17.166.217/kubenetes/${JOB_NAME}:${VERSION} #为镜像命名 以时间序列为版本号
    
    echo "${IMAGE_NAME}" > ${WORKSPACE}/IMAGE #将镜像版本输入一个文件进行存储方便k8s .yaml取到
    
    echo "building image:${IMAGE_NAME}" #输出images 信息
    
    docker build -t ${IMAGE_NAME} .  #构建dockerfile
    
    docker push ${IMAGE_NAME}   #镜像上传到版本库中
    build-image-web.sh

    deploy.sh

    #!/bin/bash
    
    name=${JOB_NAME} #jenkins 当前job名称
    image=$(cat ${WORKSPACE}/IMAGE) #镜像地址及名称
    host=${HOST} #ingress 域名
    
    echo "deploying ... name: ${name} ,image: ${image},host: ${host}" #查看当前变量是否生效
    
    rm -f web.yaml #删除当前目录下web.yaml文件
    
    cp $(dirname "${BASH_SOURCE[0]}")/template/web.yaml ./ #将模板文件导入到当前目录下
    
    sed -i "s,{{name}},${name},g" web.yaml   #替换模板文件中name名称
    sed -i "s,{{image}},${image},g" web.yaml #替换模板文件中image 地址
    sed -i "s,{{host}},${host},g" web.yaml #替换ingress中域名
    
    kubectl apply -f web.yaml #执行kubernetes部署
    
    cat web.yaml #查看文件是否定义成功
    
    #健康检查
    sleep 5
    count=60
    success=0
    IFS="," #转换为数组
    while [ ${count} -gt 0 ]
    do
            replicas=$(kubectl get deployments.apps ${name} -o go-template='{{.status.replicas}},{{.status.updatedReplicas}},{{.status.readyReplicas}},{{.status.availableReplicas}}') #查看当前replicas数值
            echo "replicas: ${replicas}"
            arr=(${replicas})
            if [ "${arr[0]}" == "${arr[1]}" -a "${arr[1]}" == "${arr[2]}" -a "${arr[2]}" == "${arr[3]}" ];then #查看replicas各项数值是否相等
                    echo "health check success"
                    success=1
                    break
            fi
            ((count--))
            sleep
    done
    
    if [ ${success} -ne 1 ];then
            echo "health check failed"
            exit 1
    fi
    deploy.sh
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: {{name}}
    spec:
      selector:
        matchLabels:
          app: {{name}}
      replicas: 4
      template:
        metadata:
          labels:
            app: {{name}}
        spec:
          containers:
          - name: {{name}}
            image: {{image}}
            ports:
            - containerPort: 8080
    ---
    #service
    apiVersion: v1
    kind: Service
    metadata:
      name: {{name}}
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 8080
      selector:
        app: {{name}}
      type: ClusterIP
    
    ---
    #ingress
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: {{name}}
    spec:
      rules:
      - host: {{host}}
        http:
          paths:
          - pathType: Prefix
            path: /
            backend:
              service:
                name: {{name}}
                port:
                  number: 80
    web.yaml

    github安装

    # GitLab Server 的搭建
    
    参考 https://about.gitlab.com/installation
    
    
    ## 1. 准备工作
    
    以Centos7为例,准备一台至少内存为4G的机器。
    
    
    ## 2. 安装依赖软件
    
    
    ```
    sudo yum install -y git vim gcc glibc-static telnet
    sudo yum install -y curl policycoreutils-python openssh-server
    sudo systemctl enable sshd
    sudo systemctl start sshd
    
    sudo yum install postfix
    sudo systemctl enable postfix
    sudo systemctl start postfix
    ```
    
    
    ## 3. 设置gitlab安装源
    
    如果在国内的话,可以尝试使用清华大学的源。
    
    新建 /etc/yum.repos.d/gitlab-ce.repo,内容为
    
    ```
    [gitlab-ce]
    name=Gitlab CE Repository
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
    gpgcheck=0
    enabled=1
    ```
    
    如果在国外的话,可以使用
    
    ```
    curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
    ```
    
    ## 4. 安装GitLab
    
    关于域名,如果要是设置域名,则如下,这个域名可以是真实购买的域名,如果您要把gitlab安装到公网比如阿里云上的话。
    
    如果只是想本地测试,则可以像下面一样,设置一个example的域名,然后记得在本地你的笔记本设置host,如果是MAC就在 /etc/hosts里添加 一行 `192.168.211.10 gitlab.example.com`  
    
    ```
    sudo EXTERNAL_URL="http://gitlab.example.com" yum install -y gitlab-ce
    ```
    
    如果不想设置域名,或者想将来再考虑,可以直接
    
    ```
    sudo yum install -y gitlab-ce
    ```
    
    安装完成以后,运行下面的命令进行配置
    
    ```
    sudo gitlab-ctl reconfigure
    ```
    
    ## 5. 登陆和修改密码
    
    
    打开http://gitlab.example.com/ 修改root用户密码,然后使用root和新密码登陆。
    
    
    ![gitlab](img/gitlab-1.png)
    gitlab-service安装
  • 相关阅读:
    201521123031 《Java程序设计》第14周学习总结
    201521123031 《Java程序设计》第13周学习总结
    软工个人作业5——软件工程总结
    软工网络15个人作业4——alpha阶段个人总结
    软工网络15个人作业3——案例分析
    软件工程网络15结对编程作业
    软工网络15个人阅读作业2——提问题
    软件工程网络15个人阅读作业1(201521123036 曾艺佳)
    Java课程设计
    Java课程设计-学生基本信息管理 201521123036
  • 原文地址:https://www.cnblogs.com/dahuige/p/15035229.html
Copyright © 2020-2023  润新知