推荐设备MORE

网页设计公司手机端—重塑经

网页设计公司手机端—重塑经

行业知识

根据jenkins交货微服务到kubernetes

日期:2021-02-18
我要分享
1)迅速的运用开发设计与交货
2)纯天然合适微服务,是微服务和Devops的公路桥梁
3)可扩展性,适用公有制云,独享云,原装机,虚似机
4)规范化的运用开发设计与公布:申明式API和Operator
5)全自动化运维管理:延展性伸缩式(HPA),常见故障自愈,负荷平衡,配备管理方法等

此外便是交货spring cloud到k8s以前说一下微服务的定义

什么叫微服务?

针对微服务有一个重要点求乞整为零,把一个大的运用却成一个小的不一样的运用
例如嘀嘀打车,初期在一个互连网运用上大部分全是单体构架,并不是遍布式的
单体状况下把许多程序都写一个程序中,随后一台网络服务器对全部服务开展运作,可是伴随着高并发的提升,这类单体构架显而易见承担不上了,那样得话就必须大家一件事们手机软件的斥责开展渐渐地的区划,将其脱离出去,产生一个一个的微服务,也便是好几个微服务的控制模块产生一个详细的运用,这种全是单独布署单独运作的,一个微服务也会运作在一个虚似机里边。

spring cloud微保障体系的构成

服务发觉 (Eureka,Cousul,zookeeper)
也便是申请注册管理中心更为微服尽量不能少的中间管理方法者,服务发觉的关键岗位职责便是将其他的微服务控制模块开展备案与管理方法,这就非常于日常生活中来啦一家企业,去工商局局开展备案一样的大道理,在服务发觉中它主包括了三身高控制模块,各自是eureka,cousul,zookeeper,这种spring cloud最底层都适用的申请注册管理中心,一般常见的是eureka和consul,那麼微服务搭建好啦以后,那麼微服务与微服务立即如何开展服务立即的通讯,或是微服务碰到了常见故障没法做到恳求得话(hystrix/ribbon/openfeign)
此外便是路由器与过虑关键是对于对外开放插口的曝露的,这儿关键涉及到zuul,spring cloud gateway,这2个部件关键为外界的启用者例如别的的系统软件与我们的微服务开展通讯的情况下,从外到内是如何相互开展浏览的,那麼这种便是由这2个部件开展进行的
配备管理中心便是储放大家运用程序配备的地区,将会大家有上一百多个运用程序,那麼每一个运用程序全是一个微服务,那麼便会造成一个很比较严重的难题,便是这种配备文档放到哪些地方例如每一个服务下都放一个xml,或是yml,维护保养起來是是非非常不便捷的,由于改一个主要参数,就需要对全部的运用开展调节,以便处理这一难题配备管理中心就出現了,非常于又出示了一个微服务将我们运用中常有的配备文档,都放到了配备管理中心中,那麼别的运用全是根据配备管理中心来获得到这种配备文档的而并不是大家要这一这一配备文档放进每一个程序中,那样的益处便是能够将大家的配备文档开展集中化的管理方法,只必须改一个地区全部地区都能起效

spring cloud微服务构成

信息系统总线,spring cloud stream或是spring cloud bus就跟大家的信息mq类似便是大家公布一个信息内容,到大家序列里边由别的的微服务或是别的的运用开展获得出示了系统软件与系统软件中间或是微服务与微服务中间的信息传送全过程,这一正中间提升了一个附加的物品称为信息系统总线,实际的信息系统总线能够是mq或是是Redis,不一样的生产商完成了不一样的完成
安全性操纵是对于大家安全性的管理方法,在大家传统式网站建设的情况下,运用的浏览操纵有受权的可使用这一作用,沒有受权的就没法开展浏览,安全性操纵在spring cloud中也是存有的出示了AUTH2.0计划方案的适用,路由协议监管便是一件事们信息传送的全过程要开展综合和监管,例如系统软件中有10个微服务,而这10个微服务是相互依靠的,第一个微服务它是最底层最基本的客户管理方法而第二个微服务是根据客户管理方法开发设计一个管理权限管理方法,在往上是运用管理方法,运用系统软件的拓展,每个微服务中间相互中间开展依靠在高层大家开展启用的情况下会安裝微服务的启用次序一级一级信息向下传送,那样做有一个难题来啦,假如正中间有一个阶段出現了难题,沒有响应服务大家在应用的视角当今大家的恳求不成功了,可是实际的阶段不知道道是在哪一块出現难题,那麼路由协议监管便是要我们快递公司精准定位信息传送全过程哪一个环节开展错误,有利于于大家难题的清查
spring cloud cli指令行专用工具,来完成大家开发设计来完成的一些作用,spring cloud cluster是一件事们群集管理方法的一个輔助专用工具

如今去交货微服务到k8s及第个demo仅作参照

一、公布步骤设计方案
二、提前准备基本自然环境
es中间署jenkins
四、jenkins pipeline及主要参数化搭建
五、jenkins在k8s中动态性建立代理商
六、自定搭建jenkins-slave镜像系统
es搭建jenkins ci系统软件
八、pipeline集成化helm公布spring cloud微服务

es
一、传统式的公布步骤是如何样的?
如今的这一公布步骤设计方案還是要和自身的新项目中来考虑,布局一个大致的拓扑图,那麼例如沒有那样的情景jenkins去公布微服务,它是一个如何样的步骤,做为运维管理来说最先要去拉编码,开发设计早已将这一新项目开发设计好啦,并消息推送到git库房中或是布署的独享的gitlab编码库房中,第一步做的便是将这一编码拉掉来,拉完编码,一般编码全是Java运用,会设计方案到一个编译程序,编译程序出去一个可布署的包,一般微服务是jar包,或是立即起动的运用程序,随后就刚开始去封裝这一服务了,一般便是将这一jar包或是运用程序,根据dockerfile去达到一个可布署的镜像系统,这一镜像系统一般会自身制作jdk自然环境,或是便是jre自然环境,便是基本镜像系统可以运作这一镜像系统的底包,最终一步便是布署到k8s中,这儿便会写一些yaml文档了去把这一镜像系统布署到k8s中,也便是器皿的编辑,此外也要考虑到如何将这一运用曝露出来,让客户浏览到。

应用jenkins全自动话公布的步骤是那么样的?
显而易见这类方法公布好几个微服务很不太高效,因此就必须ci/cd,那么一说,那麼有jenkins了,如何将这类方法全自动化起來,降低人力的干涉。
上边那幅图,最先是那样的,mit递交上来,随后再到jenkins了,pile编码的编译程序,docker build push ,镜像系统的搭建与消息推送到harbor库房中,随后deploy,将运用布署到k8s中,这儿呢因为将会是许多的微服务,那麼大家就必须模板的替代,去公布微服务,这儿大家便会必须采用它原生态的helm微服务公布专用工具赶到k8s之中去deploy,公布到检测自然环境中来,随后根据slb出示一个统一的出入口,公布出来,正中间造成的镜像系统也都是储放到harbor库房中,当QA检测沒有难题,这一镜像系统也便可以去公布生产制造自然环境中。

为何必须jenkins slave构架
此外这儿还提及了一个jenkins,slave的一个构架,关键的是能够动态性的能够进行这种每日任务,动态性的去生产调度一个设备和一个pod来进行这两步的每日任务,由于当每日任务许多时,也便是都会jenkins master去做,显而易见每日任务多了负荷就高了,因此就必须引进这一slave去处理这一难题。

二、提前准备基本自然环境,需要的部件来进行大家步骤的公布

1、k8s (ingress controller、coredns、pv全自动提供)
2、harbor,并开启chart储存作用,将大家的helm弄成chart共存放进harbor中
3、helm-v3 专用工具,关键来完成模板化,动态性的将运用3D渲染安裝与卸载掉,更强的去管理方法微服务
4、pose完成
5、MySQL,微服务数据信息库
6、在k8s中间署eureka(申请注册管理中心)

1、查验k8s基本部件的自然环境是不是安裝:
1、默认设置我的这一基本的部件全是安裝好的,ingress 和coredns

[ ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx nginx-ingress-controller-2vs56 1/1 Running 0 5h3m
ingress-nginx nginx-ingress-controller-586gw 1/1 Running 0 164m
ingress-nginx nginx-ingress-controller-pxztr 1/1 Running 0 5h3m
ingress-nginx nginx-ingress-controller-qp266 1/1 Running 0 5h6m
kube-system coredns-59fb8d54d6-vjn62 1/1 Running 0 5h4m
kube-system kube-flannel-ds-amd64-2hnkf 1/1 Running 0 5h4m
kube-system kube-flannel-ds-amd64-2smpl 1/1 Running 0 5h4m
kube-system kube-flannel-ds-amd64-jbrv4 1/1 Running 0 164m
kube-system kube-flannel-ds-amd64-jsxdf 1/1 Running 0 5h4m
es-dashboard dashboard-metrics-scraper-566cddb686-mddlb 1/1 Running 0 5h4m
es-es-dashboard-c4bc5bd44-wpgc7 1/1 Running 0 5h4m

1.2、k8s pv的全自动提供,这儿自然还可以应用Ceph长久化储存,因为我的检测自然环境配备不足,先拿NFS对有情况的运用完成全自动的PV提供。
先提前准备一台NFS网络服务器为K8S出示储存适用

[ ~]# yum -y install nfs-utils
建立共享资源的文件目录
[ ~]# mkdir /es -p
[ ~]# cat /etc/exports
/es 10.4.7.0/24(rw,no_root_squash)
[ es]# systemctl start nfs
[ ~]# systemctl enable nfs
而且要在每一个Node上安裝nfs-utils包,用以mount挂载时要。
[ ~]# mount -t nfs 10.4.7.22:/es /mnt
因为K8S不兼容NFS动态性提供,还必须先安裝nfs-client-provisioner软件
改动nfs的服务端详细地址和挂载的文件目录,它是我nfs-client的详细地址,假如效仿的必须将id_rsa.pub帮我
git clone git:zhaocheng172/nfs-client.git
[ nfs-client]# kubectl get pod
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 0 35m
nfs-client-provisioner-86dff449dd-68ngn 1/1 Running 0 106s

2、镜像系统库房Harbor
pose

# wget docker-ce/linux/CentOS/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# yum install docker-ce -y
# systemctl start docker
# systemctl enable docker
# tar zxvf harbor-offline-installer-v1.10.1.tgz
# cd harbor
# vi harbor.yml
hostname: 
# ./prepare
# ./install.sh --with-chartmuseum
# pose ps 

--with-chartmuseum 主要参数表明开启Charts储存作用。
开展浏览:
//http://www.dengb.com/Linux/upload/2020_05/20050.png" alt="es" />
2.3 配备Docker可靠任
因为habor未配备https,还必须在node连接点上的docker配备可靠任。

# cat /etc/docker/daemon.json 
 "registry-mirrors": ["pre>

3、helm-v3 专用工具
3.1安裝helm专用工具

[ helm]# wget helm-v3.0.0-linux-amd64.tar.gz
[ helm]# tar xf helm-v3.0.0-linux-amd64.tar.gz 
[ helm]# mv linux-amd64/helm /usr/bin/
[ helm]# helm --help

3.2 安裝push软件

# git clone zhaocheng172/helm-push.git
# tar zxvf helm-push_0.7.1_linux_amd64.tar.gz
# mkdir -p /root/.local/share/helm/plugins/helm-push
# chmod +x bin/*
# mv bin plugin.yaml /root/.local/share/helm/plugins/helm-push
3.3 加上repo
# helm repo add --username admin --password Harbor12345 myrepo chartrepo/library

3.4 消息推送与安裝Chart
helm安裝好有默认设置的模板,那麼大家先应用它的开展转化成一个chart包,用以大家检测消息推送到大家的Harbor库房中,这一Chart是当我们们布署完以后,官方网默认设置内置的模板,小的demo,install以后是一个Nginx的运用

[ ~]# mkdir chart-test
[ ~]# cd chart-test/
[ chart-test]# helm create test
[ chart-test]# helm install test01 test
NAME: test01
LAST DEPLOYED: Sat Mar 14 17:10:20 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by mands:
 export POD_NAME=$(kubectl get pods --namespace default -l "es.io/name=test,es.io/instance=test01" -o jsonpath="{.items[0].metadata.name}")
 echo "Visit pre>

这儿是立即应用她们自身写的模板建立的pod
查询这一pod早已一切正常运作,而这一test01就是我们自身起的姓名,这一布署的情况下通常为大家的微服务的名字
如果去加个--dry-run得话便是事先实行,一般看一下这一模板有木有都实行取得成功,有木有难题

[ chart-test]# helm install test02 --dry-run test/
[ chart-test]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-564dddddd6-dgv26 1/1 Running 8 26h
test01-f7f8c5759-zv9kf 1/1 Running 0 31s
没有什么难题得话大家就必须将这一chart达到一个包,便于下一次的情况下再用
[ chart-test]# helm package test/
Successfully packaged chart and saved it to: /root/chart-test/test-0.1.0.tgz
[ chart-test]# ls
test test-0.1.0.tgz
消息推送到大家的镜像系统harbor库房中
[ chart-test]# helm push test-0.1.0.tgz --username=admin --password=Harbor12345 chartrepo/library
Pushing test-0.1.0.tgz to chartrepo/library...
Done.

es
tgz包安裝helm ,一般用以以前制作的包,例如大家以前制作的模板,假如想应用了,那麼立即便可以再应用

[ ~]# helm install test02 test-0.1.0.tgz 
NAME: test02
LAST DEPLOYED: Sat Mar 14 17:49:00 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1

4、布署gitlab,这儿各自我梳理了2个方式来布署gitlab,第一个是英语版网页页面,第二个是汉语版网页页面
4.1#安裝gitlab,提议2c2g+

yum -y install policycoreutils openssh-server openssh-clients postfix
#改动postfix
sed -i 's/inet_interfaces = localhost/inet_interfaces = all/g' /etc/postfix/main.cf
sed -i 's/inet_protocols = all/inet_protocols = ipv4/g' /etc/postfix/main.cf
sudo systemctl enable postfix
sudo systemctl start postfix
curl -sS install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo EXTERNAL_URL="etc/gitlab/gitlab.rb
external_url 'pre>

4.pose布署汉语版Gitlab
1)最先在一台新的网络服务器上安裝docker-ce,并应用docker加快器,应用中国科技大学的加快器/阿里巴巴云加快器
pose
3)pose文档

[ ~]# mkdir gitlab
[ ~]# cd gitlab/
[]# pose.yml

4)建立有关文件目录,config储存gitlab配备信息内容,data 储存数据信息库,logs储存系统日志
[]# mkdir -p /opt/gitlab/{config,data,logs}
[]# ls -l /opt/gitlab/
total 0
drwxr-xr-x. 2 root root 6 Mar 14 19:44 config
drwxr-xr-x. 2 root root 6 Mar 14 19:44 data
drwxr-xr-x. 2 root root 6 Mar 14 19:44 logs
5)拉取gitlan汉语版镜像系统,pose必须等候
[]# docker pull zhaocheng172/gitlab-ce-zh:latest
6)起动gitlab器皿
在起动前,需先改动寄主机的22端口号,由于寄主机占有了22端口号,因此起动器皿会不成功,由于投射但是来,改动以下:
vim /etc/ssh/sshd_config
默认设置在第一7行改动:Port 2222
改动后,重新启动sshd:systemctl restart sshd
[]# netstat -anpt | grep 22
tcp 0 0 0.0.0.0:2222 0.0.0.0: LISTEN 31889/sshd
tcp6 0 0 :::2222 ::: LISTEN 31889/sshd
7)宣布起动
[]# pose up -d
work "gitlab_default" with the default driver
Creating gitlab ... done
[]# pose ps
 Name Command State Ports 
---------------------------------------------------------------------------------------------------------------
gitlab /assets/wrapper Up (health: starting) 0.0.0.0:22- 22/tcp, 0.0.0.0:443- 443/tcp, 0.0.0.0:80- 80/tcp
8)设定gitlab启动起动
[]# chmod +x /etc/rc.local 
[]# ls -l /etc/rc.local 
lrwxrwxrwx. 1 root root 13 Mar 14 12:57 /etc/rc.local - rc.d/rc.local
[]# echo "cd /root/pose up -d" /etc/rc.local
9)gitlab管理方法网页页面
键入配备的ip或是网站域名
这儿我是应用的网站域名登录
此外便是假如这台服务打开了selinux得话,如果重新启动设备得话会造成ssh联接不了,处理方式要不便是关掉selinux,pose布署gitlab官方网强烈推荐的是改动22端口号,因此要改动一些配备
或是要不便是立即
#sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久性
# 安裝改动专用工具
yum -y install policycoreutils-Python
# 查询selinux中的ssh的端口号,輸出为 22
semanage port -l | grep ssh
# 增加端口号
semanage port -a -t ssh_port_t -p tcp 2222
因为我是拿检测机做的因此我必须将这一载入我windows的C:\Windows\System32\drivers\etc\hosts
192.168.30.27 
192.168.30.28 
pose.yml下才可以重新启动
pose restart
客户:root,初次登录必须手动式设定登陆密码

es
es
将编码消息推送到gitlab中
建立ms的库房名字
es
建立完必须大家将大家的当地的编码提交到gitlab中来

如今大家先复制一下大家这一ms的库房到当地来
设定git全局性设定,这儿大家必须大家的客户也便是大家gitlab去登陆这一服务平台的账户,递交编码的情况下大家必须做到master支系,别的的开发设计去应用这一gitlab的情况下大家必须给他们去建立一个客户,也便是在gitlab去建立的,便于他们递交编码到库房中
[]# mkdir ms
[]# cd ms
[ ms]# git config --global user.name "zhaocheng"
[ ms]# git config --global user.email "zhaocheng"

 

见到仅有一个库房。里边是空的,这一地区必须键入大家gitlab的账户与登陆密码,那样得话才可以有浏览操纵,给你去拉这一编码

[ ms]# git clone root/ms.git
Cloning into 'ms'...
Username for '/.30.28': 
warning: You appear to have cloned an empty repository.

当我们们git clone以后这儿有遗留下下的空文件目录,由于它是刚刚大家去检测去拉的编码,若有编码得话就拉取出来了

[ ms]# ls
ms

如今将开发设计写的编码缓解压力以后,将里边的服务都复制到刚刚大家拉替代码遗留下的空库房中

[ ms]# ls
ms simple-microservice-master simple-microservice-master.zip
[ ms]# cp simple-microservice-master/* -rf ms
[ ms]# cd ms
[ ms]# ls
mon eureka-service k8s lombok.config pom.xml product-service stock-service
db gateway-service LICENSE order-service portal-service README.md

递交缓存文件区
[ ms]# git add .

[ ms]# mit -m "all"

消息推送到gitlab中

[ ms]# git push origin master
Username for '/.30.28': 
Counting objects: 515, done.
pression using up to 2 threads.
Compressing objects: 100% (411/411), done.
Writing objects: 100% (515/515), 15.62 MiB | 17.78 MiB/s, done.
Total 515 (delta 60), reused 0 (delta 0)
remote: Resolving deltas: 100% (60/60), done.
To root/ms.git
 * [new branch] master - master

如今早已将编码消息推送到gitlab中

es
此外便是假如别的的开发设计工作人员必须将编码递交到gitlab上得话,那麼大家就必须给他们去建立一个客户,设定一定的管理权限,随后制订好登陆密码,告知他,它应用自身的账户去管理方法自身的新项目编码
es
此外便是在应用jenkins做不断集成化的情况下,假如传统式的一般会必须对gitlab做SSH秘钥对的验证,也便是在jenkins转化成秘钥对,私钥自身存着将公匙放到右上方的gitlab账户处,会见到settings的下边,将公匙放进特定框中,也便是jenkins必须有权利限去拉取gitlab上的编码,如今早已适用在Jenkins中以key的方式储存的slavepod中

此外便是支系表明
master主支系,有且仅有一个
release网上支系,通常是网上版本号,网上版本号公布后,会将release支系合拼到master
develop 开发设计支系,一般给检测布署自然环境或是装包的支系,每一个人到自身的支系上开发设计进行后,向develop支系合拼
feature 一般为一个作用支系或是本人支系,一般有许多个,一般合拼进行之后删掉

5、mysql 微服务数据信息库
导进数据信息库到Mysql

[ ~]# cd simple-microservice-dev3
[ simple-microservice-dev3]# ls
mon gateway-service lombok.config portal-service stock-service
db k8s order-service product-service
eureka-service LICENSE pom.xml README.md
[ simple-microservice-dev3]# cd db/
[ db]# ls
order.sql product.sql stock.sql
[ db]# scp * .30.24:~

这儿呢以前碰到一个难题当布署gitlab以后假如是应用的docker去布署的gitlab默认设置的22端口号改为2222端口号以后当用别的网络服务器开展scp或是ssh登陆的情况下便会显示信息拒接

[ db]# scp order.sql .30.28:/root/
Permission denied (publickey).
lost connection

这儿我安裝了一个mariadb的案例开展检测

[-gitlab ~]# yum install mariadb mariadb-server mariadb-devel
[-gitlab ~]# systemctl start mariadb
[-gitlab ~]# netstat -anpt |grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 6226/mysqld 

改动mariadb的登陆密码,默认设置沒有登陆密码

[ ~]# mysql -u root -p
MariaDB [(none)] set password for  = password('666666');
MariaDB [(none)] flush privileges;

建立数据信息库

MariaDB [(none)] create database tb_order;
MariaDB [(none)] create database tb_product;
MariaDB [(none)] create database tb_stock;
进到order数据信息库,将我们网站根目录下的sql句子导进大家的数据信息库文件
MariaDB [(none)] use tb_order;
MariaDB [tb_order] source /root/order.sql;
进到product数据信息库,将我们网站根目录下的sql句子导进大家的数据信息库文件
MariaDB [tb_order] use tb_product ;
MariaDB [tb_product] source /root/product.sql
进到stock数据信息库,将我们网站根目录下的sql句子导进大家的数据信息库文件
MariaDB [tb_product] use tb_stock ;
Database changed
MariaDB [tb_stock] source /root/stock.sql;
MariaDB [tb_stock] show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| tb_order |
| tb_product |
| tb_stock |
| test |
+--------------------+
7 rows in set (0.00 sec)

6、将eureaka群集布署到k8s中

[ ~]# yum install java-1.8.0-openjdk maven -y
手机软件包 1:java-1.8.0-openjdk-1.8.0.222.b10-0.el7_6.x86_64 已安裝
将eureka-service开展maven编译程序能够实行的jar包
[ simple-microservice-dev1]# mvn clean package -D maven.test.skip=true

会在target下边转化成jar包

[ eureka-service]# ls
Dockerfile pom.xml src target

将这一eureka制作成一个镜像系统,随后编辑yaml文档好让这一器皿运作起來

[ eureka-service]# cat Dockerfile 
FROM java:8-jdk-alpine
RUN apk add -U tzdata \
 ln -sf /usr//Asia/Shanghai /etc/localtime
COPY ./target/eureka-service.jar ./
EXPOSE 8888
CMD java -jar -Deureka.instance.hostname=${MY_POD_NAME}.eureka.ms /eureka-service.jar

搭建并提交到大家的harbor库房中,
[ eureka-service]# docker build -t eureka .

这儿必须大家去大家的Harbor建立一个新项目库房的名字,这儿是建立的microservice,并达到消息推送大家镜像系统的tag名字,那样消息推送的情况下会立即要我们镜像系统库房的详细地址
[ eureka-service]# docker tag eureka 192.168.30.27/microservice/eureka:latest
提交到大家的harbor上

这儿必须登陆一下大家的harbor库房,才可以提交

[ ~]# docker login 192.168.30.27
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
mandline/login/#credentials-store
eeded
[ eureka-service]# docker push 192.168.30.27/microservice/eureka:latest 

建立k8s登陆harbor信息内容验证,这儿并提早建立好取名室内空间ms,那样k8s才可以到harbor库房拉取镜像系统有这一secret
先建立一个ms的取名室内空间

[ eureka-service]# kubectl create ns ms
namespace/ms created
[ eureka-service]# kubectl get ns
NAME STATUS AGE
default Active 68m
ingress-nginx Active 55m
kube-node-lease Active 68m
kube-public Active 68m
kube-system Active 68m
ms Active 4s
[ k8s]# kubectl create secret docker-registry registry-pull-secret --docker-server=192.168.30.27 --docker-username=admin --docker-password=Harbor12345 --docker-email=admin -n ms

查询情况

[ ~]# kubectl get pod,svc,ing -n ms
NAME READY STATUS RESTARTS AGE![](images/blog/202003/28/0c07c95b7ce22d59bc7d2bd.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
pod/eureka-0 1/1 Running 1 16h
pod/eureka-1 1/1 Running 0 16h
pod/eureka-2 1/1 Running 1 16h

浏览eureka
es
es中间署jenkins
es
在k8s中来布署jenkins必须留意的是自身它必须一个储存,便是它必须储存这种软件和配备的job全是必须储存的,而大家布署到k8s中这一pod不是固定不动的,有将会在第一个连接点也是有将会在第二个连接点,那么就必须确保这一jenkins这一储存作用换一个连接点也可以即时载入到,这就采用了k8s的pv和pvc了,便会应用到长久化储存,那样得话便会采用pv的全自动提供,随后用jenkins长久化文件目录到pv上,长久到远程控制的储存上

建立一个service-account关联到rbac里边,rbac关键便是设定一些管理权限让jenkins浏览到k8s,service-connout关键是让pod浏览到apiserver,它去apiserver生产调度建立pod
它是我jenkins的详细地址,假如效仿的必须将id_rsa.pub帮我

git clone git:zhaocheng172/jenkins-k8s.git
[ jenkins]# ls
deployment.yml ingress.yml rbac.yml service-account.yml service.yml

deployment主要参数详细说明:
关键来布署jenkins的器皿的配备

查询建立的storage class

[ jenkins]# kubectl get sc
NAME PROVISIONER AGE
managed-nfs-storage fuseim.pri/ifs 22h

service主要参数:
这儿关键便是应用nodeport去对外开放一个端口号,此外一般生产制造自然环境都应用ingress,ingress必须关系service,也要应用nginx做反方向代理商,将这一网站域名根据slb公布出来
[ jenkins]# kubectl apply -f .

四、jenkins pipeline及主要参数化搭建
jenkins pipeline是一套软件,适用在jenkins中完成集成化和不断交货管路;
pipeline根据特殊英语的语法对简易到繁杂的传送管路开展模型;

申明式:遵照与Groovy同样英语的语法。pipeline{} 脚本制作式:适用Groovy大部分分作用,也是是非非常表述和灵便的专用工具。node{}
*jenkins pipeline的界定被载入一个文字文档,称之为jenkinsfile。

去Manage jenkins去安裝软件,寻找manage plugins ,点一下Available查找pipeline,开展安裝,安裝后挑选install without restart
如今去建立一个水流线开展检测一下
布署完以后可使用log查询登陆的登陆密码

[ jenkins]# kubectl logs jenkins-7d5fbd857d-tmwbm 
6e22df63432f474f863dc07c9d291967

es
一般最好进来的情况下躁动不安装软件,第一默认设置应用的海外的源,免费下载软件的情况下比较慢,大家必须做个一些提升
es
es

先建立一个test的pipeline的英语的语法水流线,了解一下如何公布每日任务
es
在这里里便可以见到英语的语法的文件格式,这儿分成二种,以pipeline开始的也叫申明式英语的语法,关键遵照的Groovy的同样英语的语法来完成的pipeline {}
这一也是较为流行的方法。
es
检测一个hello的英语的语法,默认设置出示的pipeline,开展应用
es
立即build,这一就可以搭建
es
当我们们搭建进行后,这儿会显示信息一个实行的流程显示信息一个实际的內容,能看到jenkins的工作中文件目录,默认设置传统式布署jenkins的文件目录为/root/.jenkins下,而做为在k8s布署jenkins必须考虑到数据信息的长久化了,由于pod碰到不确定性的要素开展重新启动以后,那麼这一pod的数据信息便会遗失,因此对于这一难题,大家就必须将这一pod的工作中文件目录挂载到长久卷上,那样得话,即便pod重新启动飘挪到别的的连接点也可以载入到相对的数据信息了。
es
能看到k8s的长久化文件目录是在这里个jobs文件目录下,将大家搭建的內容和数据信息都放到这儿了。

[ ~]# ll /es/default-jenkins-home-pvc-0d67f7f5-2b31-4dc8-aee2-5e7b9e0e7e19/jobs/test/
总用量 8
drwxr-xr-x 3 1000 1000 50 一月 13 11:36 builds
-rw-r--r-- 1 1 一月 13 11:36 config.xml
-rw-r--r-- 1 1000 1000 2 一月 13 11:36 nextBuildNumber

检测一个hello的pipeline的英语的语法文件格式

pipeline {
 agent any
 stages {
 stage('Build') {
 steps {
 echo "hello" 
 stage('test') {
 steps {
 echo "hello"
 stage('deploy') {
 steps {
 echo "hello"
}

操纵台輸出了三个每日任务,各自实行hello,大约便是这一模样
es
文件目录也长久化了,见到增加的jenkins的新项目每日任务
[ ~]# ll /es/default-jenkins-home-pvc-0d67f7f5-2b31-4dc8-aee2-5e7b9e0e7e19/jobs/
总用量 0
drwxr-xr-x 3 1000 1000 61 一月 13 11:36 test
drwxr-xr-x 3 1000 1000 61 一月 13 14:04 test-demo
es
jenkins pipeline如同一个管路的模型一样,mit id,到build搭建,再到test检测,再到stage流程做一些解决,deploy布署到dev或是qa自然环境中,最终到网上,实际上在这里个步骤中它是有一个目地的,一开始是在开发设计自然环境,最后是把它送到网上自然环境,而正中间一系列产品的步骤全是根据管路的方式串起來,而这一管路这一实体模型是根据pipeline去撰写的,这一英语的语法便是这一实体模型,必须把这一性命周期时间的需要的都套进这一实体模型中来,随后由jenkins pipeline去管理方法

第一用这一pipepine它有非常大的特性
1、可视性化网页页面,每一个流程都可以以可视性化展现,便捷大家去处理每一个流程的有关难题
2、每一个流程都写脚本制作里边了,只必须维护保养这一脚本制作就行了,而这一脚本制作能够写的具备通用性性,假如想写好几个新项目时,例如公布3组微服务,那麼第一个写的pipeline,那麼也一样可用于第二个和第三个微服务的模板。那麼这一必须考虑到他们有什么不一样点?
不一样点:
1)拉取git编码的详细地址不一样
2)支系名都不一样,由于不是同的git详细地址,因此打的支系名都不一样。
3)布署的设备都不一样,有将会这好多个服务中心署在node1,此外的服务中心署在node2或是node3
4)搞出的包名不一样
因此要把这种不一样点,制成一种人力互动的方式去公布,那样得话这一脚本制作才具备通用性性,公布服务才可以应用这写好的pipeline公布大量的微服务,并且jenkins pipeline适用主要参数化搭建。
es
这儿也便是pipeline一些的英语的语法,例如挑选parameters主要参数化搭建,挑选框式主要参数choice parameter,例如给它好多个值,随后让它动态性的去键入,或是凭证主要参数credentials parameter,或是文档主要参数file parameter,或是登陆密码主要参数password parameter,或是运作主要参数 run parameter,或是标识符串主要参数 string paramether ,或是几行标识符串主要参数multi-line string parameter,或是布尔运算型主要参数boolean parameter

例如挑选choice parameter,挑选型主要参数
es
例如公布的git详细地址不一样,那麼就必须好几个详细地址能够去挑选,必须应用choice parameter挑选框型主要参数,这一能够反映在搭建的网页页面,还可以反映在configure配备的网页页面,那样配备也较为不便,因此立即在configure里边立即加上相匹配的主要参数便可以
先配备一个看一下实际效果
es
将转化成的挑选型主要参数加上到特定的pipeline的英语的语法中,save一下
es
再返回新项目中能看到build姓名从build now换为了build with parameters,也便是提升了几行的的配备,能够开展挑选的去拉去哪里个支系下的编码了
es
还可以在configure去配备,这2个地区都可以以加上,如果再加上一个立即add parameter,能够挑选多种多样种类的主要参数协助大家去搭建这一多种多样式的要求
es
再例如支系这一块,将会每一次打的支系也不同,这一并不是固定不动的,因此必须一个git的主要参数化搭建,那麼这一就必须动态性的去从挑选的git详细地址获得到当今的全部的支系
也有一个遍布的设备不一样,这一还可以应用刚刚的choice parameter,将好几个服务器的ip也进来

es
将这一生产制造的英语的语法,拷贝到pipeline英语的语法中
choice choices: ['10.4.7.12', '10.4.7.21', '10.4.7.22'], description: '公布哪台node上', name: 'host'
es
搭建一下,发觉还可以应用挑选型主要参数了,相近这一的人力互动便可以挑选好几个主要参数了,能够写一个通用性的模板,就解决人力互动的逻辑性
es
如今大家能够去人力挑选了,这儿面的值如何获得到,大家解决不一样的新项目,务必在这里里边去完成,例如挑选这一git以后,拉取这一编码编译程序搭建,这种将会全是一些同样点,不一样点公布的设备不一样,因此应选择客户是取得的哪一个git详细地址,公布的哪一个设备,在脚本制作里去取得,实际上默认设置这一name便是一个自变量,jenkins早已将这一授予自变量,而且pipeline能够立即获得这一自变量名,便是刚刚界定的git,host这一姓名,那麼大家从刚刚设定的parameters里去检测这一自变量并不能够取得,取得得话表明这一就非常好好去处理
es
搭建一下,如今搭建取得成功后早已是搭建取得成功了,也早已获得到刚刚大家的git这一主要参数下的值了
es

拥有这种方法,便可以将这种不一样点根据里边的agent和shell脚本制作来解决了,写pipeline主要参数化搭建便是考虑大量的一个要求,能兼容大量的新项目,能令人工干涉的做一些繁杂的每日任务

五、jenkins在k8s中动态性建立代理商
怎样在k8s中动态性的建立slave代理商?
当进行这种每日任务以后考虑到的难题,这种每日任务全是在jenkins设备去进行的,那麼这一也毫无疑问是在pod中来运作的,由于大家的是将jenkins布署在pod中的,也便是这当今的这一连接点去进行的拉替代码,编译程序,搭建镜像系统,公布,那麼将会会碰到一个难题,那麼新项目许多,每日做不断集成化很高,十几回乃至上百次,应对那样的一个要求量,当今的这一pod是难以支撑点的,就行比刚刚的job,有十好多个人去运作,来运作不一样的服务,原本是能够一些钟进行的事儿,最终造成10分多钟才实行进行,那样得话就很耽搁新项目进展了,因此就必须应用jenkins的master-slave构架了,而master只承担生产调度分派,slave来进行这种job每日任务,而slave是由物理学机或是虚似机存有的,和master维持通讯,要是有每日任务就下达到slave连接点,那样就处理了单jenkins的特性难题了

es
也便是提早建立很多jenkins-slave,在别的连接点让他们未确定着,当master有些人点job搭建了,这一jenkins会帮你将这一job实际做的事,分享到slave去干活,master也就启到一个领导干部的人物角色,它自身就没有什么工作压力了,只承担生产调度了,那麼假如无需k8s的器皿的那样构架,就行比在一台设备上用了一个jenkins,随后找台服务器做slave,在manage node,加上new node,随后这一便会根据master下达每日任务让slave去进行了。

那麼大家的jenkins是以k8s去布署的,因此大家的slave也是以k8s中来考虑到,便可以将这一slave当做一个pod好去处理,master就拿这一pod好去处理
es
这一得话也便是能够事先起一些slave,还可以动态性的去建立slave,如果事先起动slave得话,将会会耗费一些資源,这种資源也其实不是务必要耗费的,因此就需要考虑到动态性的去考虑到slave,也便是即开即用,无需就消毁了,当这一量大的情况下,这一就较为显著了,因此在k8s中来建立代理商能够根据软件去保证的安裝软件的情况下大家必须在大家的长久化文件目录中来改动大家的海外详细地址

[ updates]# sed -i 's/http:\/\/updates.\/download/https:\/\/mirrors.tuna.tsinghua.\/jenkins/g' default.json \
sed -i 's/http:\/\//https:\/\//g' default.json

在jenkins网页页面上restart,重新启动jenkins起效

要想动态性的去在k8s中建立slave pod,因此要联接k8s,界定联接k8s的详细地址多少钱,建立slave pod联接jenkins的详细地址多少钱
寻找管理方法jenkins 这儿,寻找系统软件配备configure system
当安裝好软件以后,会在最下边发觉一个cloud
es
这儿联接k8s立即应用service的详细地址便可以,由于大家布署了coredns立即能够就需要分析到这一k8s,点一下联接检测能够联接
es
假如jenkins是出外部去布署的,也便是独立哪台网络服务器去布署的,走的传统式布署,也便是要联接k8s对外开放的详细地址也便是2020_05/20051.png" alt="es" />
而且也有将jenkins的详细地址也写上,//http://www.dengb.com/Linux/upload/2020_05/20058.png" alt="es" />
如今jenkins早已了解要联接哪一个k8s,那麼再去建立这一slave器皿的pod,要建立pod务必就的必须镜像系统,假如沒有镜像系统,即便jenkins像k8s进行建立一个pod,k8s毫无疑问不知道道去建立哪一个pod,务必有镜像系统,这一镜像系统也便是slave的镜像系统,因此下一步大家必须做的便是搭建一个镜像系统。
让k8s应用这一镜像系统拉取一个pod,而这一镜像系统制作得话,看必须甚么自然环境的包。

六、自定搭建jenkins-slave镜像系统
jenkins slave制作这一镜像系统看必须甚么?
1、必须甚么开发设计語言?由于slave去进行的必须编码的编译程序,假如是java的語言,那麼就必须maven的自然环境,假如是go就必须去用go去编译程序,因此开发设计語言不一样,slave所做的事自然环境都不一样
2、附加自然环境,例如docker,必须打镜像系统对微服务,及其消息推送到镜像系统库房都必须docker的自然环境,还会继续应用helm,helm是立即将服务中心署到k8s中。

例如就拿java新项目为例子,一般微服务也全是应用java去写的
编码的编译程序,一般应用较为多的便是maven,这一maven还依靠jdk,装包镜像系统必须docker,大家必须应用helm去做不断布署,因此这也便是这一镜像系统里边必须封裝的依靠

此外也有一点,这一镜像系统如何去作为一个slave去存有呢,传统式的在网页页面加上一个便可以了,当联接的情况下,会联接到slave连接点帮你起动一个agent,也便是下达一个jar包,这一agent便可以立即和master去互动了,那麼将这一jar包kill掉,这一slave也便是不能用情况了,因此他们立即的一个互动便是由自身完成的一个程序去进行的,每一个slave上边会出现一个agent,master与agent去互动,agent去进行这一job每日任务,那麼这一镜像系统里边也得必须包括这一agent这一jar包,传统式的方法会全自动的帮你来安裝了,可是镜像系统的还得自身去再加,再加以后才可以去联接jenkins,master才可以去下达每日任务

[ jenkins-slave]# ls
Dockerfile helm jenkins-slave kubectl settings.xml slave.jar

这一jenkins-slave是一个脚本制作关键来起动这一slave.jar,那麼这一还需
要一个docker自然环境,自身这一pod便是以docker container起动的,那麼这一pod也便可以做数据信息卷挂载了,由于这一pod是在每一个node上来起动的,每一个node上面有docker,那麼立即便可以把每一个node上的docker挂载到器皿中便可以了,因此这就采用了一个docker in docker,这一器皿里边又拥有一个docker的自然环境,因此大家必须写数据信息卷将它挂载进去,也有kubectl这一取名,一般关键来查询pod的一些情况,并且应用这一指令来进行k8s的各种各样各种各样的实际操作,可是必须它这一指令,只必须它联接k8s的验证信息内容,由于k8s有它的鉴权
如今将这一镜像系统装包成镜像系统消息推送到镜像系统库房中

[ jenkins-slave]# cat Dockerfile 
FROM centos:7
RUN yum install -y java-1.8.0-openjdk maven curl git libtool-ltdl-devel \ 
 yum clean all \
 rm -rf /var/cache/yum/* \
 mkdir -p /usr/share/jenkins
COPY slave.jar /usr/share/jenkins/slave.jar 
COPY jenkins-slave /usr/bin/jenkins-slave
COPY settings.xml /etc/maven/settings.xml
RUN chmod +x /usr/bin/jenkins-slave
COPY helm kubectl /usr/bin/
ENTRYPOINT ["jenkins-slave"]

搭建镜像系统的情况下能够立即写harbor的详细地址加镜像系统的名字,那样立即能够push,要不然搭建完还得打个tag

[ jenkins-slave]# docker build . -t 192.168.30.27/library/jenkins-slave:jdk-1.8
[ jenkins-slave]# docker push 192.168.30.27/library/jenkins-slave 

查询库房早已将镜像系统消息推送取得成功
es

如今便可以去检测能否动态性的去建立jenkins-slave,必须将pipeline这一脚本制作能去启用刚刚大家配备的k8s的软件
jenkins官方网详细地址得出了有关的pipeline启用k8s的软件的使用方法
es

es搭建jenkins ci系统软件
如今去动态性的在pipeline去引入并建立一个slave的镜像系统,应用pipeline在k8s去运作这一pod,随后将这一pod公布大家的每日任务,刚刚大家是先安裝的软件,以对jenkins能够完成slave的代理商,能够一切正常去互动,又制作了大家的slave的镜像系统,将java需要的配备也都封裝在这里个slave里边那样得话,大家便可以选用这一slave来进行下达的每日任务了,而master只做为一个管理方法连接点给他们们下达每日任务到slave上
就是我们的pipeline,如今现阶段是可使用大家这一slave这一镜像系统来公布每日任务

安裝pipeline软件

pipeline {
 agent {
 es {
 label 'jenkins-slave'
 yaml """
apiVersion: v1
kind: Pod
metadata:
 name: jenkins-slave
spec:
 containers:
 - name: jnlp
 image: "192.168.30.27/library/jenkins-slave:jdk-1.8"
 stages {
 stage('Build') {
 steps {
 echo "hello" 
 stage('test') {
 steps {
 echo "hello"
 stage('deploy') {
 steps {
 echo "hello"
}

es
如今能够在jenkins中动态性的去建立pod,仅有有下达每日任务的情况下才去建立pod,而jenkins-master只承担每日任务生产调度,slave来做每日任务解决来节约資源,当每日任务进行以后,这一slave-pod也会全自动的消毁
[ ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
jenkins-7d5fbd857d-6tgdj 1/1 Running 0 23m
jenkins-slave-gdtqz-p17b1 1/1 Running 0 40s

八、pipeline集成化helm公布spring cloud微服务
es
如今撰写这一pipeline脚本制作来完成全自动化公布微服务

#!/usr/bin/env groovy
// 需要软件: Git Parameter/Git/Pipeline/Config File es/Extended Choice Parameter
// 公共性
def registry = "192.168.30.27"
// 新项目
def project = "microservice"
def git_url = "root/ms.git"
def gateway_domain_name = ""
def portal_domain_name = ""
// 验证
def image_pull_secret = "registry-pull-secret"
def harbor_registry_auth = "e5402e52-7dd0-4daf-8d21-c4aa6e47736b"
def git_auth = "a65680b4-0bf7-418f-a77e-f20778f9e737"
// ConfigFileProvider ID
def k8s_auth = "7ee65e53-a559-4c52-8b88-c968a637051e"
pipeline {
 agent {
 es {
 label "jenkins-slave"
 yaml """
kind: Pod
metadata:
 name: jenkins-slave
spec:
 containers:
 - name: jnlp
 image: "${registry}/library/jenkins-slave-jdk:1.8"
 imagePullPolicy: Always
 volumeMounts:
 - name: docker-cmd
 mountPath: /usr/bin/docker
 - name: docker-sock
 mountPath: /var/run/docker.sock
 - name: maven-cache
 mountPath: /root/.m2
 volumes:
 - name: docker-cmd
 hostPath:
 path: /usr/bin/docker
 - name: docker-sock
 hostPath:
 path: /var/run/docker.sock
 - name: maven-cache
 hostPath:
 path: /tmp/m2
 parameters {
 gitParameter branch: '', branchFilter: '.*', defaultValue: '', description: '挑选公布的支系', name: 'Branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'PT_BRANCH' 
 extendedChoice defaultValue: 'none', description: '挑选公布的微服务', \
 multiSelectDelimiter: ',', name: 'Service', type: 'PT_CHECKBOX', \
 value: 'gateway-service:9999,portal-service:8080,product-service:8010,order-service:8020,stock-service:8030'
 choice (choices: ['ms', 'demo'], description: '布署模版', name: 'Template')
 choice (choices: ['1', '3', '5', '7'], description: '团本数', name: 'ReplicaCount')
 choice (choices: ['ms'], description: '取名室内空间', name: 'Namespace')
 stages {
 stage('拉替代码'){
 steps {
 checkout([$class: 'GitSCM', 
 branches: [[name: "${params.Branch}"]], 
 doGenerateSubmoduleConfigurations: false, 
 extensions: [], submoduleCfg: [], 
 userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]
 stage('编码编译程序') {
 // 编译程序特定服务
 steps {
 sh """
 mvn clean package -Dmaven.test.skip=true
 stage('搭建镜像系统') {
 steps {
 withCredentials([usernamePassword(credentialsId: "${harbor_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
 sh """
 docker login -u ${username} -p '${password}' ${registry}
 for service in \$(echo ${Service} |sed 's/,/ /g'); do
 service_name=\${service%:*}
 image_name=${registry}/${project}/\${service_name}:${BUILD_NUMBER}
 cd \${service_name}
 if ls |grep biz /dev/null; then
 cd \${service_name}-biz
 docker build -t \${image_name} .
 docker push \${image_name}
 cd ${WORKSPACE}
 done
 configFileProvider([configFile(fileId: "${k8s_auth}", targetLocation: "admin.kubeconfig")]){
 sh """
 # 加上镜像系统拉取验证
 kubectl create secret docker-registry ${image_pull_secret} --docker-username=${username} --docker-password=${password} --docker-server=${registry} -n ${Namespace} --kubeconfig admin.kubeconfig |true
 # 加上独享chart库房
 helm repo add --username ${username} --password ${password} myrepo chartrepo/${project}
 stage('Helm布署到K8S') {
 steps {
 sh """
 common_args="-n ${Namespace} --kubeconfig admin.kubeconfig"
 for service in \$(echo ${Service} |sed 's/,/ /g'); do
 service_name=\${service%:*}
 service_port=\${service#*:}
 image=${registry}/${project}/\${service_name}
 tag=${BUILD_NUMBER}
 helm_args="\${service_name} --set image.repository=\${image} --set image.tag=\${tag} --set replicaCount=${replicaCount} --set imagePullSecrets[0].name=${image_pull_secret} --set service.targetPort=\${service_port} myrepo/${Template}"
 # 分辨是不是为新布署
 if helm history \${service_name} \${common_args} /dev/null;then
 action=upgrade
 else
 action=install
 # 对于服务开启ingress
 if [ \${service_name} == "gateway-service" ]; then
 helm \${action} \${helm_args} \
 --set ingress.enabled=true \
 --set ingress.host=${gateway_domain_name} \
 \${common_args}
 elif [ \${service_name} == "portal-service" ]; then
 helm \${action} \${helm_args} \
 --set ingress.enabled=true \
 --set ingress.host=${portal_domain_name} \
 \${common_args}
 else
 helm \${action} \${helm_args} \${common_args}
 done
 # 查询Pod情况
 sleep 10
 kubectl get pods \${common_args}
}

pipeline分析
1、最先去安裝这好多个软件
Git Parameter 能够完成动态性的从git中获得全部支系
Git 拉替代码
Pipeline 刚刚安裝的pipeline,来完成这一pipeline水流线的公布每日任务
Config File Provider 关键能够将kubeconfig配备文档储放在jenkins里,让这一pipeline引入这一配备文档,例如搭建的slave镜像系统里边有kubectl,那麼联接k8s毫无疑问必须受权,立即复制这一指令毫无疑问不太好使,并且像helm -v3版本号也是根据kubeconfig来联接k8s-api来布署的每日任务,这2个指令全是根据kubeconfig去载入的k8s,因此大家必须将这2个指令给他们们管理权限来联接k8s,因此必须提前准备一个kubeconfig文档,能让这一2个专用工具能够读到,可是这2个指令全是在slave的pod中,因此大家必须应用这一软件将kubeconfig文档由jenkins来储存,随后再根据jenkins特殊的英语的语法让它取得,让它储存到slave中,产生一个动态性的文档,动态性的加进,随后helm,kubectl根据这一文档就可以立即联接k8s群集了,那样的益处关键是安全性,还可以立即将这一kubeconfig文档打进镜像系统中,还可以,可是那样都不是很安全性,他人一旦取得这一kubeconfig文档久非常于把kubectl的管理权限给他人了,能够浏览k8s群集了,那样也不安全性了,因此大家還是按软件的方法去安裝这一,动态性的放到jenkins中還是较为好的Extended Choice Parameter 开展对挑选框软件开展拓展,能够选取,拓展主要参数搭建,并且布署微服务还必须选取,例如同时公布2个微服务,三个微服务,不能能每公布一个关键点一下,那样毫无疑问不是实际的。
2、主要参数含意
// 公共性
def registry = "192.168.30.27" 例如镜像系统库房的详细地址
// 新项目
def project = "microservice" 新项目的名字
def git_url = "root/ms.git" 微服务的gitlab的新项目的git详细地址
def gateway_domain_name = "" 微服务里边几个对外开放出示服务,特定网站域名
def portal_domain_name = "" 微服务里边几个对外开放出示服务,特定网站域名,由于并不是全部的微服务全是出示网站域名的,因此要为必须配备的出示一个网站域名
// 验证
def image_pull_secret = "registry-pull-secret" 当helm去布署运用的情况下,大家必须拉取去在拉取库房的镜像系统与k8s开展验证,那麼这一便是在k8s中来建立好的,也便是建立k8s登陆harbor信息内容的一个验证,一般会在yaml中界定imagePullSecrets,镜像系统拉取的验证
能够根据kubectl create secret docker-registry registry-pull-secret --docker-server=192.168.30.27 --docker-username=admin --docker-password=Harbor12345 --docker-email=admin -n ms 指令去建立
def harbor_registry_auth = "e5402e52-7dd0-4daf-8d21-c4aa6e47736b" 也便是拉取镜像系统时要要docker login登陆一下才能够拉,一般独享的必须特定这一密匙
def git_auth = "a65680b4-0bf7-418f-a77e-f20778f9e737" 这一是拉取git的情况下必须特定的验证必须储存一下
// ConfigFileProvider ID
def k8s_auth = "7ee65e53-a559-4c52-8b88-c968a637051e" 这便是k8s的验证,这一也便是储存在kubeconfig中
这种全是界定的公共性的自变量,这种自变量关键是让脚本制作可用于一个通用性性,将一些变化的值传到进来那样关键可让新项目动态性的去兼容了

3、动态性的在k8s中来建立slave-pod
pipeline {
agent {label "jenkins-slave" 特定标识
yaml """
kind: Pod
metadata:
name: jenkins-slave 特定pod的姓名
spec:
containers:


name: jnlp 默认设置应用jnlp
image: "${registry}/library/jenkins-slave-jdk:1.8" 应用大家封裝好的slave的镜像系统
imagePullPolicy: Always 镜像系统拉取对策,自始至终拉取镜像系统库房的镜像系统
volumeMounts: 挂载的数据信息卷,大家在搭建jenkins-slave镜像系统的情况下,docker必须数据信息卷挂载

name: docker-cmd 也便是docker in docker
mountPath: /usr/bin/docker name: docker-sock
mountPath: /var/run/docker.sock

name: maven-cache 关键是将器皿中maven拉取依靠包的缓存文件挂载到寄主机的/tmp/m2下,一旦寄主机都具有这一缓存文件得话,
mountPath: /root/.m2 那麼之后搭建都是先载入缓存文件,或是也便是能够将这种包放进共享资源储存里边pvc中来载入,能够在这里个yaml
volumes: 中来界定也都可以以

name: docker-cmd
hostPath:
path: /usr/bin/docker 将寄主机上的/var/bin/docker和/var/run/docker.sock 挂载到器皿中的文件目录mountpath:相匹配文件目录中 name: docker-sock 那样器皿便可令其用docker指令了,
hostPath:
path: /var/run/docker.sock name: maven-cache
hostPath:
path: /tmp/m2
"""
}

4、主要参数化搭建
parameters {
gitParameter branch: '', branchFilter: '.', defaultValue: '', description: '挑选公布的支系', name: 'Branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '', type: 'PT_BRANCH' ###动态性的去获得主要参数
extendedChoice defaultValue: 'none', description: '挑选公布的微服务', \ ###加了拓展,能够选取公布好几个微服务
微服务找到大家必须什么必须人力互动的
便是应用的这套微服务都可用于这套chart模板
1、微服务名字,及其对于一些服务必须携带网站域名,此外例如去配备的微服务的姓名全是不一样的,这一姓名是确保是唯一的,必须应用include,,一般写在_helpers。tpl下,由于大家布署的情况下早已取得微服务的名字了,因此helm起的姓名也是微服务的姓名,随后加上上公共的标识就区别出去了,此外便是微服务的端口号也不是一样的
2、端口号,每一个微服务的端口号也也不一
3、取名室内空间 应用helm -n 便可以布署到特定的取名室内空间了
4、团本数 这一原本在helm中是3个团本,大家能够根据传参的方式变为5或是2都可以以
5、資源的限定,自身这一k8s中的限定是没法考虑一个java运用的限定的,一般1.8jdk版本号不是适配的,新的版本号是适配的,因此手动式的去特定它的对里存的尺寸,这一一般在dockerfile开启jar包的情况下带到
6、chart模板的挑选 将会一个新项目考虑不上一个新项目,那麼将会就得必须2个模板来完成
multiSelectDelimiter: ',', name: 'Service', type: 'PT_CHECKBOX', \
value: 'gateway-service:9999,portal-service:8080,product-service:8010,order-service:8020,stock-service:8030'
choice (choices: ['ms', 'demo'], description: '布署模版', name: 'Template')
choice (choices: ['1', '3', '5', '7'], description: '团本数', name: 'ReplicaCount')
choice (choices: ['ms'], description: '取名室内空间', name: 'Namespace')
}


随后必须将这一chart模板加上到repo里

[ ~]# helm repo add --username admin --password Harbor12345 myrepo chartrepo/library
"myrepo" has been added to your repositories
[ ~]# helm repo list
NAME URL 
myrepo chartrepo/library

将helm制作进行后装包并push到库房中,随后当我们们布署的情况下就要拉这一helm模板详细地址

[ ~]# helm push ms-0.1.0.tgz --username=admin --password=Harbor12345 chartrepo/library
Pushing ms-0.1.0.tgz to chartrepo/library...
Done.
es
5、jenkins-slave所实行的实际每日任务
 stages {
 stage('拉替代码'){
 steps {
 checkout([$class: 'GitSCM', 
 branches: [[name: "${params.Branch}"]], 
 doGenerateSubmoduleConfigurations: false, 
 extensions: [], submoduleCfg: [], 
 userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]] 它必须将这一主要参数发送给上边的git parameters,让它可以动态性的git详细地址中拉取全部的支系,
 stage('编码编译程序') {
 // 编译程序特定服务
 steps {
 sh """
 mvn clean package -Dmaven.test.skip=true 
 stage('搭建镜像系统') {
 steps {
 withCredentials([usernamePassword(credentialsId: "${harbor_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) { 这儿应用了一个凭证的验证将联接harbor验证信息内容储存到凭证里边,以便安全性性,应用了凭证的引入,动态性的将它储存到自变量中,随后根据启用自变量的方式去登陆这镜像系统库房,那样得话也不用在pipeline中来反映登陆密码了,
 sh """
 docker login -u ${username} -p '${password}' ${registry}
 for service in \$(echo ${Service} |sed 's/,/ /g'); do
 service_name=\${service%:*} 由于大家是布署的微服务,因此大家必须许多的服务的搭建,因此这儿加了一个for循环系统
它启用的$service更是主要参数化搭建中的挑选的services,随后依据不一样的服务消息推送到镜像系统库房,
 image_name=${registry}/${project}/\${service_name}:${BUILD_NUMBER}
 cd \${service_name}
 if ls |grep biz /dev/null; then
 cd \${service_name}-biz
 docker build -t \${image_name} .
 docker push \${image_name}
 cd ${WORKSPACE}
 done
 """ 以前说必须kubeconfig这一配备存到jenins中的slave的pod中,起个姓名叫admin.kubeconfig
 configFileProvider([configFile(fileId: "${k8s_auth}", targetLocation: "admin.kubeconfig")]){
 sh """
 # 加上镜像系统拉取验证 当应用拉取镜像系统的验证信息内容的情况下便可以立即特定admin.kubeconfig了,它就可以联接到这一群集了
 kubectl create secret docker-registry ${image_pull_secret} --docker-username=${username} --docker-password=${password} --docker-server=${registry} -n ${Namespace} --kubeconfig admin.kubeconfig |true
 # 加上独享chart库房到这一pod中
 helm repo add --username ${username} --password ${password} myrepo chartrepo/${project}
------------------------------------------------------------------------------------------------------------------------------------------
6、deploy,应用helm布署到k8s中
stage('Helm布署到K8S') {
 steps {
 sh """界定公共性的主要参数,应用helm,kubectl必须加namespace取名室内空间,联接k8s验证的kubeconfig文档
 common_args="-n ${Namespace} --kubeconfig admin.kubeconfig"
 for service in \$(echo ${Service} |sed 's/,/ /g'); do for循环系统每一个微服务的端口号也不一样,因此在微服务这儿加上微服务的姓名和它相匹配的端口号,把挑选的服务和端口号开展分拆
 service_name=\${service%:*}
 service_port=\${service#*:}
 image=${registry}/${project}/\${service_name}
 tag=${BUILD_NUMBER} 。 jenkins搭建的一个序号
 helm_args="\${service_name} --set image.repository=\${image} --set image.tag=\${tag} --set replicaCount=${replicaCount} --set imagePullSecrets[0].name=${image_pull_secret} --set service.targetPort=\${service_port} myrepo/${Template}"
 # 分辨是不是为新布署
 if helm history \${service_name} \${common_args} /dev/null;then 那麼加一个分辨看一下不是是布署了,为假就install,为真就upgrade
 action=upgrade 旧布署的应用upgrade升级
 else
 action=install 新布署的应用install
 # 对于服务开启ingress
 if [ \${service_name} == "gateway-service" ]; then
 helm \${action} \${helm_args} \
 --set ingress.enabled=true \ 为true就开启ingress,由于chart毫无疑问默认设置的为force,便是不开启ingress
 --set ingress.host=${gateway_domain_name} \
 \${common_args}
 elif [ \${service_name} == "portal-service" ]; then 
 helm \${action} \${helm_args} \
 --set ingress.enabled=true \
 --set ingress.host=${portal_domain_name} \
 \${common_args}
 else
 helm \${action} \${helm_args} \${common_args} 
 done
 # 查询Pod情况
 sleep 10
 kubectl get pods \${common_args}
改动一些验证信息内容,这一pipeline最好先从一个地区拷贝一下,改动完再放入pipeline
gitlab的新项目详细地址def git_url = "root/ms.git"
改动harbor的凭证
挑选credentials

es
点一下jenkins
es
add 加上凭证
es
填好harbor的客户名和登陆密码,登陆密码Harbor12345
叙述随意写,
es
再加上第二个
es
git的客户名和登陆密码
es
随后升级一下,把密匙放进特定的pipeline中
es
将这一id放进pipeline中
es
将转化成的密匙验证放进pipeline中
// 验证
def image_pull_secret = "registry-pull-secret"
def harbor_registry_auth = "7177c1f3-9e6b--187c742c4516"
def git_auth = "28484aa2-aeb4-479b-ad43-cf12c2a7d445"
随后将大家必须的软件都安裝上
// 需要软件: Git Parameter/Git/Pipeline/Config File es/Extended Choice Parameter
如今去加上kubeconfig的文档
es
es
将这一ID放进大家k8s-auth的pipeline中,这一配备文档是k8s联接kubeconfig的ID,假如是kubeadm布署的必须到[ ~]# cat /root/.kube/config 这一文档下将文档复制到jenkins中
apiVersion: v1
clusters:

cluster:
certificate-authority-data:
假如是二进制布署的必须到k8s的资格证书下边寻找kubeconfig.sh下边手动式开展转化成,bash kubeconfig.sh,会转化成一个admin顾客端的联接k8s配备,将这一配备黏贴到jenkins的刚刚转化成config的content下边
es

最终开展检测公布在pipeline的配备特定公布的服务开展公布
查询pod的情况

es,来完成高些效的交...