Kubernetes CI/CD方案:Jenkins+Docker+Git+Maven+Harbor

  • A+
所属分类:Kubernetes

随着容器技术的兴起,一种新型的软件分发方式随即引爆了软件行业,而 Kubernetes 的崛起,更是为容器技术的大规模应用提供了坚实的技术支撑。大部分应用都会陆续迁移到容器云环境内。在此背景下,DevOps 基础组件、应用团队开发的应用以及应用所依赖的中间件都会共存于容器云环境内,此时如何充分利用容器云的优势,构建灵活的 Jenkins 集群就成为一个迫切需要解决的问题。此外,从物理机、虚拟机环境迁移到容器云环境下,如何基于纯容器云环境实施 DevOps 实践也变成一种挑战。Jenkins 作为主流的 CI/CD 软件,伴随开发人员从物理机、虚拟机时代走进了容器化时代,随之而来的调整即是 Jenkins 集群也以容器化形式呈现出来。

参考文档:

https://www.ibm.com/developerworks/cn/devops/d-based-ibm-cloud-private/index.html?ca=drs-&utm_source=tuicool&utm_medium=referral

工作流程

本文基于Jenkins+Docker+Git+Maven+Harbor,实现Kubernetes的自动化CI/CD流水线实战(企业DevOps项目)

Jenkins拉取Git代码/Maven编译/本地docker打包镜像--->推送到镜像仓库 Harbor--->调用Kubernetes模版部署到测试环境

Kubernetes CI/CD方案:Jenkins+Docker+Git+Maven+Harbor

传统互联网架构DevOps实施流程

Kubernetes CI/CD方案:Jenkins+Docker+Git+Maven+Harbor

IBM Kubernetes DevOps实施流程

Kubernetes CI/CD方案:Jenkins+Docker+Git+Maven+Harbor

基础环境准备

Jenkins&Git&Maven&Harbor部署本文不做介绍,可以查阅历史文章。

Harbor根据Kubernetes不同的命名空间创建仓库;

Jenkins配置

创建一个maven项目,配置git拉取代码,如果需要可以定义触发器,检测到代码push自动构建

Kubernetes CI/CD方案:Jenkins+Docker+Git+Maven+Harbor

Kubernetes CI/CD方案:Jenkins+Docker+Git+Maven+Harbor

Kubernetes CI/CD方案:Jenkins+Docker+Git+Maven+Harbor

#构建目录(Jenkin 项目目录:/var/lib/jenkins/workspace/fadmin-ad)
builddir="."
#项目的名字(fadmin-ad)
proj="fadmin-ad"
#java运行环境
javaenv="test"
#k8s命名空间
space="kaifa"
#Harbor镜像仓库密码
password=$(cat /build/dockerpass)
#时间标签
tag=`date +"%Y%m%d_%H%M%S"`

#--------------------------------------------
#登陆Harbor仓库
sudo docker login 192.168.0.209 -uadmin -p"$password"
#拷贝Dockerfile文件
cp /build/Dockerfile $builddir/
#拷贝k8s模版文件
cp /build/moban.yaml .

#--------------------------------------------
#替换模版文件配置
sed -i "s/kongjian/$space/g" moban.yaml
sed -i "s/log-pvc/k8s-logs/g" moban.yaml
sed -i "s/projname/$proj/g" moban.yaml
sed -i "s/tag/$tag/g" moban.yaml

#--------------------------------------------
#过滤jar包
jar=$(ls $builddir/target/|grep jar|grep -v jar.)
#本地执行构建(-t标签 --build-arg设置变量 -f指定dockerfile文件)
sudo docker build -t 192.168.0.209/$space/$proj --build-arg JAVA_ENV=$javaenv  --build-arg JAVA_APP=$app --build-arg JAVA_JAR=$jar  -f ./Dockerfile $builddir/

#创建时间戳tag
sudo docker tag 192.168.0.209/$space/$proj 192.168.0.209/$space/$proj:$tag
#上传harbor仓库
sudo docker push 192.168.0.209/$space/$proj
sudo docker push 192.168.0.209/$space/$proj:$tag
#删除本地镜像
sudo docker rmi  192.168.0.209/$space/$proj:$tag
sudo docker rmi  192.168.0.209/$space/$proj

发送本地文件到k8s-master服务器,执行kubectl apply -f moban.yaml部署

Kubernetes CI/CD方案:Jenkins+Docker+Git+Maven+Harbor

创建dockerfile

