k8s + jenkins + gitlab + harbor 应用实战

一、概述
maven项目部署流程图如下:

 k8s + jenkins + gitlab + harbor 应用实战_第1张图片

 

 

 

 

 

 

环境介绍
操作系统 ip 角色 版本
ubuntu-16.04.4-server-amd64 192.168.10.122 Jenkins+harbor Jenkins 2.176.2,harbor 1.8.1
ubuntu-16.04.4-server-amd64 192.168.10.134 gitlab gitlab-ce_12.1.4
ubuntu-16.04.4-server-amd64 192.168.10.130 k8s master kubernetes 1.15.2
ubuntu-16.04.4-server-amd64 192.168.10.131 k8s node kubernetes 1.15.2
 

二、gitlab创建maven项目
 首先从github上面,找一个基于maven的项目,地址如下:

https://github.com/solochen84/SpringBootDemo

使用git客户端,下载此项目代码

 

创建项目
登录gitlab,创建一个项目springbootdemo

 k8s + jenkins + gitlab + harbor 应用实战_第2张图片

 

 

 

 

 

点击 设置--> 成员

 

 k8s + jenkins + gitlab + harbor 应用实战_第3张图片

 

 

 

 

添加2个成员,一个是jenkins用户,用来拉取代码的。一个是我,用来提交代码的。

注意:我的账号,权限要高一些,可以直接提交到master分支。

 k8s + jenkins + gitlab + harbor 应用实战_第4张图片

 

 

 

 

将github下载的代码,提交到刚刚创建的项目中。效果如下:

 k8s + jenkins + gitlab + harbor 应用实战_第5张图片

 

 

三、harbor 创建用户和项目
创建jenkins用户
登录到harbor后台,点击创建用户

 k8s + jenkins + gitlab + harbor 应用实战_第6张图片

 

 

 

 

注意,每一项都填写一项。尤其是密码,必须符合密码复杂性要求。

 k8s + jenkins + gitlab + harbor 应用实战_第7张图片

 

 

 

创建项目
点击新建项目

 k8s + jenkins + gitlab + harbor 应用实战_第8张图片

 

 

 

 

输入名字,java。这就是私有项目。

 k8s + jenkins + gitlab + harbor 应用实战_第9张图片

 

 

 

 点击java

 k8s + jenkins + gitlab + harbor 应用实战_第10张图片

 

 

 

 

点击成员-->用户

 k8s + jenkins + gitlab + harbor 应用实战_第11张图片

 

 

 

 

输入jenkins,会有提示的。角色选择 开发人员。

k8s + jenkins + gitlab + harbor 应用实战_第12张图片

 

 

 

 

四、jenkins修改默认用户
使用jenkins执行shell命令时,可能会出现权限不足的情况。

查看jenkins默认用户
cat /etc/default/jenkins
内容如下:

# pulled in from the init script; makes things easier.
NAME=jenkins

# arguments to pass to java

# Allow graphs etc. to work even when an X server is present
JAVA_ARGS="-Djava.awt.headless=true"

#JAVA_ARGS="-Xmx256m"

# make jenkins listen on IPv4 address
#JAVA_ARGS="-Djava.net.preferIPv4Stack=true"

PIDFILE=/var/run/$NAME/$NAME.pid

# user and group to be invoked as (default to jenkins)
JENKINS_USER=$NAME
JENKINS_GROUP=$NAME
...
可以发现JENKINS_USER和JENKINS_GROUP变量的值是jenkins

 

修改默认用户为root
将下面2个变量,修改为root

JENKINS_USER=root
JENKINS_GROUP=root
 

重启jenkins服务
service jenkins restart
 

五、jenkins和k8s master做ssh免密
为什么要和k8s master做ssh免密呢?因为jenkins需要登录到k8s master,做一些pod操作。

生成秘钥
登录到jenkins服务器,生成秘钥

ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
 

copy秘钥
ssh-copy-id 192.168.10.130
 

测试root免密

ssh 192.168.10.130
如果没有提示输入密码,说明成功了!

 

六、jenkins登录harbor
修改docker配置文件,添加harbor地址

vim /etc/docker/daemon.json
内容如下:

{"insecure-registries": ["192.168.10.122"]}
 

重新加载docker配置

/etc/init.d/docker reload
 

测试登录

root@ubuntu:~/docker_dir# docker login 192.168.10.122 -u jenkins -p Jenkins@1234
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
 

如果出现

Error response from daemon: Get https://192.168.10.122/v2/: dial tcp 192.168.10.122:443: connect: connection refused
表示 /etc/docker/daemon.json 文件修改不正确
 

 

七、jenkins创建maven项目
新建任务
登录到jenkins后台,点击 新建Item

输入名称,选择构建一个maven项目

 k8s + jenkins + gitlab + harbor 应用实战_第13张图片

 

 

 

设置参数化构建
丢弃旧的构建,保留2天

 k8s + jenkins + gitlab + harbor 应用实战_第14张图片

 

 

 

 

设置源代码
输入仓库下载地址,选择用户root

 k8s + jenkins + gitlab + harbor 应用实战_第15张图片

 

 

 

 

