侧边栏壁纸
博主头像
CYC的个人博客博主等级

学习使人进步

  • 累计撰写 91 篇文章
  • 累计创建 11 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录
k8s

搭建k8s-jenkins实现流水线自动化打包发布

Administrator
2024-02-05 / 0 评论 / 0 点赞 / 108 阅读 / 9119 字

搭建k8s-jenkins实现流水线自动化打包发布

相关资料:链接:https://pan.baidu.com/s/1YCe5axUdIFDRlo8rRBMgyA

提取码:aabb

ip:192.168.1.241
主机名:master1
配置:6vCPU/6Gi内存
                    
k8s的工作节点:
ip:192.168.1.242
主机名:node1
配置:6vCPU/8Gi内存





基于Jenkins+K8S+harbor+gitlab
5.1 安装Jenkins
5.1.1 安装nfs服务,可以选择自己的任意一台机器,我选择的是k8s的控制节点master1
(1)在xianchaomaster1和xianchaonode1上安装nfs服务 
注意:如果已经安装过nfs,这个步骤可以忽略
[root@master1 ~]# yum install nfs-utils -y
[root@master1 ~]# systemctl start nfs
[root@master1 ~]# systemctl enable nfs
[root@node1 ~]# yum install nfs-utils -y
[root@node1 ~]# systemctl start nfs
[root@node1 ~]# systemctl enable nfs
(2)在master1上创建一个nfs共享目录
[root@master1 ~]# mkdir /data/v2  -p
[root@master1 ~]# vim /etc/exports
/data/v2 *(rw,no_root_squash)
#新增加一行/data/v2 *
#使配置文件生效
[root@xianchaomaster1 ~]# exportfs -arv


5.1.2 在kubernetes中部署jenkins
(1)创建名称空间
[root@xianchaomaster1 ~]# kubectl create namespace jenkins-k8s
(2)创建pv
#更新资源清单文件
mkdir /root/jenkins
[root@xianchaomaster1]# kubectl apply -f pv.yaml
#查看pv是否创建成功
[root@xianchaomaster1]# kubectl get pv

pv.yaml文件内容如下:

cat << EOF > pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins-k8s-pv
spec:
  capacity:
    storage: 100Gi
  accessModes:
  - ReadWriteMany
  nfs:
    server: 192.168.1.241
    path: /data/v2
EOF


(3)创建pvc
#更新资源清单文件
[root@master1]# kubectl apply -f pvc.yaml
#查看pvc是否创建成功
[root@master1]# kubectl get pvc -n jenkins-k8s

pvc.yaml文件内容如下:
cat << EOF > pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: jenkins-k8s-pvc
  namespace: jenkins-k8s
spec:
  resources:
    requests:
      storage: 100Gi
  accessModes:
  - ReadWriteMany
EOF
(4)创建一个sa账号
[root@master1]# kubectl create sa jenkins-k8s-sa -n jenkins-k8s
(5)把上面的sa账号做rbac授权
[root@master1]# kubectl create clusterrolebinding jenkins-k8s-sa-cluster -n jenkins-k8s --clusterrole=cluster-admin --serviceaccount=jenkins-k8s:jenkins-k8s-sa
(6)通过deployment部署jenkins
[root@node1 ~]# docker pull jenkins/jenkins:2.394
[root@node1 ~]# docker save -o jenkins2.394  jenkins/jenkins:2.394
[root@node1 ~]# ctr -n=k8s.io images import jenkins2.394

备注:jenkins安装的时候,每次镜像都要下载最新的,安装最新版jenkins,如何下载最新的镜像?
去dockerhub上按照我视频方式去获取




[root@node1 ~]# docker load -i jenkins-slave-latest.tar.gz
[root@node1 ~]# ctr -n=k8s.io images import jenkins-slave-latest.tar.gz

备注:jenkins-slave-latest.tar.gz这个里面封装的镜像是jenkins-slave-latest:v1,这个jenkins-slave-latest:v1镜像制作方法如下:
[root@xianchaomaster1]#cd /root/slave
[root@xianchaomaster1 slave]# cat dockerfile
FROM jenkins/jnlp-slave:4.13.3-1-jdk11
USER root
# 安装Docker
RUN apt-get update && apt-get install -y \
    docker.io