Kubernetes CI/CD方案:Jenkins+Docker+Git+Maven+HarborDockerfile&moban.yaml.zip

[root@jenkins build]# cat /build/Dockerfile 
FROM 192.168.0.209/kaifa/java7
ARG JAVA_JAR
ARG JAVA_APP
ARG JAVA_ENV
ENV JAVA_APP ${JAVA_APP}
ENV JAVA_ENV ${JAVA_ENV}
COPY ./target/$JAVA_JAR /app.jar
EXPOSE 80
ENTRYPOINT ["/run.sh"]

注意:

ARG 用户传递参数,必须和docker build个数相等,否则报错;

ENV 用户定义环境变量,不能在cmd使用,只能用于后续命令(run.sh)

修改基础镜像

#仓库下载镜像
docker push 192.168.0.209/kaifa/java7

#运行容器
docker run -it  --name test 192.168.0.209/kaifa/java7 bash

进入容器修改配置

[root@jenkins build]# docker exec -it test bash
[root@670845c2554a jdk1.8.0_91]# cat /run.sh 
#!/bin/sh
#if [ "$JAVA_ENV" == "test" ]
#   then
   exec java  -Duser.timezone=Aisa/Shanghai -Xms1024m -Xmx1024m -Xmn350m -XX:+PrintGCDetails -jar /app.jar --spring.profiles.active=${JAVA_ENV}
#else
#  exec java  -Duser.timezone=Aisa/Shanghai -Xms2048m -Xmx2048m  -javaagent:/pinpoint/pinpoint-bootstrap-1.8.0.jar -Dpinpoint.agentId=${JAVA_APP} -Dpinpoint.applicationName=${JAVA_APP} -jar /app.jar --spring.profiles.active=${JAVA_ENV}
#fi

仓库提交镜像&删除本地容器、镜像

docker tag test 192.168.0.209/kaifa/java7
docker commit test 192.168.0.209/kaifa/java7
docker push 192.168.0.209/kaifa/java7
docker rm test
docker rmi 192.168.0.209/kaifa/java7

创建moban.yaml

[root@jenkins build]# cat moban.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: projname
  namespace: kongjian
spec:
  replicas: 1
  template:
    metadata:
     labels:
       name: projname
    spec:
     containers:
     - name: projname
       image: 192.168.0.209/kongjian/projname:tag
       tty: true
       ports:
       - containerPort: 80
       resources:
         limits:
           cpu: 0.8
           memory: 1400Mi
         requests:
           cpu: 0.7
           memory: 1300Mi
       volumeMounts:
       - name: accesslogs
         mountPath: /data/logs
       env:
        - name: aliyun_logs_projname
          value: "stdout"                     
        - name: aliyun_logs_projname
          value: "/data/logs/projname.log"        
     volumes:
      - name: accesslogs
        persistentVolumeClaim:
         claimName: log-pvc
     imagePullSecrets:
     - name: kaifa-secret
---
apiVersion: v1
kind: Service
metadata:
  name: projname
  namespace: kongjian
spec:
  ports:
    - port: 80
  selector:
    name: projname

配置kubernetes secrets拉取私有仓库镜像

https://www.cnblogs.com/cheyunhua/p/9968985.html

Jenkins执行控制台输出

控制台输出
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[dj-fadmin-ad] $ /bin/sh -xe /tmp/jenkins6600549646813704468.sh
+ builddir=.
+ proj=fadmin-ad
+ javaenv=test
++ cat /build/dockerpass
+ password=Harbor12345
++ date +%Y%m%d_%H%M%S
+ tag=20190215_160225
+ space=kaifa
+ sudo docker login 192.168.0.209 -uadmin -pHarbor12345
Login Succeeded
+ cp /build/Dockerfile ./
+ cp /build/moban.yaml .
+ sed -i s/kongjian/kaifa/g moban.yaml
+ sed -i s/log-pvc/k8s-logs/g moban.yaml
+ sed -i s/projname/fadmin-ad/g moban.yaml
+ sed -i s/tag/20190215_160225/g moban.yaml
++ ls ./target/
++ grep jar
++ grep -v jar.
+ jar=fadmin-ad-0.0.1-SNAPSHOT.jar
+ sudo docker build -t 192.168.0.209/kaifa/fadmin-ad --build-arg JAVA_ENV=test --build-arg JAVA_APP= --build-arg JAVA_JAR=fadmin-ad-0.0.1-SNAPSHOT.jar ./
Sending build context to Docker daemon 89.19 MB

