Jenkins项目自动上线至kubernetes集群
k8s对接Jenkins
1.jenkins工作流程

1.开发还是一样的写java代码,写好java代码后提交到gitlab仓库中,Jenkins在通过gitlab去拉取这些代码,开发只需要在Jenkins页面上点一下立即构建,就会调用shell命令将代码通过docker build 来构建镜像。
2.dockerfile一般研发同事会写好,如果研发不会写,运维也可以帮忙写,通用是这样的,由运维构建一个只有lnmp的镜像,研发在写dockerfile时from指定lnmp的镜像即可了。
3.构建完docker镜像后会将镜像上传到私有仓库中。
4.一般会在Jenkins服务器远程通过kubectl -s apiserver地址去调用k8s管理命令去启动一个容器,kube-apiserver会调用node节点去私有仓库获取镜像并运行开始工作。
5.如果是全新部署直接使用run命令部署即可,在用expose开放端口,过滤出svc的端口发个邮件提示上线成功。
整个流程就是,开发写代码---将代码上传至gitlab---Jenkins在从gitlab上获取代码并通过shell命令去构建成镜像---将镜像上传至私有仓库---在调用kube-apiserver去调度kubelet创建容器---并上线
2.环境规划
| ip | 服务 | 内存 | 
|---|---|---|
| 192.168.81.210 | kube-apiserver 8080 | 2G | 
| 192.168.81.220 | kube-node | 2G | 
| 192.168.81.230 | jenkins(tomcat+jdk)8080 + kubelet | 2G | 
| 192.168.81.240 | gitlab 8080 | 2G | 
3.安装gitlab
3.1.安装
[root@gitlab ~]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.9.11-ce.0.el7.x86_64.rpm
[root@gitlab ~]# yum localinstall gitlab-ce-11.9.11-ce.0.el7.x86_64.rpm -y
安装成功

3.2.配置gitlab
1.修改配置文件
[root@gitlab ~]# vim /etc/gitlab/gitlab.rb 
external_url 'http://192.168.81.240'		#13行,修改为gitlab的地址
prometheus_monitoring['enable'] = false    #1535行,关闭普罗米修斯监控
2.启动gitlab应用服务
[root@gitlab ~]# gitlab-ctl reconfigure
3.每次开机后这样操作才能恢复应用
[root@gitlab ~]# gitlab-ctl restart
[root@gitlab ~]# gitlab-ctl reconfigure

3.3.访问gitlab
访问http://192.168.81.240/users/sign_in
尽量不要让服务器占用80端口
第一次访问需要创建用户,这里账号是root,密码admin123


3.4.修改gitlab nginx端口号
1)修改gitlab.rb
nginx['listen_port'] = 88			#1011行增加
2)修改nginx端口
[root@gitlab ~]# vim /var/opt/gitlab/nginx/conf/gitlab-http.conf 
  listen *:88;
  
3)重启
先重启gitlab,在重载gitlab配置
[root@gitlab ~]# gitlab-ctl restart
[root@gitlab ~]# gitlab-ctl reconfigure
4)访问
http://192.168.81.240:88/

4.gitlab上传代码
4.1.新建一个项目
1)点击create a project

2)填写信息并创建
 
3)创建完成
刚创建完成的项目下面没有代码是这个样子的

4.2.删除一个project
1)点击settings—general
 
2)点击advance—expand
 
3)点击remove project

4.3.上传代码
1)上传源码
[root@gitlab ~]# mkdir /data_web
[root@gitlab ~]# cd /data_web
rz上传源码
[root@gitlab data_web]# unzip know_system.zip 
2)安装git
[root@gitlab data_web]# yum -y install git
[root@gitlab data_web]# cd know_system/
3)git全局设置
[root@gitlab know_system]# git config --global user.name "root"
[root@gitlab know_system]# git config --global user.email "15910468023@163.com"
4)上传代码到gitlab
初始化git
[root@gitlab know_system]# git init
添加一下项目地址
[root@gitlab know_system]# git remote add know_system http://192.168.81.240:88/root/know_system.git
添加一下当前路径的文件
[root@gitlab know_system]# git add .
写一个描述信息
[root@gitlab know_system]# git commit -m "Initial commit knowsystem"
[root@gitlab know_system]# git push -u know_system master

提交成功