# 将当前用户加入docker用户组
RUN usermod -aG docker jenkins
RUN curl -LO https://dl.k8s.io/release/stable.txt
RUN curl -LO https://dl.k8s.io/release/$(cat stable.txt)/bin/linux/amd64/kubectl
RUN chmod +x kubectl
RUN mv kubectl /usr/local/bin/
ENV DOCKER_HOST unix:///var/run/docker.sock


[root@xianchaomaster1 slave]# docker build -t=jenkins-slave-latest:v1 .
[root@xianchaomaster1 slave]# docker save -o jenkins-slave-latest.tar.gz  jenkins-slave-latest:v1



#更新资源清单文件
#image 2.394
chown -R 1000.1000 /data/v2

[root@xianchaomaster1]# kubectl apply -f jenkins-deployment.yaml
jenkins-deployment.yaml文件内容如下:
kind: Deployment
apiVersion: apps/v1
metadata:
  name: jenkins
  namespace: jenkins-k8s
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      serviceAccount: jenkins-k8s-sa
      containers:
      - name: jenkins
        image:  jenkins/jenkins:2.394
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          name: web
          protocol: TCP
        - containerPort: 50000
          name: agent
          protocol: TCP
        resources:
          limits:
            cpu: 1000m
            memory: 1Gi
          requests:
            cpu: 500m
            memory: 512Mi
        livenessProbe:
          httpGet:
            path: /login
            port: 8080
          initialDelaySeconds: 60
          timeoutSeconds: 5
          failureThreshold: 12
        readinessProbe:
          httpGet:
            path: /login
            port: 8080
          initialDelaySeconds: 60
          timeoutSeconds: 5
          failureThreshold: 12
        volumeMounts:
        - name: jenkins-volume
          subPath: jenkins-home
          mountPath: /var/jenkins_home
      volumes:
      - name: jenkins-volume
        persistentVolumeClaim:
          claimName: jenkins-k8s-pvc

#查看jenkins是否创建成功
[root@xianchaomaster1 jenkins]# kubectl get pods -n jenkins-k8s




#创建 jenkins服务
 jenkins-service.yaml文件内容如下:
cat << EOF > jenkins-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: jenkins-service
  namespace: jenkins-k8s
  labels:
    app: jenkins
spec:
  selector:
    app: jenkins
  type: NodePort
  ports:
  - name: web
    port: 8080
    targetPort: web
    nodePort: 30002
  - name: agent
    port: 50000
    targetPort: agent
EOF



在浏览器访问jenkins的web界面:
192.168.1.242:30002/



5.2.2 安装插件
安装推荐的插件



5.2.3 创建第一个管理员用户

用户名和密码都设置成admin,线上环境需要设置成复杂的密码
修改好之后点击保存并完成,出现如下界面
点击保存并完成,出现如下界面



点击开始使用Jenkins
5.3 测试jenkins的CI/CD

5.3.1 在Jenkins中安装kubernetes插件
(1)在jenkins中安装k8s插件
Manage Jnekins------>插件管理------>可选插件------>搜索kubernetes------>出现如下
选中kubernetes之后------>点击下面的直接安装------>安装之后选择重新启动jenkins---> http://192.168.1.241:30002/restart-->重启之后登陆jenkins,插件即可生效


(2)安装blueocean插件
Manage Jnekins------>插件管理------>可选插件------>搜索blueocean------>出现如下
选中BlueOcean之后------>点击下面的直接安装------>安装之后选择重新启动jenkins---> http://192.168.1.241:30002/restart-->重启之后登陆jenkins,插件即可生效


5.3.2 配置jenkins连接到我们存在的k8s集群
(1)访问http://192.168.1.242:30002/configureClouds/
新增一个云,在下拉菜单中选择kubernets并添加
(2)填写云kubernetes配置内容
名称: kubernetes
Kubernetes地址: 
https://192.168.1.241:6443
(3)测试jenkins和k8s是否可以通信
Kubernetes名称空间: jenkins-k8s-sa



