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.修改登录密码

image

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.创建仓库

image

image

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.访问仓库查看

image

三、jenkins从gitee拉取代码并推送到harbor仓库

1.安装docker环境

2.拷贝harbor的证书文件

[root@jenkins211 ~]# scp -r 10.0.0.250:/etc/docker/certs.d/ /etc/docker/

3.创建jenkins的项目并配置git

image

image

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.开启编译

image

6.harbor的WebUI验证

image

四、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

image

3.jenkins参数化构建

3.1 添加选项参数

image

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

image

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

image

五、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界面修改

image

2.在立即构建界面查看

image

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示例

image

pipeline {
    agent any

    stages {
    #步骤名称
        stage('Hello') {
            steps {
            #此步骤操作的命令,可以用语法转换器进行转换填入此
                echo 'Hello World'
            }
        }
    }
}

1.1 拉取git仓库

image

生成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脚本

image

#立即生成后转换如下
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.项目配置

image

2.在gitee上编写Jenkinsfile

将九中的pipeline代码写入Jenkinsfile文件中即可

posted @ 2025-05-20 19:49  丁志岩  阅读(30)  评论(0)    收藏  举报