Bootstrap

k8s管理容器 gitlab配合Jenkins 实现持续CI/CD

一、部署Jenkins(建议使用安装版jenkins,docker版的容器里套容器会有问题,且不合理)

1.更新yum源:

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo

2.下载安装包
wget https://pkg.jenkins.io/redhat/jenkins-2.156-1.1.noarch.rpm

3.安装
 rpm -ivh jenkins-2.156-1.1.noarch.rpm

4,修改配置:

vim /etc/sysconfig/jenkins

5,浏览器访问自己配置的端口

此时需要输入密码,具体看浏览器显示的那个路径,去看一下:cat xxx

6.安装插件 所有关于pipleline的插件都需要安装,如果安装有问题的,可以直接跳过,

此时会提醒更新最新版本Jenkins,点更新就好,

此时在这里更新刚刚没有下好的插件

(此时可以试一下该机器是否可以clone代码)

git init git remote add origin ssh://[email protected]:2222/liming/microservice.git git add . git commit -m "Initial commit" git push -u origin master
二、建个流水线的项目:

1.Jenkins中:

配置scm

这里的Jenkinsfile是放在项目中的,Jenkins构建时就会去找该脚本
脚本示范:

// 需要在jenkins的Credentials设置中配置jenkins-harbor-creds、jenkins-k8s-config参数
pipeline {
    agent any
    environment {
        HARBOR_CREDS = credentials('jenkins-harbor-creds')
        K8S_CONFIG = credentials('jenkins-k8s-config')
        GIT_TAG = sh(returnStdout: true,script: 'git describe --tags --always').trim()
    }
    parameters {
        string(name: 'HARBOR_HOST', defaultValue: '仓库ip', description: 'harbor仓库地址')
        string(name: 'DOCKER_IMAGE', defaultValue: 'tssp/pipeline-demo', description: 'docker镜像名')
        string(name: 'APP_NAME', defaultValue: 'pipeline-demo', description: 'k8s中标签名')
        string(name: 'K8S_NAMESPACE', defaultValue: 'demo', description: 'k8s的namespace名称')
    }
    stages {
        stage('Maven Build') {
            when { expression { env.GIT_TAG != null } }
            agent {
                docker {
                    image 'maven:3-jdk-8-alpine'
                    args '-v $HOME/.m2:/root/.m2'
                }
            }
            steps {
                sh 'mvn clean package -Dfile.encoding=UTF-8 -DskipTests=true'
                stash includes: 'target/*.jar', name: 'app'
            }

        }
        stage('Docker Build') {
            when { 
                allOf {
                    expression { env.GIT_TAG != null }
                }
            }
            agent any
            steps {
                unstash 'app'
                sh "docker login -u ${HARBOR_CREDS_USR} -p ${HARBOR_CREDS_PSW} ${params.HARBOR_HOST}"
                sh "docker build --build-arg JAR_FILE=`ls target/*.jar |cut -d '/' -f2` -t ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG} ."
                sh "docker push ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG}"
                sh "docker rmi ${params.HARBOR_HOST}/${params.DOCKER_IMAGE}:${GIT_TAG}"
            }
            
        }
        stage('Deploy') {
            when { 
                allOf {
                    expression { env.GIT_TAG != null }
                }
            }
            agent {
                docker {
                    image 'lwolf/helm-kubectl-docker'
                }
            }
            steps {
                sh "mkdir -p ~/.kube"
                sh "echo ${K8S_CONFIG} | base64 -d > ~/.kube/config"
                sh "sed -e 's#{IMAGE_URL}#${params.HARBOR_HOST}/${params.DOCKER_IMAGE}#g;s#{IMAGE_TAG}#${GIT_TAG}#g;s#{APP_NAME}#${params.APP_NAME}#g;s#{SPRING_PROFILE}#k8s-test#g' k8s-deployment.tpl > k8s-deployment.yml"
                sh "kubectl apply -f k8s-deployment.yml --namespace=${params.K8S_NAMESPACE}"
            }
            
        }
        
    }
}

三、配置git调用Jenkins打包:

1.在Jenkins中配置令牌:

如果没有此功能,这是由于权限问题导致的

注释:跨站请求伪造保护最新Jenkins页面无法开启,在安装目录设置:
vim /etc/sysconfig/jenkins

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"
配置后需要重启jenkins:
service jenkins restart
生效后就如前图所示


2.复制链接到刚刚gitab打开的触发器页面:

此时如果gitlab设置Webhooks报错Urlis blocked: Requests to localhost are not allowed。admin 登录设置

然后再添加完毕:

然后可以测试一下:

返回201,说明成功(注意 JENKINS_URL/job/jobname/build?token=TOKEN_NAME 或者 /buildWithParameters?token=TOKEN_NAME)

此时Jenkins的构建任务也在运行了

四、对刚刚列出的脚本说明:

最好是用安装办maven,案例中使用的maven是docker镜像,想修改setting文件的话有点麻烦

如果使用当机器的maven,此时需要下载Jenkins的maven插件:

全局配置中要配置一下

还有环境变量也要配置一下:

这时才可以在Jenkinsfile中使用mvn命令

3.dockerbuild:

这里步骤中的五句话:

第一句,使用的哪个app包

第二句,登录Harbor

第三句,制作临时镜像 ,此时会使用到dockerfile,可以参考docker的搭建,写一个dockerfile,示范:

FROM openjdk:8-jdk-alpine

#构建参数
ARG JAR_FILE
ARG WORK_PATH="/opt/demo"
# 环境变量
ENV JAVA_OPTS="" \
    JAR_FILE=${JAR_FILE}
# 切换源
RUN sed -i 's/http\:\/\/dl-cdn.alpinelinux.org/https\:\/\/mirrors.ustc.edu.cn/g' /etc/apk/repositories

#设置时区
RUN apk update && apk add ca-certificates && \
    apk add tzdata && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone

COPY target/$JAR_FILE $WORK_PATH/

WORKDIR $WORK_PATH

ENTRYPOINT exec java $JAVA_OPTS -jar $JAR_FILE

示范中的命令:

这个有可能因为网络原因下载失败,此时在他的上一步添加一行切换源就可以了:

RUN sed -i 's/http\:\/\/dl-cdn.alpinelinux.org/https\:\/\/mirrors.ustc.edu.cn/g' /etc/apk/repositories

注意:哪个项目需要发布的,dockerfile就在哪个项目下

第四句,推送镜像

第五句,删除本地临时镜像

4.发布:

这里使用的kubectl镜像命令发布

四句话:

第一句,创建文件夹

第二句 ,寻找下一步使用的config,来验证k8s

第三句,这个项目中有个发布模板,参考k8s搭建中发布模板,这个命令是讲参数写入模板.tpl,生成发布文件yml ,附上tpl示范:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {APP_NAME}-deployment
  labels:
    app: {APP_NAME}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: {APP_NAME}
  template:
    metadata:
      labels:
        app: {APP_NAME}
    spec:
      containers:
      - name: {APP_NAME}
        image: {IMAGE_URL}:{IMAGE_TAG}
        ports:
        - containerPort: 40080
        env:
          - name: SPRING_PROFILES_ACTIVE
            value: {SPRING_PROFILE}

第四句,发布

五、上一步中有登录harbor,此处需要配置密码:

还需要配置k8s的kube.config,示范配置:

apiVersion: v1kind: Configclusters:- name: "test" cluster: server: "https://ip" api-version: v1 certificate-authority-data: "xxxxxx"users:- name: "root" user: token: "你的token"contexts:- name: "test" context: user: "user1" cluster: "test"current-context: "test

然后编码:

base64 kube-config.yml > kube-config.txt
然后类似上一步,在jenkins凭据中增加配置文件内容。在凭据设置界面,类型选择为“Secret text”,ID设置为“jenkins-k8s-config”(此处的ID必须与Jenkinsfile中的保持一致),Secret设置为上面经过base64编码后的配置文件内容。

六、测试任务,立即构建:

成功后可以在镜像仓库中查看到镜像:

可以在k8s面板中看到运行的服务:

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;