7、Jenkins+Nexus3+Docker+K8s实现CICD

文章目录


提示:本章主要记录各基本环境搭建好后如何配置Jenkins流水线部署微服务到K8s

基本环境配置

主机 操作系统 IP 备注
物理主机 Win11 192.168.6.1 Jenkins、Nexus3、Docker Desktop
虚拟主机1 CentOS7 192.168.6.11 k8s-master
虚拟主机2 CentOS7 192.168.6.12 k8s-worker

前提:

  1. K8s集群已经搭建好
  2. Nexus3搭建好docker私服
  3. 物理主机上安装好DockerDesktop并且能够登录docker私服
  4. 配置k8s的所有节点上的docker能访问docker私服并拉取镜像
  5. win11物理主机安装好了jdk11、maven3.8.4、jenkins2.426.1、Nexus3、DockerDesktop
  6. win11能够无密码远程ssh访问虚拟主机1

一、Jenkins安装必要插件

1、Git、 Gitee
2、Maven Integration
3、Publish Over SSH、SSH server
4、Docker plugin

注:可能还有一些其它插件

二、Jenkins系统配置

  1. 配置jenkins所在物理主机上Git安装位置

  2. 配置jenkins所在物理主机上Maven安装位置

  3. 配置win11物理主机远程访问虚拟主机1(k8s-master)

  4. 配置win11物理主机DockerDesktoop安装路径

  5. 配置win11物理主机jdk安装路径

三、新建流水线

1、选择Pipeline

2、参数化构建,这里配置Git参数

3、用Git拉取Jenkinsfile,用Jenkinsfile来运行流水线脚本

四、在项目工程里添加Jenkinsfile、deploy.yml

Jenkinsfile内容如下:

groovy 复制代码
pipeline {
    agent any
	// 声明全局变量
	environment{
	    nexusUserName='admin'
        nexusPwd='xxx'
        nexusAddr='192.168.6.1:8082'
        nexusRepository='repository'

	}
    
    stages {
        stage('Git拉取代码') {
            steps {
                checkout scmGit(branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee-auth', url: 'https://gitee.com/MonochromeContrast/mytest.git']]) 
				echo 'Git拉取代码 - SUCCESS'
            }
        }
		
		stage('Maven构建项目') {
            steps {
                bat 'D:\\Maven\\bin\\mvn clean package -DskipTests'
				echo 'Maven构建项目 - SUCCESS'
            }
        }
        
        stage('Docker制作镜像') {
            steps {
                bat '''move "target\\*.jar"  "docker\\"
                docker build -t %JOB_NAME%:%tag% .\\docker\\'''
				echo 'Docker制作镜像 - SUCCESS'
            }
        }
        
        stage('推送镜像到Nexus镜像仓库') {
            steps {
                bat '''docker login -u %nexusUserName% -p %nexusPwd% %nexusAddr%
                docker tag %JOB_NAME%:%tag% %nexusAddr%/%nexusRepository%/%JOB_NAME%:%tag%
                docker push %nexusAddr%/%nexusRepository%/%JOB_NAME%:%tag%'''
				echo '推送镜像到Nexus镜像仓库 - SUCCESS'
            }
        }

        stage('将yml文件推送到k8s-master服务器'){
            steps{
                sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s-master', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'deploy.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '将yml文件推送到k8s-master服务器 - SUCCESS'
            }
        }

        stage('远程执行k8s部署命令'){
            steps{
                bat 'ssh root@192.168.6.11 kubectl apply -f /k8s/myapp/deploy.yml'
            }
        }
    }
}

deploy.yml文件的内容如下:

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: dev
  name: test
  labels:
    app: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
    spec:
      imagePullSecrets:
        - name: docker-secret
      containers:
      - name: test
        image: 192.168.6.1:8082/repository/test:v6.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
---

apiVersion: v1
kind: Service
metadata:
  namespace: dev
  labels:
    app: test
  name: test
spec:
  selector:
    app: test
  ports:
  - port: 8081
    targetPort: 8080
  type: NodePort
  
---
 
 apiVersion: networking.k8s.io/v1
 kind: Ingress
 metadata:
   namespace: dev
   name: test
 spec:
   ingressClassName: ingress
   rules:
   - host: felix.test.com
     http:
       paths:
       - path: /
         pathType: Prefix
         backend:
           service:
             name: test
             port:
               number: 8081

五、在项目工程里添加Dockerfile

bash 复制代码
FROM openjdk:11
COPY mytest.jar /usr/local/
WORKDIR /usr/local
CMD java -jar mytest.jar

总结

提示:前面的基础配置跟着做就行,重点要理解Jenkinsfile里写的每一个步骤

主要用Jenkins的片段生成器来生成每一步的脚本:

  1. 生成Git拉取代码的流水线脚本

  2. 用指定目录下的maven执行Maven构建项目命令(因为该操作是在jenkins所在win11系统下进行的,所以这里用的是windows批处理命令。如果是centos系统,这里就得相应选择sh)

  3. Docker制作镜像

  4. 将制作好的镜像推送到Nexus镜像仓库(这里用%%包起来的是引用的环境变量,nexus镜像仓库信息都配置到了Jenkinsfile文件的环境变量里)、
    提示:windows批处理命令里引用变量用%%,shell命令应用变量则是${}

  5. 将deploy.yml文件推送到k8s-master服务器(deploy.yml文件是部署k8s的描述性文件)
    我们之前已经配置好了Jenkins与远程服务器的连接(k8s-master),而且指定了远程服务器文件夹位置:

6.远程访问虚拟主机1(k8s-master),执行部署服务的命令


提示:这里必须满足两个条件:

(1)、win11能无密码远程访问虚拟主机1(k8s-master)

bash 复制代码
 ssh root@192.168.6.11
 // 不需要输入密码就是ok的

(2)、jenkins服务所拥有的账户身份必须能无密码远程访问虚拟主机1(要和在命令行测试的账户一致),否则这里有个坑,流水线会卡在这一步。

相关推荐
kaiyuanheshang8 小时前
docker 中的entrypoint和cmd指令
运维·docker·容器·cmd·entrypoint
Python私教9 小时前
除了 Docker,还有哪些类似的容器技术?
运维·docker·容器
杨浦老苏10 小时前
开源无代码网络数据提取平台Maxun
低代码·docker·群晖
petaexpress13 小时前
5种常见的k8s云原生数据管理方案详解
云原生·kubernetes·k8s云原生
颜淡慕潇14 小时前
【K8S系列】深入解析 Kubernetes 中的 Deployment
后端·云原生·容器·kubernetes
xnuscd15 小时前
els学习
运维·学习·jenkins
zwm_yy16 小时前
docker-mysql
mysql·docker·容器
Linux运维老纪19 小时前
linux系统运维面试题(二)(Linux System Operations Interview Questions II)
linux·服务器·面试·云计算·运维开发·devops
FinelyYang19 小时前
docker+容器+redis+minio+java jar,实现开机自启动
运维·docker·容器