4.4.安装docker并编写dockerfile
1)安装
[root@gitlab know_system]# yum -y install docker
[root@gitlab know_system]# vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false 
--registry-mirror=https://registry.docker-cn.com --insecure-registry=192.168.81.240'
[root@gitlab know_system]# systemctl restart docker
[root@gitlab know_system]# docker login 192.168.81.240
Username: admin
Password: 
Login Succeeded
2)编写dockerfile
[root@gitlab know_system]# vim dockerfile
FROM 192.168.81.240/k8s/nginx:1.13
ADD . /usr/share/nginx/html
3)测试一下
[root@gitlab know_system]# docker build -t know_system:v1 .
[root@gitlab know_system]# curl -I 192.168.81.240:8001
HTTP/1.1 200 OK
 
  
4.5.更新gitlab上的代码
更新就是先用add添加一下文件,在加一个注释信息,在推送即可
将刚刚修改的dockerfile上传
[root@gitlab know_system]# git add .
[root@gitlab know_system]# git commit -m "add dockerfile"
[master 0d0c281] add dockerfile
 1 file changed, 2 insertions(+)
 create mode 100644 dockerfile
 
[root@gitlab know_system]# git push -u know_system master
Username for 'http://192.168.81.240:88': root 
Password for 'http://root@192.168.81.240:88': 
Counting objects: 4, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 328 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To http://192.168.81.240:88/root/know_system.git
   1300815..0d0c281  master -> master
分支 master 设置为跟踪来自 know_system 的远程分支 master。
 
  
5.安装Jenkins
5.1.yum安装Jenkins
1)安装
[root@jenkins ~]# wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
Jenkins公钥文件
[root@jenkins ~]# rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
[root@jenkins ~]# yum install java-1.8.0-openjdk -y 
[root@jenkins ~]# yum install jenkins -y
2)修改Jenkins镜像地址,避免页面出现Please wait while Jenkins is getting ready to work ...
[root@jenkins ~]# vim /var/lib/jenkins/hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
  </site>
</sites>
3)启动
[root@jenkins ~]# systemctl start jenkins
[root@jenkins ~]# systemctl enable jenkins
jenkins数据都存放在/var/lib/jenkins/
 
  5.2.tomcat安装Jenkins
1)安装jdk1.8
[root@jenkins ~]# yum install java-1.8.0-openjdk -y 
2)安装tomcat
[root@jenkins ~]# cd soft
[root@jenkins soft]# wget http://down.i4t.com/apache-tomcat-8.5.39.tar.gz
[root@jenkins soft]# mkdir /application
[root@jenkins soft]# tar xf apache-tomcat-8.5.39.tar.gz -C /application/
[root@jenkins soft]# mv /application/apache-tomcat-8.5.39/ /application/jenkins
[root@jenkins soft]# rm –rf /application/jenkins/webapps/* && mkdir –p /application/jenkins/webapps/ROOT
3)下载war包
[root@jenkins soft]# wget http://down.i4t.com/jenkins.war
[root@jenkins soft]# cp jenkins.war /application/jenkins/webapps/ROOT/
[root@jenkins jenkins]# cd /application/jenkins/webapps/ROOT/
[root@jenkins ROOT]# unzip jenkins.war
4)修改Jenkins镜像地址,避免页面出现Please wait while Jenkins is getting ready to work ...
[root@jenkins ~]# vim .jenkins/hudson.model.UpdateCenter.xml 
<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
  </site>
</sites>
5)启动
[root@jenkins jenkins]# ./bin/startup.sh 
 
  启动完成后日志这样输出

5.3.页面配置Jenkins
5.3.1.解锁Jenkins
密码从这个文件中获取
[root@jenkins ~]# vim .jenkins/secrets/initialAdminPassword 4fe7d507415547cdb21176a24b316daa

5.3.2.安装Jenkins
自定义安装
 
安装插件中

如有失败的,安装完成后进入Jenkins后再更新插件

创建用户

实例配置

完成

