jenkins+kubernetes(k8s)发布Java项目

  • 准备工作
  • 机器列表
  • 镜像列表
  • 创建一个java项目
  • 创建jenkins镜像
  • Jenkins服务配置
  • 启动jenkins
  • 访问jenkins
  • 系统配置和权限配置
  • 发布Java服务
  • 查看java服务运行状态

记录一下学习k8s+jenkins发布项目的过程,期间遇到很多坑。希望能让刚接触的童鞋少走弯路。

准备工作

本篇只介绍发布的过程,在这之前有很多必要的工作要做:

  1. k8s集群搭建 ,我自己搭的是3个节点的集群;
  2. harbor搭建 ,docker镜像私仓;

机器列表

host ip 描述
centos7docker 192.168.147.129 harbor私仓机器
k8smaster 192.168.147.130 k8smaster节点
k8sworker1 192.168.147.131 k8s节点
k8sworker2 192.168.147.132 k8s节点

镜像列表

镜像名称 依赖的镜像 描述
jenkins/jenkins:lts jenkins官方镜像
centos7docker:443/aliang-xyl/jenkins:lts jenkins/jenkins:lts 自制jenkins镜像
centos:7 centos7官方镜像
centos7docker:443/aliang-xyl/java8:jdk-8u231 centos:7 自制java服务基础镜像
centos7docker:443/aliang-xyl/provider-docker-demo:e161850 centos7docker:443/aliang-xyl/java8:jdk-8u231 java服务镜像

创建一个java项目

创建一个Java项目,结构如下:

项目Dockerfile文件内容, 用于项目打包成镜像

# 基于哪个镜像, 这个是我自定义的镜像,可根据实际情况更改
FROM centos7docker:443/aliang-xyl/java8:jdk-8u231ARG JAR_FILE
ADD target/provider-docker-demo.jar /provider-docker-demo.jar# 配置容器启动后执行的命令
ENTRYPOINT  ["java","-Ddemo.test=test", "-Xmn256M", "-Xms1G", "-Xmx1G", "-XX:MetaspaceSize=512M","-jar","/provider-docker-demo.jar"]

k8s.ymal文件内容

apiVersion: v1
kind: Service
metadata:name: provider-docker-demonamespace: defaultlabels:app: provider-docker-demo
spec:type: NodePortports:- port: 30001nodePort: 30001 #service对外开放端口selector:app: provider-docker-demo
---
apiVersion: apps/v1
kind: Deployment #对象类型
metadata:name: provider-docker-demo #名称labels:app: provider-docker-demo #标注
spec:replicas: 1 #运行容器的副本数,修改这里可以快速修改分布式节点数量selector:matchLabels:app: provider-docker-demotemplate:metadata:labels:app: provider-docker-demospec:containers: #docker容器的配置- name: provider-docker-demoimage: centos7docker:443/aliang-xyl/provider-docker-demo:<BUILD_TAG> # pull镜像的地址 ip:prot/dir/images:tagimagePullPolicy: IfNotPresent #pull镜像时机,ports:- containerPort: 30001 #容器对外开放端口volumeMounts:- mountPath: logs/privider-demoname: provider-docker-demo-logsvolumes:- name: provider-docker-demo-logshostPath: path: /home/logs/privider-docker-demo

自定义基础docker镜像Dockerfile,定制一个Java服务运行的基础镜像

# centos:7是官方镜像
FROM centos:7
# jdk信息
ADD jdk-8u231-linux-x64.tar.gz /usr/local
ENV JAVA_HOME  /usr/local/jdk1.8.0_231
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin
# 更改系统语言,不更改的话java服务中中文会出现乱码
RUN yum -y install kde-l10n-Chinese telnet && \
yum -y install glibc-common &&\
yum clean all  && \
localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
ENV LC_ALL=zh_CN.utf8
ENV LANG=zh_CN.utf8
ENV LANGUAGE=zh_CN.utf8
# 更改时区
RUN echo 'Asia/Shanghai' >/etc/timezone

创建基础镜像

[root@centos7docker home]# docker build -t centos7docker:443/aliang-xyl/java8:jdk-8u231 . -f DockerFile

推送至harbor私仓
这里需要登录至私仓,否则推不上去

[root@centos7docker home]# docker login -uadmin -p123456 centos7docker:443
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded[root@centos7docker home]# docker push centos7docker:443/aliang-xyl/java8:jdk-8u231

基础镜像构建完毕

创建jenkins镜像

官方的镜像可以直接使用,目前我使用的Jenkins版本是2.204.5,但是如果要发布k8s服务的话,会报错:

kubectl command not found

因为没有安装kubectl,所以需要定制jenkins镜像,Dockerfile如下:

# 这个镜像是官方镜像
FROM jenkins/jenkins:lts# 因为默认不是使用root账号,无法完成下面的操作,所以必须使用root
USER root# 直接删除自带的jdk,不同的jenkins可自行运行docker run -it [imageid] /bin/sh  然后查看jdk版本和路径,然后删除
RUN rm -rf /usr/local/openjdk-8# 使用自己的jdk
ADD jdk-8u231-linux-x64.tar.gz /usr/local
ENV JAVA_HOME  /usr/local/jdk1.8.0_231
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin# 使用自己的maven,注意先把压缩包里的settings.xml改好,比如本地仓库路径和私服配置信息
# 这里我把仓库路径配置为:/var/jenkins_home/repository
ADD apache-maven-3.6.3-bin.tar.gz /usr/local
ENV MAVEN_HOME /usr/local/apache-maven-3.6.3
ENV PATH $MAVEN_HOME/bin:$PATH# 安装kubeclt工具
ADD kubernetes-client-linux-amd64.tar.gz /
RUN chmod +x ./kubernetes/client/bin/kubectl
RUN mv ./kubernetes/client/bin/kubectl /usr/local/bin/kubectl
RUN ln -s /usr/local/bin/kubectl /usr/bin/kubectl# 需要找到k8s集群里master节点的/etc/kubernetes/admin.conf配置拷贝出来
ADD admin.conf /root
RUN mkdir -p /root/.kube
RUN mv /root/admin.conf /root/.kube/config
RUN chown $(id -u):$(id -g) /root/.kube/config# 更改jenkins镜像的时区
RUN echo 'Asia/Shanghai' >/etc/timezone

准备文件

[root@k8smaster jenkins]# ll
总用量 211704
-rw-r--r-- 1 root root      5449 3月   6 16:16 admin.conf
-rw-r--r-- 1 root root   9506321 3月  21 02:58 apache-maven-3.6.3-bin.tar.gz
-rw-r--r-- 1 root root       726 3月  21 03:29 Dockerfile
-rw-r--r-- 1 root root 194151339 3月   3 16:04 jdk-8u231-linux-x64.tar.gz
-rw-r--r-- 1 root root  13108955 3月  21 02:38 kubernetes-client-linux-amd64.tar.gz

kubectl下载地址:
注意:我使用的是v1.17.3版本,可根据自己的实际版本下载
https://storage.googleapis.com/kubernetes-release/release/v1.17.3/kubernetes-client-linux-amd64.tar.gz

接下来开始构建jenkins镜像
镜像名称:centos7docker:443/aliang-xyl/jenkins:lts

[root@centos7docker home]# docker build -t centos7docker:443/aliang-xyl/jenkins:lts . -f DockerFile
[root@centos7docker home]# docker push centos7docker:443/aliang-xyl/jenkins:lts

Jenkins服务配置

k8s账号角色信息,文件名:jenkins-service-account.yml