设置maven构建命令
输入命令:clean package

 k8s + jenkins + gitlab + harbor 应用实战_第16张图片

 

 

 

mvn clean package依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。

package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库

 

jar包打包成docker镜像并推送
执行shell命令
build完成之后,选择执行shell命令

 k8s + jenkins + gitlab + harbor 应用实战_第17张图片

 

 

 

 

将下面的内容,贴过去

#!/bin/bash

jarName=spring-boot-demo-0.0.1-SNAPSHOT.jar
jarFolder=ph
harborPro=java
projectName=ph

docker_path=${WORKSPACE}

cp ${WORKSPACE}/target/${jarName} ${docker_path}
bash -x /root/docker_dir/deploy_docker.sh ${harborPro} ${projectName} ${docker_path} ${jarName}
内容解释:

jarName jar包的文件名,名字随便

jarFolder jar包的文件夹

harborPro harbor里面的项目,在上面步骤中,创建java私有项目。

projectName 项目名,名字随便

docker_path docker命令的工作目录

 

最后一步,会执行一个shell脚本。下面说到!

 

效果如下:

 k8s + jenkins + gitlab + harbor 应用实战_第18张图片

 

 

 

 

定义shell脚本
登录到jenkins服务器,创建目录

mkdir /root/docker_dir
 

编辑deploy_docker.sh脚本

cd /root/docker_dir/
vim deploy_docker.sh
内容如下:

#!/bin/bash
# maven $workspace $jarname
# ${harborPro} ${projectName} ${docker_path} ${jarName}

set -e
harbor_project=$1
projectName=$2
docker_path=$3
appName=$4

# harbor认证用户
user_name=jenkins
password=Jenkins@1234

# harbor地址以及tag
tag=$(date +%s)
harbor_server=192.168.10.122
server_path=${harbor_server}
taget_image=${projectName}:${tag}
#${BUILD_NUMBER}
echo ${taget_image}

# 登录docker
cd ${docker_path}
sudo docker login ${harbor_server} -u ${user_name} -p ${password}

# 生成镜像并推送到harbor,最后删除本地镜像
sudo docker build --build-arg app=${appName} -t ${taget_image} .
sudo docker tag ${taget_image} ${server_path}/${harbor_project}/${projectName}
echo "The name of image is ${server_path}/${harbor_project}/${projectName}"
sudo docker push ${server_path}/${harbor_project}/${projectName}:latest
sudo docker rmi -f $(docker images|grep ${projectName}|grep ${tag}|awk '{print $3}'|head -n 1)
 

添加执行权限

chmod 755 /root/docker_dir/deploy_docker.sh
 

yaml文件拷贝到k8s master上并运用应用
k8s master 操作
登录到k8s master,创建目录

mkdir kube-conf
 

修改gitlab springbootdemo项目中的kube.yaml,将其重命名为springbootdemo.yaml

修改内容,添加秘钥


apiVersion: v1
kind: Service
metadata:
name: maven-service
spec:
type: NodePort
ports:
- name: maven
port: 8080
nodePort: 31002
targetPort: 8080
protocol: TCP
selector:
app: maven
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: maven-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: maven
spec:
imagePullSecrets:
- name: harborsecret
containers:
- name: maven
image: 192.168.10.122/java/ph:latest
imagePullPolicy: Always
ports:
- containerPort: 8080
env:
- name: key
value: "value"
View Code
 

将springbootdemo.yaml 提交到gitlab

查看内容是否更改

 k8s + jenkins + gitlab + harbor 应用实战_第19张图片

 

 

 

 

k8s 生成imagePullSecrets,请参考以下链接

https://www.cnblogs.com/xiao987334176/p/11434326.html

注意:使用docker登录用户时,指定jenkins

docker login 192.168.10.122 -u jenkins -p Jenkins@1234
 

jenkins操作
添加执行shell命令

 k8s + jenkins + gitlab + harbor 应用实战_第20张图片

 

 

 

 

 

 将下面的内容,贴过去

#!/bin/bash