5.3.3.登录Jenkins
访问http://192.168.81.230:8080/login?from=%2F
用户名密码是刚刚设置的admin/admin
 
  
5.3.4.解决第一次登录空白问题
访问http://192.168.81.230:8080/pluginManager/advanced
点击提交
然后重启tomcat
 
  
6.Jenkins从gitlab拉取代码
大致流程:首先生成一对密钥,将公钥在gitlab上导入,私钥在jenkins新增一个凭证写入私钥,导入后在jenkins新增一个项目,然后填入gitlab项目地址,并关联凭证,点击构建即可拉取代码
6.1.ssh认证免密登录
6.1.1.生成密钥对
生成公私钥 [root@jenkins application]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:uq0yNtNj6IN3E9j2sgC4Qw1IIPDcdfXQ3btNYoMVzw8 root@jenkins The key's randomart image is: +---[RSA 2048]----+ |*. . ..o. ..o | |+o . . . o. oo.| |..o . .oE +| | .o . +oo| |.... o S . ++| |.. .. +. ..| |o ..+.o | | .. X.Bo. | | +.O+*. | +----[SHA256]-----+
6.1.2.在gitlab上添加公钥
进入gitlab点击右上角的图像—setting----ssh keys—将公钥填入—add key
获取公钥并粘贴到gitlab上
[root@jenkins ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC99sW1Sv/bumVPVTGR3BujNK8CdR3AJh8arvNkFlyKo6MCUaFENb8oqSQuB3yrAf2RDjWSL3MQgk0IXTEr5I/1oiXDUrkIKI3wGnx/mhnS1ZDkcCf4eBOJvC/GYIO7jYW88Vr/WHmlseMj0aXfxssBAYD7aEB0QJj/jgNEoFkLgchDqnK+EHGvKGZ2gline93OWDbNcvrdOFfCj3Vb+nyzTjbIhfVjhK+PzB5vHKoMTpfkK0hHyQCJl+mVN6n1DZkq7Ehz1OWwfY2ycayEXfsVKSIiiplf1syk1TD5eLRzsJsj5SF+hSLP4G2HAswWNPHBNRokewArn7CjsiRMEul3 root@jenkins
 
  
6.1.3.在Jenkins上添加凭据(私钥)
获取私钥
[root@jenkins ~]# cat .ssh/id_rsa
 
  1)点击管理詹金斯-----管理凭证

2)点击全局

3)点击添加凭据

4)填写凭据信息—类型选择ssh—写上username(随便起)—enter directly—add

5)将私钥导入


6.2.拉取代码
6.2.1.新建一个item
1)新建item


2)获取gitlab代码地址
通过ssh连接gitlab因此获取gitlab ssh地址

3)配置源码管理

4)设置构建执行的命令


6.2.2.拉取gitlab代码
1)点击项目名即可进入
 
2)立即构建

3)查看构建日志


6.2.3.查看项目在服务器上的存储路径
位于/var/lib/jenkins/workspace/这个目录,这里面会存放gitlab上的代码
 
  
7.jenkins自建docker镜像
7.1.在jenkins上安装docker并配置私有仓库
1)安装docker
[root@jenkins ~]# yum -y install docker
2)配置私有仓库
[root@jenkins ~]# vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false 
--registry-mirror=https://registry.docker-cn.com --insecure-registry=192.168.81.240'
3)重启
[root@jenkins ~]# systemctl restart docker
4)登录私有仓库
[root@jenkins ~]# docker login 192.168.81.240
Username: admin
Password: 
Login Succeeded
 
  7.2.配置构建镜像
只需要修改项目执行的命令就可以了
1)点击配置

2)配置执行的命令
两种方式
1)固定死版本
docker build -t 192.168.81.240/k8s/know_system:v$BUILD_ID .
docker push 192.168.81.240/k8s/know_system:v$BUILD_ID 
点表示dockerfile路径,jenkins从Gitlab上拉取了代码,目前当前项目是在代码路径的
2)使用变量
jenkins有很多变量可以在页面上找
项目不可能一成不变,因此采用变量方式
docker build -t 192.168.81.240/k8s/know_system:v$BUILD_ID .
docker push 192.168.81.240/k8s/know_system:v$BUILD_ID 
 
  主要用到此变量


7.3.jenkins自建镜像
1)点击构建

构建失败会出来雷电的图标

查看输出发现构建成功

2)查看harbor仓库的镜像

3)创建一个看看
1.pull镜像
[root@gitlab harbor]# docker pull 192.168.81.240/k8s/know_system:v5
2.运行镜像
[root@gitlab harbor]# docker run -it -d -p 9999:80 192.168.81.240/k8s/know_system:v5
3.查看容器的地址
[root@gitlab harbor]# docker inspect focused_goodall | less
4.访问页面
[root@gitlab harbor]# curl  -I 172.17.0.2
HTTP/1.1 200 OK
5.拿真机去访问,注意标题一会和升级后的对比
 
  
7.4.升级镜像并运行查看
1)修改页面代码
两种方式:第一种在gitlab服务器修改,然后推送至gitlab,第二种直接在gitlab页面编辑
[root@gitlab know_system]# vim index.html 
<title>知识点目录--update</title>
[root@gitlab know_system]# git add  .
[root@gitlab know_system]# git commit -m "update index"
[root@gitlab know_system]# git push know_system master
真实环境都这么做
 
  在gitlab上找到index.html点击进去点击edit即可编辑,编辑完点击下面的commit