apiVersion: v1
kind: ServiceAccount
metadata:name: jenkins-admin
secrets:
- name: jenkins-admin-token-bcv7t---
kind: Role
#rbac的版本为官方定义的版本,可去官网查询
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: jenkins-admin
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]resources: ["pods/exec"]verbs: ["create","delete","get","list","patch","update","watch"]
- apiGroups: [""]resources: ["pods/log"]verbs: ["get","list","watch"]
- apiGroups: [""]resources: ["secrets"]verbs: ["get"]
- apiGroups: ["","extensions", "apps"]resources: ["deployments"]verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: [""]resources: ["", "services", "endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]  ---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: jenkins-admin
roleRef: kind: Rolename: jenkins-adminapiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccountname: jenkins-admin

Jenkins的Deployment和Service,文件:jenkins.ymal
注意:我直接使用的是root权限启动的jenkins(yml里有备注),可以省去很多权限不足的麻烦

#-----Deployment----------------
apiVersion: apps/v1
kind: Deployment
metadata:name: jenkinslabels: app: jenkins
spec:replicas: 1                #副本数为1selector:matchLabels:app: jenkinstemplate:metadata:labels:app: jenkinsspec:serviceAccountName: jenkins-adminimagePullSecrets:- name: jenkins-admin-token-bcv7tcontainers:- name: jenkinsimage: centos7docker:443/aliang-xyl/jenkins:ltsimagePullPolicy: IfNotPresentsecurityContext:runAsUser: 0   #直接使用root权限启动,可以减少很多权限带来的问题ports:- containerPort: 8080volumeMounts:- mountPath: /var/jenkins_homename: jenkins-home - name: docker   #docker的挂载不能少,否则在运行脚本时会找不到docker命令mountPath: /usr/bin/docker- name: docker-sockmountPath: /var/run/docker.sock- name: date-configmountPath: /etc/localtime- name: kube-configmountPath: /root/.kubehostAliases:          # 在spec下的hostAliases 处添加,此处为虚拟机的host配置,可根据实际情况来配置- ip: "192.168.147.130"hostnames:- "k8s.apiserver"- ip: "192.168.147.131"hostnames:- "k8sworker1"- ip: "192.168.147.132"hostnames:- "k8sworker2"volumes:- name: jenkins-homehostPath: path: /home/data/jenkins_home- name: dockerhostPath:path: /usr/bin/docker- name: docker-sockhostPath:path: /var/run/docker.sock- name: date-confighostPath:path: /etc/localtime- name: kube-confighostPath:path: /root/.kube
---#------service---------------
apiVersion: v1
kind: Service
metadata:name: jenkinslabels:name: jenkins
spec:type: NodePortports:- name: jenkinsport: 8080 targetPort: 8080nodePort: 30009         #开启nodeport- name: jenkins-agentport: 50000 targetPort: 50000nodePort: 30010selector:app: jenkins

启动jenkins

在k8s集群的master节点机器上运行以下命令来发布jenkins服务

[root@k8smaster k8s]# kubectl apply -f jenkins-service-account.yml
[root@k8smaster k8s]# kubectl apply -f jenkins.yaml

查看运行状态

[root@k8smaster k8s]# kubectl get pods
NAME                                    READY   STATUS    RESTARTS   AGE
jenkins-75cb68d55f-7qkbz                1/1     Running   0          4h26m

查看日志获取初始化密码

[root@k8smaster k8s]# kubectl logs jenkins-75cb68d55f-7qkbz

初始化的时候日志里会有一个uuid的字符串,该字符串为初始密码,用来登录jenkins

访问jenkins

可以访问k8s的任意一个子节点来访问jenkins:
jenkins初始化,根据上一步拿到的初始密码来登录jenkins,并获取推荐的插件,
注意:版本过低的jenkins无法安装部分插件,目前我所使用的jenkins为最新版本

系统配置和权限配置

系统设置添加kubernetes云
进入 系统管理/系统配置


如果这里连接失败,绝大部分原因是权限的问题,可能是k8s发布jenkins-service-account.yml的时候除了问题

添加git权限
进入凭据

添加git权限


添加harbor账号信息

注意:权限里的id定义之后在后面会用到

发布Java服务

新建一个流水线任务


这里我直接使用的是脚本

// harbor镜像仓库地址信息
def registry = "centos7docker:443"
// 项目
def project = "aliang-xyl"
def app_name = "provider-docker-demo"node(){  stage('1.拉取Git代码'){checkout([$class: 'GitSCM', branches: [[name: '*/master'], [name: '*/develop']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CleanBeforeCheckout']], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '2e599a5b-f64d-4ef6-992b-f2bff64bb7a9', url: 'git@github.com:aLiang-xyl/provider-docker-demo.git']]])script {build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()}image_name = "${registry}/${project}/${app_name}:${build_tag}"}stage('2.java代码编译'){echo "------maven版本、JDK版本-------"sh "mvn --version"sh "mvn clean package -Dmaven.test.skip=true"}stage('3.镜像打包docker build') {echo "镜像: ${image_name}"sh "docker --version"sh "docker build -t ${image_name} . -f src/main/docker/Dockerfile"}stage('4.推镜像仓库Push') {withCredentials([usernamePassword(credentialsId: 'jenkins-harbor-creds', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {sh "docker login -u ${dockerHubUser} -p ${dockerHubPassword} ${registry}"sh "docker push ${image_name}"}}stage('5.部署到k8s') {sh "sed -i 's/<BUILD_TAG>/${build_tag}/' src/main/docker/k8s.yaml"sh "kubectl apply -f src/main/docker/k8s.yaml"echo "项目部署成功"}
}

或者也可以把脚本文件Jenkinsfile放在项目的根目录

注意:脚本里的checkout可以自动生成:


接下来就是见证奇迹的时刻

查看java服务运行状态

[root@k8smaster k8s]# clear
[root@k8smaster k8s]# kubectl get pods
NAME                                    READY   STATUS    RESTARTS   AGE
jenkins-75cb68d55f-7qkbz                1/1     Running   0          5h13m
provider-docker-demo-7f66999f78-jphn7   1/1     Running   0          144m

至此整个发布流程结束

jenkins+kubernetes(k8s)发布Springboot项目相关推荐

  1. 如何使用Docker发布SpringBoot项目

    1.目标 Dockerfile文件用来构建Docker镜像,它由一系列命令和参数构成,接下来演示一下如何使用Docker发布SpringBoot项目. 2.准备 a.SpringBoot项目 该项目名 ...

  2. k8s部署SpringBoot项目

    一.前言 本文将介绍如何通过CICD将SpringBoot框架的Web项目发布到k8s集群中,文章中有使用到eureka的注册,如果对如何在k8s集群中部署eureka,那么可以参考本人的 k8s部署 ...

  3. Jenkins Pipeline 一键部署SpringBoot项目

    介绍 通过jenkins的pipeline 可以很清晰了解发布项目经历了哪些步骤,每一步成功失败一目了然,某一个步骤阶段失败了修复好了问题之后可以不用重头再来构建,可以继续上次失败的步骤执行,还可以清 ...

  4. K8S 部署 SpringBoot 项目(一篇够用)

    今日推荐 扔掉 Postman,一个工具全部搞定,真香!为啥查询那么慢?还在直接用JWT做鉴权?JJWT真香推荐 15 款常用开发工具干掉 navicat:这款 DB 管理工具才是y(永)y(远)d( ...

  5. Jenkins+Pipeline+Docker部署SpringBoot项目到远程服务器

    Jenkins部署 前言 Jenkins 安装 nginx配置 jenkins配置 Docker安装 项目部署 项目添加Dockerfile文件 Jenkins新建任务 使用Pipeline部署 结果 ...

  6. 阿里云 Java发布SpringBoot项目,使用邮件服务发送失败原因整理

    查了很多失败原因大致有一下几点: 使用了25端口,阿里云默认是禁用掉25端口的,看看能否通 解决办法:代码配置中指定为465端口 telnet smtp.163.com 25 2.使用465端口,依旧 ...

  7. jenkins整合gitee自动部署SpringBoot项目

    文章目录 前提条件 一.服务器安装jenkins 方法一:简单快捷 第一步:将jenkens.war导入到系统 第二步:放在tomcat的webapp下面 第三步:访问http://ip:8080/j ...

  8. 前端H5项目部署到OSS-利用jenkins实现自动发布【生产环境实战】

    前端H5项目发布到OSS 文章目录 前端H5项目发布到OSS 背景 一.创建Bucket 二.为Bucket绑定自定义域名 1.购买的域名和oss在同一个阿里云账号下(大多数) 2.购买的域名和oss ...

  9. k8s和harbor的集成_爱威尔-基于kubernetes集群的项目持续集成(gitlab+harbor+Jenkins)安装...

    这个算是基于kubernetes集群的项目持续集成的前导篇,先把这用环境搭建好我们后面就可以专注做基于k8s的docker化项目持续集成了. gitlab安装 https://about.gitlab ...

最新文章

  1. NanoPi NEO Air使用九:使用Linux内核自带的LED驱动
  2. django models索引_django-models – Django模型“IndexError:列表索引超出范围”Pydev
  3. ML之回归预测:利用13种机器学习算法对Boston(波士顿房价)数据集【13+1,506】进行回归预测(房价预测)来比较各模型性能
  4. 几位大佬启蒙老师和女神启蒙老师的博客,大家可以多关注下
  5. numpy 归一化_NumPy 数据归一化、可视化
  6. 计算机课中排序选什么,《计算机应用基础课件》1.6 排序复习课程.ppt
  7. 8-5:C++继承之多继承,菱形继承,虚继承,虚基表,继承和组合
  8. 【Anaconda安装包】如何在Ananconda环境下安装CV2(opencv)
  9. 让两个灯隔断时间交替闪烁的电路
  10. 数字信号处理考试要点
  11. 计算机主机不启动的故障,电脑不能正常启动的原因及解决方法
  12. 牛逼!你竟然把VSCode玩成了IDEA的效果,有点哇塞。。。
  13. 获取当天23时59分59秒
  14. 显示 wordpress 文章摘要函数the_excerpt
  15. 怎么打造云计算的碎片计算方式
  16. python数据获取及预处理_Python小练习——电影数据集TMDB预处理
  17. html图片自动滚动播放器,jQuery+css实现图片滚动效果(附源码)
  18. element-ui 去掉谷歌浏览器el-input组件或input自动填充账号密码
  19. 关于手机开发的一些比较基础的知识
  20. Gradle 配置代理

热门文章

  1. C#【中级篇】volatile关键字测试-在C#无区别,在Java有区别
  2. ShopsN开源多用户商城系统近期将提供下载
  3. springboot实现分页
  4. 一、互联网架构的演变历程
  5. Selenium:网页自动化测试代码(Python版)
  6. 优酷路由宝L1刷Breed和Padavan固件方法
  7. java包的导入方法
  8. day14-java-集合
  9. 在OneDrive奄奄一息之机迎来了45G容量的InfiniCLOUD
  10. easy-ui datagrid弹框显示选中行数据