k8s部署jar包_学习K8S之路.6--- 在K8S中部署Jenkins,并使用Jenkins打包jar包
一:部署jenkins
jenkins官网:https://jenkins.io/download/
jenkins镜像:https://hub.docker.com/r/jenkins/jenkins
1:在运维主机(192.168.6.96)上下载官网稳定版镜像
[root@k8s-6-96 ~]# docker pull jenkins/jenkins:2.190.3[root@k8s-6-96 ~]# docker images |grep jenkins
jenkins/jenkins 2.190.3 22b8b9a84dbe 6months ago 568MB
[root@k8s-6-96 ~]# docker tag 22b8b9a84dbe harbor.auth.com/public/jenkins:v2.190.3[root@k8s-6-96 ~]# docker push harbor.auth.com/public/jenkins:v2.190.3
2:制作自定义镜像
2.1:生成ssh秘钥对,用于拉取git私有仓库代码,需要使用ssh密钥
[root@k8s-6-96 ~]# ssh-keygen -t rsa -b 2048 -C "117586xxx@qq.com" -N "" -f /root/.ssh/id_rsa
// 执行完成会在/root/.ssh/ 目录下生成一对密钥
2.2:准备get-docker.sh文件,用于在jenkins容器中使用docker客户端,执行 build
[root@k8s-6-96 ~]# curl -fsSL get.docker.com -o get-docker.sh
[root@k8s-6-96 ~]# chmod +x get-docker.sh
2.3:准备config.json文件,用于把docker镜像push到镜像仓库
[root@k8s-6-96 ~]# cat /root/.docker/config.json
{
"auths": {
"harbor.od.com": {
"auth": "YWRtaW46SGFyYm9yMTIzNDU="}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.4 (linux)"}
2.4:创建目录并准备Dockerfile
[root@k8s-6-96 ~]# cd /data/dockerfile/[root@k8s-6-96dockerfile]# mkdir jenkins
[root@k8s-6-96dockerfile]# cd jenkins
[root@k8s-6-96jenkins]# vi Dockerfile
FROM harbor.od.com/public/jenkins:v2.190.3USER root
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
echo 'Asia/Shanghai' >/etc/timezone
ADD id_rsa /root/.ssh/id_rsa
ADD config.json /root/.docker/config.json
ADD get-docker.sh /get-docker.sh
RUN echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config &&\
/get-docker.sh --mirror=Aliyun
这个Dockerfile里我们主要做了以下几件事:
设置容器用户为root
设置容器内的时区
将创建的ssh私钥加入(使用git拉代码是要用,配对的公钥配置在gitlab中)
加入了登陆自建harbor仓库的config文件
修改了ssh客户端的配置,不做指纹验证
安装一个docker的客户端
2.5:制作自定义镜像
//准备所需文件,拷贝至/data/dockerfile/jenkins
[root@k8s-6-96 ~]# cd /data/dockerfile/jenkins
[root@k8s-6-96 jenkins]# cp /root/.ssh/id_rsa .
[root@k8s-6-96 jenkins]# cp /root/.docker/config.json .
[root@k8s-6-96 jenkins]# cp /root/get-docker.sh .
// 查看目录下的文件
[root@k8s-6-96jenkins]# ll
total 32
-rw------- 1 root root 151 Nov 30 18:35config.json
-rw-r--r-- 1 root root 349 Nov 30 18:31Dockerfile
-rwxr-xr-x 1 root root 13216 Nov 30 18:31 get-docker.sh
-rw------- 1 root root 1675 Nov 30 18:35id_rsa
//执行build
[root@k8s-6-96 jenkins]# docker build . -t harbor.auth.com/infra/jenkins:v2.190.3
// 查看镜像
[root@k8s-6-96 jenkins]# docker images | grep jenkins
2.6:在harbor中创建infra仓库,并设置为私有
2.7:在任意运算节点上创建kubernetes名称空间并在此创建secret
[root@k8s-6-94 ~]# kubectl create namespaceinfra
[root@k8s-6-94 ~]# kubectl create secret docker-registry harbor --docker-server=harbor.auth.com --docker-username=admin --docker-password=Harbor12345 -n infra
2.8:在运维主机上推送镜像
[root@k8s-6-96 jenkins]# docker push harbor.auth.com/infra/jenkins:v2.190.3
3:准备共享存储,原因是:jenkins中数据需要进行持久化存储,使用nfs共享存储方式
3.1:需要在运维主机(192.168.6.96)上 和 运算节点(192.168.6.94,192.168.6.95)上安装nfs
注意:运算节点只需要安装nfs引擎,不需要做任何配置
// 安装nfs-utils
[root@k8s-6-96 ~]# yum install nfs-utils -y
// 配置nfs服务
[root@k8s-6-96 ~]# vi /etc/exports
/data/nfs-volume 192.168.6.0/24(rw,no_root_squash)
// 启动NFS服务(运算节点不需要启动nfs)
[root@k8s-6-96 ~]# mkdir -p /data/nfs-volume
[root@k8s-6-96 ~]# systemctl start nfs
[root@k8s-6-96 ~]# systemctl enable nfs
4:准备资源配置清单
4.1:在运维主机(192.168.6.96)上准备资源配置清单
[root@k8s-6-96 ~]# cd /data/k8s-yaml/[root@k8s-6-96 k8s-yaml]# mkdir /data/k8s-yaml/jenkins && mkdir /data/nfs-volume/jenkins_home && cd jenkins
4.2:编写资源配置清单
[root@k8s-6-96jenkins]# vi dp.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: jenkins
namespace: infra
labels:
name: jenkins
spec:
replicas: 1selector:
matchLabels:
name: jenkins
template:
metadata:
labels:
app: jenkins
name: jenkins
spec:
volumes:
-name: data
nfs:
server: k8s-6-96path: /data/nfs-volume/jenkins_home
-name: docker
hostPath:
path: /run/docker.sock
type: ''containers:
-name: jenkins
image: harbor.auth.com/infra/jenkins:v2.190.3imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080protocol: TCP
env:
-name: JAVA_OPTS
value: -Xmx512m -Xms512m
volumeMounts:
-name: data
mountPath: /var/jenkins_home
-name: docker
mountPath: /run/docker.sock
imagePullSecrets:
-name: harbor
securityContext:
runAsUser: 0strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1maxSurge: 1revisionHistoryLimit: 7progressDeadlineSeconds: 600
[root@k8s-6-96jenkins]# vi svc.yaml
kind: Service
apiVersion: v1
metadata:
name: jenkins
namespace: infra
spec:
ports:
-protocol: TCP
port: 80targetPort: 8080selector:
app: jenkins
[root@k8s-6-96jenkins]# vi ingress.yaml
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: jenkins
namespace: infra
spec:
rules:
-host: jenkins.auth.com
http:
paths:
- path: /backend:
serviceName: jenkins
servicePort: 80
4.3:应用资源配置清单
[root@k8s-6-94 ~]# kubectl apply -f http://k8s-yaml.auth.com/jenkins/dp.yaml
[root@k8s-6-94 ~]# kubectl apply -f http://k8s-yaml.auth.com/jenkins/svc.yaml
[root@k8s-6-94 ~]# kubectl apply -f http://k8s-yaml.auth.com/jenkins/ingress.yaml
[root@k8s-6-94 ~]# kubectl get pods -n infra
NAME READY STATUS RESTARTS AGE
jenkins-54b8469cf9-v46cc 1/1 Running 0168m
[root@k8s-6-94 ~]# kubectl get all -n infra
NAME READY STATUS RESTARTS AGE
pod/jenkins-54b8469cf9-v46cc 1/1 Running 0169m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/jenkins ClusterIP 10。100.183.210 80/TCP 2d21h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/jenkins 1/1 1 12d21h
NAME DESIRED CURRENT READY AGE
replicaset.apps/jenkins-54b8469cf9 1 1 1 2d18h
5:在DNS服务器(192.168.6.92)上添加域名
[root@k8s-6-92 ~]# vi /var/named/auth.com.zone
// serial 序列号进行+ 1
// 添加jenkins A记录
jenkins A 192.168.6.89[root@k8s-6-92 ~]# systemctl restart named
[root@k8s-6-92 ~]# dig -t A jenkins.auth.com @192.168.6.92 +short
192.168.6.89
二:配置Jenkins
1:浏览器访问:jenkins.auth.com,需要出去初始化密码
初始密码查看
[root@k8s-6-96 ~]# cat /data/nfs-volume/jenkins_home/secrets/initialAdminPassword
2:安装插件
3:设置用户,用户名:admin 密码:admin123
4:完成安装
5:使用admin登录
6:设置jenkins
6.1:设置configure global security,允许匿名用户访问
6.2:阻止跨域请求,勾去掉
6.3:安装流水线插件Blue-Ocean
在运维主机(192.168.6.96)上设置清华大学源,可以加速安装插件
cd /data/nfs-volume/jenkins_home/updates
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
安装插件Blue-Ocean
7:最后的准备工作
7.1:检查jenkins容器里的docker客户端,验证当前用户,时区
7.2:验证kubernetes名称空间创建的secret是否可登陆到harbor仓库
三:部署maven软件
编译java,早些年用javac-->ant -->maven-->Gragle 在运维主机hdss7-200上二进制部署,这里部署maven-3.6.2版本 mvn命令是一个脚本
1:下载安装包,并进行安装
目录8u232是根据docker容器里的jenkins的jdk版本命名
[root@k8s-6-96 ~]# tar zxf apache-maven-3.6.1-bin.tar.gz
[root@k8s-6-96 ~]# mv apache-maven-3.6.1 /data/nfs-volume/jenkins_home/maven-3.6.1-8u232
[root@k8s-6-96 jenkins_home]# cd maven-3.6.1-8u232/[root@k8s-6-96 maven-3.6.1-8u232]# ll
drwxr-xr-x 2 root root 97 5月 26 15:42bin
drwxr-xr-x 2 root root 42 5月 26 15:42boot
drwxr-xr-x 3 501 games 63 5月 26 15:46conf
drwxr-xr-x 4 501 games 4096 5月 26 15:42lib
-rw-r--r-- 1 501 games 13437 4月 5 2019LICENSE
-rw-r--r-- 1 501 games 182 4月 5 2019NOTICE
-rw-r--r-- 1 501 games 2533 4月 5 2019 README.txt
2:设置settings.xml国内镜像源
[root@k8s-6-96 ~]# vi /data/nfs-volume/jenkins_home/maven-3.6.1-8u232/conf/settings.xml
nexus-aliyun
*
Nexus aliyun
http://maven.aliyun.com/nexus/content/groups/public
3:制作jre底包镜像
1:从公网pull jre底包
[root@k8s-6-96 ~]# docker pull docker.io/stanleyws/jre8:8u112
[root@k8s-6-96 ~]# docker images |grep jre
stanleyws/jre8 8u112 fa3a085d6ef1 2years ago 363MB
[root@k8s-6-96 ~]# docker tag fa3a085d6ef1 harbor.auth.com/public/jre:8u112
2:准备java-agent的jar包
// java agent 收集jvm的信息,用于普罗米修斯监控
[root@k8s-6-96 ~]# wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar -O jmx_javaagent-0.3.1.jar
3:准备config.yml和entrypoint.sh
//config.yml 普罗米修斯的监控匹配规则
// docker运行的默认启动脚本entrypoint.sh
[root@k8s-6-96 ~]# vi config.yml
---rules:
- pattern: '.*'[root@k8s-6-96 ~]# vi entrypoint.sh
#!/bin/sh
M_OPTS="-Duser.timezone=Asia/Shanghai -javaagent:/opt/prom/jmx_javaagent-0.3.1.jar=$(hostname -i):${M_PORT:-"12346"}:/opt/prom/config.yml"C_OPTS=${C_OPTS}
JAR_BALL=${JAR_BALL}
exec java -jar ${M_OPTS} ${C_OPTS} ${JAR_BALL}
[root@k8s-6-96 ~]# chmod +x entrypoint.sh
注:C_OPTS:连接配置中心(Apollo)环境,以及Apollo的地址
JAR_BALL:jar包的名称
4:在harbor中创建base项目,并设置为公开
[root@k8s-6-96 ~]# docker push harbor.auth.com/public/jre:8u112
5:创建Dockerfile
[root@k8s-6-96 ~]# cd /data/dockerfile/jre8/[root@k8s-6-96 jre8]# mv /root/config.yml .
[root@k8s-6-96 jre8]# mv /root/entrypoint.sh .
[root@k8s-6-96 jre8]# mv /root/jmx_javaagent-0.3.1.jar .
[root@k8s-6-96jre8]# vi Dockerfile
FROM harbor.auth.com/public/jre8:8u112
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
echo 'Asia/Shanghai' >/etc/timezone
ADD config.yml /opt/prom/config.yml
ADD jmx_javaagent-0.3.1.jar /opt/prom/WORKDIR /opt/project_dir
ADD entrypoint.sh /entrypoint.sh
CMD ["/entrypoint.sh"]
6:构建镜像并上传到harbor仓库
[root@k8s-6-96 jre8]# docker build . -t harbor.auth.com/base/jre8:8u112
[root@k8s-6-96 jre8]# docker push harbor.auth.com/base/jre8:8u112
四:jenkins构建流水线,从git上拉取代码,进行编译成jar包,最后上传到harbor镜像仓库中
4.1:git版本
登陆jenkins----->选择NEW-ITEM----->item name :dubbo-demo----->Pipeline------>ok
需要保留多少此老的构建,这里设置,保留三天,30个
点击:“This project is parameterized”使用参数化构建jenkins
添加参数String Parameter:8个------Trim the string都勾选 app_name
流水线脚本:
pipeline {
agent any
stages {
stage('pull') { //get project code from repo
steps {
sh "git clone ${params.git_repo} ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.app_name}/${env.BUILD_NUMBER} && git checkout ${params.git_ver}"}
}
stage('build') { //exec mvn cmd
steps {
sh "cd ${params.app_name}/${env.BUILD_NUMBER} && /var/jenkins_home/maven-${params.maven}/bin/${params.mvn_cmd}"}
}
stage('package') { //move jar file into project_dir
steps {
sh "cd ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.target_dir} && mkdir project_dir && mv *.jar ./project_dir"}
}
stage('image') { //build image and push to registry
steps {
writeFile file: "${params.app_name}/${env.BUILD_NUMBER}/Dockerfile", text: """FROM harbor.auth.com/${params.base_image}
ADD ${params.target_dir}/project_dir /opt/project_dir"""
sh "cd ${params.app_name}/${env.BUILD_NUMBER} && docker build -t harbor.auth.com/${params.image_name}:${params.git_ver}_${params.add_tag} . && docker push harbor.auth.com/${params.image_name}:${params.git_ver}_${params.add_tag}"}
}
}
}
依次填入/选择:
app_name
dubbo-demo-service
image_name
app/dubbo-demo-service
git_ver
master
add_tag
190117_1920
mvn_dir
/
target_dir
./dubbo-server/target
mvn_cmd
mvn clean package -Dmaven.test.skip=true
base_image
base/jre8:8u112
maven
3.6.0-8u181
点击Build进行构建,等待构建完成。
构建完成之后,在harbor中可以查看到上传的镜像
交付jar包项目到K8S中:
创建资源配置清单:
[root@k8s-9-96]# deployment.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: dubbo-demo-consumernamespace: app
labels:
name: dubbo-demo-consumer
spec:
replicas:1selector:
matchLabels:
name: dubbo-demo-consumer
template:
metadata:
labels:
app: dubbo-demo-consumer
name: dubbo-demo-consumer
spec:
containers:- name: dubbo-demo-consumer
image: harbor.od.com/app/dubbo-demo-consumer:master_190119_2015
ports:- containerPort: 8080protocol: TCP- containerPort: 20880protocol: TCP
env:- name: JAR_BALL
value: dubbo-client.jar
imagePullPolicy: IfNotPresent
imagePullSecrets:-name: harbor
restartPolicy: Always
terminationGracePeriodSeconds:30securityContext:
runAsUser:0schedulerName:default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable:1maxSurge:1revisionHistoryLimit:7progressDeadlineSeconds:600
[root@k8s-9-96]# cat svc.yaml
kind: Service
apiVersion: v1
metadata:
name: dubbo-demo-consumernamespace: app
spec:
ports:-protocol: TCP
port:8080targetPort:8080selector:
app: dubbo-demo-consumer
clusterIP: None
type: ClusterIP
sessionAffinity: None
[root@k8s-9-96]# cat ingress.yaml
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: dubbo-demo-consumernamespace: app
spec:
rules:-host: demo.auth.com
http:
paths:- path: /backend:
serviceName: dubbo-demo-consumer
servicePort:8080
在任意一台运算节点上应用资源配置清单:
[root@k8s-6-96 ~]# kubectl apply -f http://k8s-yaml.od.com/dubbo-demo-consumer/deployment.yaml
deployment.extensions/dubbo-demo-consumer created
[root@k8s-6-96 ~]# kubectl apply -f http://k8s-yaml.od.com/dubbo-demo-consumer/svc.yaml
service/dubbo-demo-consumer created
[root@k8s-6-96 ~]# kubectl apply -f http://k8s-yaml.od.com/dubbo-demo-consumer/ingress.yaml
ingress.extensions/dubbo-demo-consumer created
4.2:SVN版本
如果连接的是SVN,构建方式几乎一样,同样是选择参数话构建
与git相比,去掉一个 git_ver 参数,修改流水线脚本
pipeline {
agent any
stages {
stage('pull') { //get project code from repo
steps {
sh"mkdir ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.app_name}/${env.BUILD_NUMBER} && svn checkout ${params.svn_repo} . --username=liyuanping --password=liypxxxx"}
}
stage('build') { //exec mvn cmd
steps {
sh"cd ${params.app_name}/${env.BUILD_NUMBER} && /var/jenkins_home/maven-${params.maven}/bin/${params.mvn_cmd}"}
}
stage('package') { //move jar file into project_dir
steps {
sh"cd ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.target_dir} && mkdir project_dir && mv *.jar ./project_dir"}
}
stage('image') { //build image and push to registry
steps {
writeFile file:"${params.app_name}/${env.BUILD_NUMBER}/Dockerfile", text: """FROM harbor.auth.com/${params.base_image}
ADD ${params.target_dir}/project_dir /opt/project_dir""" sh "cd ${params.app_name}/${env.BUILD_NUMBER} && docker build -t harbor.auth.com/${params.image_name}:${params.add_tag} . && docker push harbor.auth.com/${params.image_name}:${params.add_tag}"}
}
}
}
到此,jenkins 部署已完成
k8s部署jar包_学习K8S之路.6--- 在K8S中部署Jenkins,并使用Jenkins打包jar包相关推荐
- 友盟统计+渠道包_学习笔记
友盟统计+渠道包_学习笔记 资料: 官网:https://developer.umeng.com/docs/66632/detail/66889#h3-u5E38u89C1u95EEu9898 视频资 ...
- k8s ready 不调度_【零基础学云计算】k8s部署---master节点组件部署(三)
kube-APIserver组件介绍 kube-APIserver提供了k8s各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和数据中 ...
- mysql显示表已存在_「Docker系列」 如何在Docker中部署MySQL数据库?
Docker为部署和测试应用程序和数据库提供了许多优势,这些应用程序和数据库是应用程序不可或缺的一部分,因此很值得学习如何在Docker容器中部署和运行数据库. 本文中,我们会重点关注如下重点: 为M ...
- kubectl查看node状态_全栈之路:使用pm2自动化部署node项目
相关前三篇 全栈之路:前端工程师如何从 0 开始了解 Docker 全栈之路:vue-cli3 项目从搭建优化到docker部署 全栈之路:从零搭建docker+jenkins+node.js自动化部 ...
- react中如何注释代码_学习在您的React / JavaScript代码中发现红旗?
react中如何注释代码 by Donavon West 由Donavon West 学习在您的React / JavaScript代码中发现红旗? (Learn to spot red flags ...
- 犀牛建模软件的英文语言包_使用tidytext和textmineR软件包在R中进行主题建模(
犀牛建模软件的英文语言包 In this article, we will learn to do Topic Model using tidytext and textmineR packages ...
- python制作会动的表情包_利用python图片生成,需10几行代码,生成的动态表情包(小黄鸭)...
小编找到了10几行的,好玩的动态表情包生成的代码.分享分享! 这个程序怎么做呢?不要急,来听我给大家分析分析. 工具:程序环境 语言:Python 3.6 编辑器:Pycharm 程序步骤 实现字符动 ...
- tcpdump 抓二层包_可能是我见过的最简单易懂且实用的 TCPDump 和 Wireshark 抓包及分析教程!( 强烈建议收藏 )...
公众号关注 「奇妙的 Linux 世界」设为「星标」,每天带你玩转 Linux ! 本文将展示如何使用 tcpdump 抓包,以及如何用 tcpdump 和 wireshark 分析网络流量.文中的例 ...
- 本地tomcat启动war包_「shell脚本」懒人运维之自动升级tomcat应用(war包)
准备: 提前修改war包里的相关配置,并上传到服务器: 根据要自动升级的tomcat应用修改或添加脚本相关内容: tomcat启动脚本如是自己写的,要统一格式命名,如:xxx.xxxTomcat 等: ...
最新文章
- html中和over怎么显示div,js 解决隐藏与显示div的相关问题
- linux cut 用法
- C/S框架-发布和部署WebService
- XGBoost的理解
- java:能否得到一个对象的内存地址?
- 计算机符号的英文名,【常见符号英文名称】英文名称
- android开发(44) 使用了 SoundPool 播放提示音
- ORB-SLAM2双目开源框架 (1)
- python实用宝典_python 5个实用的技巧
- 双线性映射(Bilinear Maps)实现(有限域、循环群)
- 查看kms服务器信息,查看kms服务器地址
- E680I使用上的常见问题小结
- 做项目的一些思路(针对小白)
- 如何恢复android误删的文件夹,如何恢复误删的android手机文件
- ma-云计算 大数据 mapreduce概念和关系
- bat 命令获取当前目录和子目录下的所有文件的文件名
- 数字图像处理与Python实现-图像降噪-指数型高通滤波
- “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛 E	赛马 python
- 【读者群答疑】使用xlwings编程时,执行语句bk = xw.books.add()时报错
- python制作聊天软件_一步一步教你做聊天软件(Python实现+非阻塞)
热门文章
- oracle11g dataguard windows,Oracle11g 搭建DataGuard(笔记)
- python初学者之网络爬虫_Python初学者之网络爬虫(二)
- 第03课:Spring Boot 启动原理
- ThinkPHP5.0中Redis的使用和封装
- Lucene Document getBoost(float) 和 setBoost(float)
- 人工智能项目正在起飞:这对未来的工作意味着什么?
- 2015年10月15日作业
- 线程或进程绑定到特定的cpu
- Mac使用nginx+rtmp服务器
- 关于A*寻路算法的认识