set -e
echo ok
echo ${WORKSPACE}
k8sMaster=192.168.10.130
scp ${WORKSPACE}/*.yaml ${k8sMaster}:/root/kube-conf
ssh ${k8sMaster} 'kubectl apply -f /root/kube-conf/springbootdemo.yaml'
ssh ${k8sMaster} 'cd /root/kube-conf && kubectl delete -f springbootdemo.yaml && kubectl apply -f springbootdemo.yaml'
ssh ${k8sMaster} 'kubectl get svc|grep maven'
 

命令解释:

这里主要就是将项目下的yaml文件复制到k8s master /root/kube-conf 目录

并应用yaml文件,最后查看svc信息。

 

效果如下:

 k8s + jenkins + gitlab + harbor 应用实战_第21张图片

 

 

 

 

 

手动构建应用
点击Build Now

 k8s + jenkins + gitlab + harbor 应用实战_第22张图片

 

 

 

 

 

点击#1

 k8s + jenkins + gitlab + harbor 应用实战_第23张图片

 

 

 

 

 

点击控制台输出

 k8s + jenkins + gitlab + harbor 应用实战_第24张图片

 

 

 

 

 

它会自己下载一些组件,需要等待一段时间。

 k8s + jenkins + gitlab + harbor 应用实战_第25张图片

 

 

 

 

 

出现spring图标,表示应用开始启动构建了。

 k8s + jenkins + gitlab + harbor 应用实战_第26张图片

 

 

 

 

 

最后出现错误

 k8s + jenkins + gitlab + harbor 应用实战_第27张图片

 

 

 

 

 

为啥呢? 查看springbootdemo 的Dockerfile文件,查看第一行

FROM registry-scu.cloudtogo.cn/ubuntu:jdk
需要把 registry-scu.cloudtogo.cn 添加到 /etc/docker/daemon.json中

 

登录到jenkins服务器,修改 /etc/docker/daemon.json

vim /etc/docker/daemon.json
内容如下:

{"insecure-registries": ["192.168.10.122","registry-scu.cloudtogo.cn"]}
 

重新加载docker

/etc/init.d/docker reload
 

再次手动构建一次,点击Build Now

查看构建过程

出现以下提示,说明正在下载镜像 registry-scu.cloudtogo.cn/ubuntu:jdk 

 

 k8s + jenkins + gitlab + harbor 应用实战_第28张图片

 

 

 

 

最后提示执行完成

 k8s + jenkins + gitlab + harbor 应用实战_第29张图片

 

 

 

 

查看harbor仓库
会发现多了一个镜像,这个镜像,就是刚刚构建时,提交的。

 

 k8s + jenkins + gitlab + harbor 应用实战_第30张图片

 

 

 

八、访问k8s 应用
查看Pod状态
root@k8s-master:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
maven-deployment-7bd87867f8-6tlgp 0/1 ImagePullBackOff 0 5m19s 192.168.36.68 k8s-node1
 

发现pod运行在k8s-node1 这台服务器,状态是ImagePullBackOff

 

查看pod详细信息

kubectl describe po maven-deployment-7bd87867f8-6tlgp
输出:

Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 7m15s default-scheduler Successfully assigned default/maven-deployment-7bd87867f8-6tlgp to k8s-node1
Normal Pulling 5m49s (x4 over 7m14s) kubelet, k8s-node1 Pulling image "192.168.10.122/maven:latest"
Warning Failed 5m49s (x4 over 7m14s) kubelet, k8s-node1 Failed to pull image "192.168.10.122/maven:latest": rpc error: code = Unknown desc = Error response from daemon: Get https://192.168.10.122/v2/: dial tcp 192.168.10.122:443: connect: connection refused
Warning Failed 5m49s (x4 over 7m14s) kubelet, k8s-node1 Error: ErrImagePull
Normal BackOff 5m36s (x6 over 7m13s) kubelet, k8s-node1 Back-off pulling image "192.168.10.122/maven:latest"
Warning Failed 2m11s (x20 over 7m13s) kubelet, k8s-node1 Error: ImagePullBackOff
 

出现 

Get https://192.168.10.122/v2/: dial tcp 192.168.10.122:443: connect: connection refused
说明,k8s-node1 这台服务器的 /etc/docker/daemon.json 没有更改

 

登录到k8s-node1 这台服务器,修改文件

vim /etc/docker/daemon.json
内容如下:

{"insecure-registries": ["192.168.10.122"]}
 

重新加载docker

/etc/init.d/docker reload
 

重新加载pod
登录到k8s master服务器,删除pod,重新应用

root@k8s-master:~# cd /root/kube-conf/
root@k8s-master:~/kube-conf# kubectl delete -f springbootdemo.yaml
service "maven-service" deleted
deployment.extensions "maven-deployment" deleted
root@k8s-master:~/kube-conf# kubectl apply -f springbootdemo.yaml
service/maven-service created
deployment.extensions/maven-deployment created
 

再次查看状态

root@k8s-master:~/kube-conf# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
maven-deployment-7bd7475544-q9b6j 1/1 Running 0 27s 192.168.36.77 k8s-node1
发现处于Running状态了

 

访问应用页面
查看svc暴露的端口

root@k8s-master:~/kube-conf# kubectl get svc|grep maven
maven-service NodePort 10.98.152.31 8080:31002/TCP 4m
可以发现,暴露的端口是31002

 

使用谷歌访问页面

http://192.168.10.130:31002/
 

效果如下:

 

 

 

 

使用k8s-node1 的ip

http://192.168.10.131:31002/
效果同上!

 

九、更新应用代码
打开本地的项目springbootdemo,修改文件IndexController.java

路径如下:

springbootdemo\src\main\java\com\example\demo\web\controller
 

修改下面2行内容,把数字加1

jsonObject.put("welcome2", "2");
jsonObject.put("welcome7", "7");
 

重新提交到gitlab,然后重新构建一次,点击Build Now

等待构建成功后,刷新页面

 

 

 

 

 发现内容已经更新了!

你可能感兴趣的:(Jenkins,Harbor,K8S)