25-Jenkins结合k8s
一、Jenkins的安装
官方教程
https://www.jenkins.io/doc/book/installing/linux/#debianubuntu
1.添加认证信息
[root@jenkins211 ~]# sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
https://pkg.jenkins.io/debian/jenkins.io-2023.key
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc]" \
https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
2.安装依赖包fontconfig
[root@jenkins211 ~]# apt update
[root@jenkins211 ~]# apt install fontconfig
3.安装jdk
[root@jenkins211 ~]# wget https://download.oracle.com/java/17/archive/jdk-17.0.8_linux-x64_bin.tar.gz
[root@jenkins211 ~]# tar xf jdk-17.0.8_linux-x64_bin.tar.gz -C /usr/local/
#编辑环境变量
[root@jenkins211 ~]# cat /etc/profile.d/jdk.sh
#!/bin/bash
export JDK_HOME=/usr/local/jdk-17.0.8
export PATH=$PATH:$JDK_HOME/bin
[root@jenkins211 ~]# source /etc/profile.d/jdk.sh
#测试java环境
[root@jenkins211 ~]# java --version
java 17.0.8 2023-07-18 LTS
Java(TM) SE Runtime Environment (build 17.0.8+9-LTS-211)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.8+9-LTS-211, mixed mode, sharing)
4.安装jenkins
#使用了清华源
[root@jenkins211 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/debian/jenkins_2.479_all.deb
[root@jenkins211 ~]# dpkg -i jenkins_2.479_all.deb
5.修改jenkins的配置文件
[root@jenkins211 ~]# vim /lib/systemd/system/jenkins.service
...
36 #User=jenkins
37 #Group=jenkins
38 User=root
39 Group=root
40
41 # Directory where Jenkins stores its configuration and workspaces
42 Environment="JENKINS_HOME=/var/lib/jenkins"
43 Environment="JAVA_HOME=/usr/local/jdk-17.0.8"
...
6.启动jenkins
[root@jenkins211 ~]# systemctl enable --now jenkins
Synchronizing state of jenkins.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable jenkins
[root@jenkins211 ~]#
[root@jenkins211 ~]# ss -ntl |grep 8080
LISTEN 0 50 *:8080 *:*
7.查看密码并登录初始化
[root@jenkins211 ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
5f062a5790ea46bb9df6bc6866a39543
8.修改登录密码

9.安装常用插件
9.1 查看默认的插件目录
[root@jenkins211 ~]# ll /var/lib/jenkins/plugins/
total 8
drwxr-xr-x 2 root root 4096 Apr 11 09:43 ./
drwxr-xr-x 8 jenkins jenkins 4096 Apr 11 09:43 ../
9.2 安装插件
- 手动安装
参考链接
https://www.cnblogs.com/yinzhengjie/p/18563962
- 使用准备好的打包文件直接导入
10.重启Jenkins服务
[root@jenkins211 ~]# systemctl restart jenkins.service
#也可在web界面重启
http://10.0.0.211:8080/restart
二、模拟开发人员推送代码到仓库
本次使用了gitee作为代码仓库
1.创建仓库


2.模拟开发人员编写代码
随便下载了一个代码做测试
[root@worker233 ~]# mkdir yiliao
#导入代码至此目录
3.开发人员添加git配置
[root@worker233 ~]# git config --global user.name "Dezyan"
[root@worker233 ~]# git config --global user.email "dezyan@163.com"
4.初始化项目
git init
git commit -m "first commit"
5.编写.dockerignore优化
#在harbor仓库中找了一个带有nginx的镜像作为基础镜像,将代码复制到了这个镜像中
[root@worker233 yiliao]# cat Dockerfile
FROM harbor250.oldboyedu.com/oldboyedu-xiuxian/apps:v1
MAINTAINER Jason Yin
LABEL school=imnc
ADD . /usr/share/nginx/html
#忽略掉这个文件,不复制进镜像中
[root@worker233 yiliao]# cat .dockerignore
.git/*
6.添加远程仓库
[root@worker233 yiliao]# git add .
[root@worker233 yiliao]# git commit -m "first commit"
[root@worker233 yiliao]# git remote add origin https://gitee.com/dezyan/test.git
[root@worker233 yiliao]# git push -u origin "master"
输入账户和密码
7.访问仓库查看

三、jenkins从gitee拉取代码并推送到harbor仓库
1.安装docker环境
略
2.拷贝harbor的证书文件
[root@jenkins211 ~]# scp -r 10.0.0.250:/etc/docker/certs.d/ /etc/docker/
3.创建jenkins的项目并配置git


4.添加执行的shell命令
docker login -u admin -p 1 harbor250.oldboyedu.com
docker build -t harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:v1 .
docker push harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:v1
docker logout harbor250.oldboyedu.com
5.开启编译

6.harbor的WebUI验证

四、jenkins参数化构建及响应式更新deploy
先在Jenkins界面立即构建,上传v1版本到harbor仓库
1.响应式创建deploy
[root@master231 ~]# kubectl create deployment yiliao --image=harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:v1 --replicas=3
deployment.apps/yiliao created
#查看
[root@master231 ~]# kubectl get pods -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
yiliao-6ffffb5c6b-2c4hq 1/1 Running 0 3s 10.100.203.146 worker232 <none> <none> app=yiliao,pod-template-hash=6ffffb5c6b
yiliao-6ffffb5c6b-8hbp8 1/1 Running 0 3s 10.100.140.112 worker233 <none> <none> app=yiliao,pod-template-hash=6ffffb5c6b
yiliao-6ffffb5c6b-rpd52 1/1 Running 0 3s 10.100.140.113 worker233 <none> <none> app=yiliao,pod-template-hash=6ffffb5c6b
[root@master231 ~]# kubectl get deploy,rs,pods -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/yiliao 3/3 3 3 33s linux96 harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:v1 app=yiliao
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/yiliao-6ffffb5c6b 3 3 3 33s linux96 harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:v1 app=yiliao,pod-template-hash=6ffffb5c6b
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/yiliao-6ffffb5c6b-2c4hq 1/1 Running 0 33s 10.100.203.146 worker232 <none> <none>
pod/yiliao-6ffffb5c6b-8hbp8 1/1 Running 0 33s 10.100.140.112 worker233 <none> <none>
pod/yiliao-6ffffb5c6b-rpd52 1/1 Running 0 33s 10.100.140.113 worker233 <none> <none>
2.响应式创建svc
[root@master231 ~]# kubectl expose deployment yiliao --port=80 --type=LoadBalancer
service/yiliao exposed
[root@master231 ~]# kubectl get svc yiliao
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
yiliao LoadBalancer 10.200.137.184 10.0.0.152 80:6150/TCP 8sxxxxxxxxxx5 1[root@master231 ~]# kubectl expose deployment yiliao --port=80 --type=LoadBalancer2service/yiliao exposed3[root@master231 ~]# kubectl get svc yiliao4NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE5yiliao LoadBalancer 10.200.137.184 10.0.0.152 80:6150/TCP 8s[root@master231 jenkins]# kubectl expose deployment yiliao --port=80 --type=LoadBalancer
访问测试:10.0.0.152

3.jenkins参数化构建
3.1 添加选项参数

3.2 引用变量
docker login -u admin -p 1 harbor250.oldboyedu.com
docker build -t harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version} .
docker push harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version}
docker logout harbor250.oldboyedu.com

4.响应式更新deploy的镜像
此处在gitee上模拟了代码更新,立即构建,选择v2版本
harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:v2-red
kubectl set image deploy yiliao linux96=harbor250.oldboyedu.com/oldboyedu-yiliao/v2-red
5.再次访问查看
10.0.0.151

五、jenkins基于选项参数实现K8S的服务更新
1.安装Kubectl工具
可以通过添加国内镜像源的方式,使用apt下载
我这里下载好了
[root@jenkins211 ~]# mv kubectl-1.23.17 /usr/local/bin/kubectl
[root@jenkins211 ~]#
[root@jenkins211 ~]# chmod +x /usr/local/bin/kubectl
[root@jenkins211 ~]#
[root@jenkins211 ~]# ll /usr/local/bin/kubectl
-rwxr-xr-x 1 root root 45174784 Sep 4 2023 /usr/local/bin/kubectl*
2.拷贝认证文件
[root@jenkins211 ~]# scp 10.0.0.231:/root/.kube/config /root/.kube/
[root@jenkins211 ~]# ll /root/.kube/
total 20
drwxr-x--- 3 root root 4096 Apr 12 17:55 ./
drwx------ 13 root root 4096 Apr 12 17:54 ../
drwxr-x--- 4 root root 4096 Apr 12 17:55 cache/
-rw------- 1 root root 5634 Apr 12 17:55 config
[root@jenkins211 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master231 Ready control-plane,master 5d6h v1.23.17
worker232 Ready <none> 5d6h v1.23.17
worker233 Ready <none> 5d6h v1.23.17
3.准备脚本内容
docker login -u admin -p 1 harbor250.oldboyedu.com
docker build -t harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version} .
docker push harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version}
docker logout harbor250.oldboyedu.com
kubectl set image deploy yiliao linux96=harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version}
这样一来,就无需自己手动响应式更新镜像了
六、jenkins判断服务是首次部署还是更新
1.修改jenkins的脚本内容
先推送镜像,再进行判断,如果本地没有标签为app=yiliao的pod就先响应式创建deploy,再创建svc,如果不是,就响应式更改镜像
docker login -u admin -p 1 harbor250.oldboyedu.com
docker build -t harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version} .
docker push harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version}
docker logout harbor250.oldboyedu.com
if [ `kubectl get pods -l app=yiliao | wc -l` -eq 0 ] ; then
kubectl create deployment yiliao --image=harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version} --port=80 --replicas=3
kubectl expose deployment yiliao --port=80 --type=LoadBalancer
else
kubectl set image deploy yiliao linux96=harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version}
kubectl scale deployment yiliao --replicas=5
fi
2.测试
七、jenkins基于选项参数进行回滚
Jenkins界面中想用哪个参数直接选就行
八、jenkins实现git参数化构建
1.Jenkins界面修改

2.在立即构建界面查看

3.在linux中查看验证
#Jenkins默认空间在/var/lib/jenkins/workspace/下
#我么进入到一个项目下查看日志
[root@jenkins211 ~]# cd /var/lib/jenkins/workspace/oldboyedu-linux96-yiliao
#简短查看
[root@jenkins211 oldboyedu-linux96-yiliao]# git log --oneline
b3b88b6 (HEAD, origin/master) update index.html.
5016a0f update index.html.
bb3fab4 update index.html.
46e7fa6 update index.html.
ba64a7d update index.html.
2c1bf00 add Dockerfile.
70784ac oldboyedu yiliao
#查看全部信息
[root@jenkins211 oldboyedu-linux96-yiliao]# git log
我们不难发现,日志中的提交编号与我们在Jenkins中查看到的一样
九、Jenkins的pipeline实现全流程
1.如何编写pipeline?
先创建一个流水线类型项目
在配置中可以直接生成流水线语法,选择Pipeline script,选一个helloworld示例

pipeline {
agent any
stages {
#步骤名称
stage('Hello') {
steps {
#此步骤操作的命令,可以用语法转换器进行转换填入此
echo 'Hello World'
}
}
}
}
1.1 拉取git仓库

生成pipeline
git credentialsId: 'gitee', url: 'https://gitee.com/dezyan/oldboyedu-linux96-yiliao.git'
#写入pipeline
pipeline {
agent any
stages {
#步骤名称
stage('拉取git仓库') {
steps {
#此步骤操作的命令,可以用语法转换器进行转换填入此
git credentialsId: 'gitee', url: 'https://gitee.com/dezyan/oldboyedu-linux96-yiliao.git'
}
}
}
}
1.2 转换shell脚本

#立即生成后转换如下
sh '''docker login -u admin -p 1 harbor250.oldboyedu.com
docker build -t harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version} .
docker push harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version}
docker logout harbor250.oldboyedu.com
if [ `kubectl get pods -l app=yiliao | wc -l` -eq 0 ] ; then
kubectl create deployment yiliao --image=harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version} --port=80 --replicas=3
kubectl expose deployment yiliao --port=80 --type=LoadBalancer
else
kubectl set image deploy yiliao linux96=harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version}
kubectl scale deployment yiliao --replicas=5
fi'''
#写入pipeline
pipeline {
agent any
stages {
#步骤名称
stage('拉取git仓库') {
steps {
#此步骤操作的命令,可以用语法转换器进行转换填入此
git credentialsId: 'gitee', url: 'https://gitee.com/dezyan/oldboyedu-linux96-yiliao.git'
}
}
}
#此处可以解耦成多个step,一条命令或一类命令放在一个step里,使步骤更清晰化
stages {
#步骤名称
stage('执行shell脚本') {
steps {
sh '''docker login -u admin -p 1 harbor250.oldboyedu.com
docker build -t harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version} .
docker push harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version}
docker logout harbor250.oldboyedu.com
#我这里使用了变量,如果没配置的话记得在配置中添加参数化构建过程
if [ `kubectl get pods -l app=yiliao | wc -l` -eq 0 ] ; then
kubectl create deployment yiliao --image=harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version} --port=80 --replicas=3
kubectl expose deployment yiliao --port=80 --type=LoadBalancer
else
kubectl set image deploy yiliao linux96=harbor250.oldboyedu.com/oldboyedu-yiliao/linux96:${version}
kubectl scale deployment yiliao --replicas=5
fi'''
}
}
}
}
2.测试
十、Jenkins的Jenkinsfile实现全流程
1.项目配置

2.在gitee上编写Jenkinsfile
将九中的pipeline代码写入Jenkinsfile文件中即可
本文来自博客园,作者:丁志岩,转载请注明原文链接:https://www.cnblogs.com/dezyan/p/18887701

浙公网安备 33010602011771号