点击连接测试,如果显示Connected to Kubernetes v1.23.1,说明测试成功,Jenkins可以和k8s进行通信

Jenkins地址: 
http://jenkins-service.jenkins-k8s.svc.cluster.local:8080





5.3.3 配置pod-template

(1)配置pod template
添加Pod模板

模板名称 dev,命名空间:jenkins-k8s,标签列表 devsy


###点击添加容器
名称:jnlp
Docker镜像:xianchao/jenkins-jnlp:v2
#运行命令、命名参数清空,勾选分配伪终端


##点击添加卷
/var/run/docker.sock
/var/run/docker.sock

/root/.kube
/home/jenkins/.kube

#可以持久化自定义目录,例如maven依赖包地址 maven配置信息等。

#提前做下
[root@xianchaomaster1 ~]# scp -r /root/.kube/  node1:/root/

在Service Account处输入jenkins-k8s-sa,这个sa就是我们最开始安装jenkins时的sa

上面配置好之后,Apply(应用)------>Save(保存)



5.3.4 添加自己的dockerhub凭据
首页------>系统管理Manage Credentials(管理凭据)------>点击Stores scoped to Jenkins下的第一行jenkins后的全局,显示如下

点击添加凭据,出现如下------>
username:xxxx
password:xxxxxxx!
ID:xxxx
描述:随意写一段描述即可
上面改好之后选择确定即可



#配置修改http://192.168.1.242:30002/manage/configureClouds/
#node1 
docker load -i jenkins-jnlp-v2.tar


#
构建流水线项目
选择pipeline script


配置分支参数:
#安装git paramter插件
在General部分,勾选“参数化构建过程”,选择“Git参数”

添加参数信息:
git参数:名称:branch,类型:分支或标签
字符参数:xmname
字符参数:xtype

分支过滤 origin/(.*)   标签过滤 *


添加参数信息:

版本号参数可选
version


####构建自定义项目##########
编写个性化脚本

#########编写springboot打包pipeline#############
node('devsy') {
    
    environment {
        // 定义变量
        dversion = ''
    }
    
    
    
   stage('拉取代码') {
       echo "Clone Stage"
       git  branch:'${branch}',credentialsId: 'gitlabuser', url: 'https://xxx.xxx.cn/cn-medical/cn-medical.git'
       script {
           build_tag = build_tag+sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
           pkgpath='/home/jenkins/agent/workspace/cn-medical'
           pkgmvn='/home/jenkins/agent/mvnsetting/settings.xml'
           dcname='cn-medical'
       }
    }

   stage('信息展示') {
     echo "分支:${branch},版本号:${build_tag}"
    }
   stage('构建jar包') {
     sh 'ls /home/jenkins/agent '
     #sh "sed -i '2a JAVA_HOME=/home/jenkins/agent/jdk/jdk1.8.0_401/ ' /usr/local/maven/apache-maven-3.8.1/bin/mvn"
     sh "mvn clean package --settings  ${pkgmvn}  -Dmaven.test.skip=true"
    }
    
    stage('build镜像') {
       echo "Docker Image Stage"
       echo "分支:${branch},版本号:${build_tag}"
       sh "cd {pkgpath} && docker build --tag xxx.xxx.cn/dev/${dcname}:${build_tag} ."
    }
   stage('Push镜像') {
       echo "Push Docker Image Stage"
       echo "分支:${branch},版本号:${build_tag}"
       withCredentials([usernamePassword(credentialsId: 'xxx.xxx.cn',passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {
          sh "docker login xxx.xxx.cn -u ${dockerHubUser} -p ${dockerHubPassword}"
          sh "docker push xxx.xxx.cn/dev/${dcname}:${build_tag}"
       }
    }
    stage('入库记录') {
       echo "分支:${branch},版本号:${build_tag}"
       sh "curl -G  --data-urlencode 'xmname=${xmname}' --data-urlencode 'type=${xtype}'  -d 'num=1' -d 'gitbranch=${branch}'  -d 'updateversion=${build_tag}' -d 'name={$dcname}'  -d 'lastupdate=true' -d 'id=0' http://192.168.1.190:10001/sy/insertsyimage"
    }
    
    
}

0

评论区