2)拉取代码推送
页面直接点击构建

构建成功v6版

3)pull下来运行并测试
[root@jenkins know_system]# docker pull 192.168.81.240/k8s/know_system:v6
Trying to pull repository 192.168.81.240/k8s/know_system ... 
v6: Pulling from 192.168.81.240/k8s/know_system
Digest: sha256:40861239ba01a79729aa049fa512f24ad39fa354468ec7ca743f9bc8130067fd
[root@jenkins know_system]# docker run -itd -p 8999:80 192.168.81.240/k8s/know_system:v6
db15aa294faa6c172e10bce573ae233a648f6fb8fd37ae111cc87ee233c75e2d
 
  访问页面已经更新,已经和v5版不一样

8.jenkins自动发布
8.1.编写自动发布脚本
首先安装kubectl命令
[root@jenkins ~]# yum -y install kubernetes-client
测试一下
[root@jenkins ~]# kubectl -s 192.168.81.210:8080 get nodes
NAME             STATUS    AGE
192.168.81.220   Ready     23d
脚本内容
#!/bin/bash
image_name=know_system
k8s_name=know-system
harbor_ip=192.168.81.240
harbor_xm=k8s
k8s_master="192.168.81.210:8080"
k8s_node=192.168.81.220
if [ -f /tmp/${image_name}.lock ];then
        docker build -t ${harbor_ip}/${harbor_xm}/${image_name}:v$BUILD_ID .
        docker push ${harbor_ip}/${harbor_xm}/${image_name}:v$BUILD_ID
        kubectl -s $k8s_master set image -n $k8s_name deploy $k8s_name $k8s_name=${harbor_ip}/${harbor_xm}/${image_name}:v$BUILD_ID
        echo "更新成功"
else
        docker build -t ${harbor_ip}/${harbor_xm}/${image_name}:v$BUILD_ID .
        docker push ${harbor_ip}/${harbor_xm}/${image_name}:v$BUILD_ID
        kubectl -s $k8s_master create namespace $k8s_name
        kubectl -s $k8s_master run $k8s_name -n $k8s_name --image=${harbor_ip}/${harbor_xm}/${image_name}:v$BUILD_ID --replicas=3 --record
        kubectl -s  $k8s_master expose -n $k8s_name deployment $k8s_name --port=80 --type=NodePort
        port=`kubectl -s $k8s_master get svc -n $k8s_name | grep -oP '(?<=80:)\d+'`
        echo "你的项目地址是http://${k8s_node}:${port}"
        touch /tmp/${image_name}.lock
fi
 
  8.2.修改项目配置
只需要修改命令为脚本内容即可

8.3.自动构建
8.3.1.第一次构建是run一个
点击立即构建
 
查看日志输出

访问页面内容

查看k8s上创建的资源

8.3.2.第二次构建就是更新
更新代码

点击构建–看日志
 
查看harbor仓库

访问页面,查看是否更新
已更新

8.4.自动回滚
8.4.1.命令回滚
kubectl -s 192.168.81.210:8080 rollout undo -n know-system deployment know-system
8.4.2.jenkins自动回滚
新建一个项目

直接填上回滚命令即可

依旧点击自动构建
点击自动构建—看日志
已成功

查看页面已回滚成功

8.4.3.回滚记录
[root@k8s-master ~]# kubectl rollout history deployment -n know-system 
 
  
9.总结
jenkins自建镜像流程:首先提交代码到gitlab,jenkins服务器生成密钥文件,将公钥导入到gitlab中,在jenkins页面新增一个凭据,将私钥写入,然后在新增一个项目,源码管理选择Git,写入Gitlab ssh地址,并关联好凭据,构建命令写成执行dockerfile的命令并推送到harbor上,保存后点击自动构建即可
jenkins自动发布流程:首先编写一个脚本,如果第一次发布,发布成功后提示一个项目访问地址,往后再发布就提示更新成功,然后将脚本粘贴到项目配置中的执行命令部分即可,然后点击自动构建,会调用k8s去创建deployment资源和svc资源,然后访问应用即可
jenkins回滚流程:新建一个项目将回滚命令粘贴到执行命令方框中,点击自动构建即可回滚
目录 返回
首页