Step 1/9 : FROM 192.168.0.209/kaifa/java8
 ---> 25233f52270d
Step 2/9 : ARG JAVA_JAR
 ---> Using cache
 ---> 4ecab6ea2569
Step 3/9 : ARG JAVA_APP
 ---> Using cache
 ---> f404d8185135
Step 4/9 : ARG JAVA_ENV
 ---> Using cache
 ---> c68714fa9c75
Step 5/9 : ENV JAVA_APP ${JAVA_APP}
 ---> Using cache
 ---> d1c4e58fa7ab
Step 6/9 : ENV JAVA_ENV ${JAVA_ENV}
 ---> Using cache
 ---> 2cbff462638f
Step 7/9 : COPY ./target/$JAVA_JAR /app.jar
 ---> 5b0e8f31a0b7
Removing intermediate container e5c76e6c2dea
Step 8/9 : EXPOSE 80
 ---> Running in fe3d22b430a8
 ---> eca75fa47c0f
Removing intermediate container fe3d22b430a8
Step 9/9 : ENTRYPOINT /run.sh
 ---> Running in 57d5fb69a547
 ---> 801f53bdea29
Removing intermediate container 57d5fb69a547
Successfully built 801f53bdea29
+ sudo docker tag 192.168.0.209/kaifa/fadmin-ad 192.168.0.209/kaifa/fadmin-ad:20190215_160225
+ sudo docker push 192.168.0.209/kaifa/fadmin-ad
The push refers to a repository [192.168.0.209/kaifa/fadmin-ad]
83d079ad6e25: Preparing
b56f0e3af89f: Layer already exists
cf1dbe80140b: Layer already exists
4c87ff887216: Layer already exists
c5a820a680cd: Layer already exists
4fa0ed78e172: Mounted from kaifa/fwords
20190215_160225: digest: sha256:c930060b42efe593a5d4bbe4c1ad22ad34ad4d2f301113e3dbf4d4f33e4d6d08 size: 6348
+ sudo docker rmi 192.168.0.209/kaifa/fadmin-ad:20190215_160225
Untagged: 192.168.0.209/kaifa/fadmin-ad:20190215_160225
+ sudo docker rmi 192.168.0.209/kaifa/fadmin-ad
Untagged: 192.168.0.209/kaifa/fadmin-ad:latest
Untagged: 192.168.0.209/kaifa/fadmin-ad@sha256:c930060b42efe593a5d4bbe4c1ad22ad34ad4d2f301113e3dbf4d4f33e4d6d08
Deleted: sha256:801f53bdea29a834b3609dad97523539a9ef58c3839c99c3b395ddf1c0e74d29
Deleted: sha256:eca75fa47c0f11ceae29dad10f1f6c453fcd6342fe4c072b5ee0b4f5bdbccda1
Deleted: sha256:5b0e8f31a0b7c4c724a91ea8694281d437a6c421e6c469415a154e1dcba51816
Deleted: sha256:59a80aaf98d4868fc4c22cbc2307c78f9de8aa102947a5275320ba24e4164665
SSH: Connecting from host [jenkins]
SSH: Connecting with configuration [k8s-master] ...
SSH: EXEC: STDOUT/STDERR from command [kubectl apply -f moban.yaml] ...
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
deployment.extensions/fadmin-ad configured
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
service/fadmin-ad configured
SSH: EXEC: completed after 200 ms
SSH: Disconnecting configuration [k8s-master] ...
SSH: Transferred 1 file(s)
Finished: SUCCESS

阿里云Kubernetes DevOps实战

1、开发Gitlab进行代码修改时,会触发Jenkins自动构建,并将新的镜像推送至阿里云registry;

2、建议将项目的master分支设置成latest的镜像版本。这样当您希望使用这个仓库镜像时,可以直接使用reigstry.aliyuncs.com/**/dockertest,无需指定Tag则为latest版本,默认使用稳定的master分支构建稳定的latest镜像版本;

3、阿里云Kubernetes绑定容器服务触发器,登录容器服务管理控制台,单击左侧导航栏中的应用,选择应用的集群,找到刚才创建的应用进入应用详情页面,单击创建触发器,创建一个重新部署类型的触发器,并拷贝触发器URL;

4、回到阿里云registry,在webhook处,新建一个webHook,并填入触发器URL

开发Git修改代码后,会实现容器镜像的自动构建,之后自动触发容器服务上对应应用的重新部署。

YaLei

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: