回顾内容
·制作Jenkins的Docker镜像
·设置了容器启动时使用的用户为root·设置容器内的时区为UTC+8
·加入了ssh私钥(拉取git代码的两种方式:基于http和基于ssh)·加入登录harbor的config文件
·修改了ssh客户端的配置
·安装了一个docker客户端
·配置共享存储NFS
·交付Jenkins到K8S集群配置CI流水线
Dashboard(仪表盘)
· 基于RBAC认证的一个GUI资源管理插件
· 两个常用版本: v1.8.3和v1.10.1
- K8S如何基于RBAC进行鉴权
- 手撕ssl证书签发它
每一个公司都有自己的不同的服务,不一定都用的dubbo微服务 看下图说明::
第一个是注册中心Registry在dubbo微服务中就是zk,以集群状态的形式 第二个是提供者Provider,把提供者交付在k8s里面注册到注册中心 第三个是消费者Consumer在,也交付在k8s然后去注册,并订阅提供者的方法,方法是register的方法(默认),这样消费者在使用方法的时候就好像在使用本地方法一样(它里面可能仅仅写一个接口,没有具体代码,那么代码是在提供者的项目里面写的) 最后一个是monitor,需要通过它去观察提供者,消费者和注册中心,是不是在正常的工作
下面是要交付Jenkins 说明:三件事 首先它是做为一个持续集成的组件,用来帮助我们把源代码从版本控制中心(我们用的是jdk,你也可以用其他),然后通过配置和编译,让它变成我们可以执行的二进制代码,最后是把代码编译完成后把它变成docker镜像并提交到我们的私有镜像仓库。 我们为了让他完成这三件事,把jenkins也做成了docker,,加入harbor的config文件主要是为了让他能和harbor可以进行通信,,最后一步是安装一个docker的客户端,它在k8s的运算节点,docker的客户端和服务端是通过docker.sock进行通信的,你需要把它挂载到宿主机上 上面我们都是通过资源配置清单把服务交付服务的。 下面我们最的最多的三步, 第一准备docker的镜像, 第二把镜像给扔到私有镜像仓库里面,方便拉镜像 第三是准备资源配置清单,然后应用到k8s里面
还记得的那个蓝海(Open Blue Orean)插件,主要是帮助我们做流水线的。
二进制安装maven
能在Jenkins的po日志里面看到下面那个句话,说明它是启动成功的 其实Jenkins还是挺吃资源的,吃内存还是比较多的,你看是670多兆,相当于半个多g了,当然相对于Prometheus是很小的,Prometheus能到20多g
验证Jenkins是否真的可用
需要exec进入Jenkins的pod 你可以在浏览器上也可以在后台登录 首先验证是否可登陆,以及是否有docker的容器,你可以到21上看是否是有下面这些容器
jenkins-54b8469cf9-7v28q 1/1 Running 0 17h
[root@hdss7-21 ~]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
600eff76f8cb harbor.od.com/public/traefik "/entrypoint.sh --ap…" 3 days ago Up 3 days k8s_traefik-ingress_traefik-ingress-zh4k6_kube-system_37fec845-24f2-4c6d-8201-fb4aed203a2c_0
bb5f952c3206 harbor.od.com/public/pause:latest "/pause" 3 days ago Up 3 days 0.0.0.0:81->80/tcp, :::81->80/tcp k8s_POD_traefik-ingress-zh4k6_kube-system_37fec845-24f2-4c6d-8201-fb4aed203a2c_279
47f6dcbee8ec harbor.od.com/public/coredns "/coredns -conf /etc…" 3 days ago Up 3 days k8s_coredns_coredns-6b6c4f9648-ckjh7_kube-system_3e9f9af1-4248-4e08-95e7-d2b4a3cb5ba3_0
ed804429de1d harbor.od.com/public/pause:latest "/pause" 3 days ago Up 3 days k8s_POD_coredns-6b6c4f9648-ckjh7_kube-system_3e9f9af1-4248-4e08-95e7-d2b4a3cb5ba3_0
995e2b868b95 1b933b5c419a "nginx -g 'daemon of…" 3 days ago Up 3 days k8s_my-nginx_nginx-ds-pbql6_default_cb677867-23e7-480f-a986-128e3e30a064_0
cedc944769df harbor.od.com/public/pause:latest "/pause" 3 days ago Up 3 days k8s_POD_nginx-ds-pbql6_default_cb677867-23e7-480f-a986-128e3e30a064_0
a46832c354e7 84581e99d807 "nginx -g 'daemon of…" 3 days ago Up 3 days k8s_nginx_nginx-dp-5dfc689474-dbdsk_kube-public_af461457-7d0b-4f3e-bf3d-aa07c32202e2_0
b6276df69065 harbor.od.com/public/pause:latest "/pause" 3 days ago Up 3 days k8s_POD_nginx-dp-5dfc689474-dbdsk_kube-public_af461457-7d0b-4f3e-bf3d-aa07c32202e2_0
[root@hdss7-21 ~]
然后登录harbor 当年获得下面的一段信息了,说明你的Jenkins已经在正常的工作了 测试连接 下面是告诉你,你已经被成功认证了,但是gitee不能给你提供shell的接入点
安装部署maven软件是用来编译java程序的
下载地址 maven.apache.org/docs/history.html https://archive.apache.org/dist/maven/maven-3/
[root@hdss7-200 jenkins_home]
[root@hdss7-200 src]
--2021-09-01 21:35:52-- https://archive.apache.org/dist/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz
Resolving archive.apache.org (archive.apache.org)... 138.201.131.134, 2a01:4f8:172:2ec5::2
Connecting to archive.apache.org (archive.apache.org)|138.201.131.134|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9136463 (8.7M) [application/x-gzip]
Saving to: ‘apache-maven-3.6.1-bin.tar.gz’
100%[============================================================>] 9,136,463 77.7KB/s in 76s
2021-09-01 21:37:08 (118 KB/s) - ‘apache-maven-3.6.1-bin.tar.gz’ saved [9136463/9136463]
[root@hdss7-200 src]
total 575356
-rw-r--r-- 1 root root 9136463 Sep 4 2019 apache-maven-3.6.1-bin.tar.gz
-rw-r--r-- 1 root root 580021898 May 24 23:37 harbor-offline-installer-v1.8.3.tgz
[root@hdss7-200 src]
在运维主机上二进制部署,这里用3.6.1 首先需要确定下jenkins里面的java版本是多少 然后根据版本创建目录
[root@hdss7-200 src]
[root@hdss7-200 src]
[root@hdss7-200 src]
[root@hdss7-200 maven-3.6.1-8u232]
[root@hdss7-200 maven-3.6.1-8u232]
[root@hdss7-200 maven-3.6.1-8u232]
total 40
drwxr-xr-x 2 root root 4096 Sep 1 21:46 bin
drwxr-xr-x 2 root root 4096 Sep 1 21:46 boot
drwxr-xr-x 3 501 games 4096 Apr 5 2019 conf
drwxr-xr-x 4 501 games 4096 Sep 1 21:46 lib
-rw-r--r-- 1 501 games 13437 Apr 5 2019 LICENSE
-rw-r--r-- 1 501 games 182 Apr 5 2019 NOTICE
-rw-r--r-- 1 501 games 2533 Apr 5 2019 README.txt
[root@hdss7-200 maven-3.6.1-8u232]
/data/nfs-volume/jenkins_home/maven-3.6.1-8u232
[root@hdss7-200 maven-3.6.1-8u232]
然后对maven进行下初始化配置
[root@hdss7-200 maven-3.6.1-8u232]
/data/nfs-volume/jenkins_home/maven-3.6.1-8u232
[root@hdss7-200 maven-3.6.1-8u232]
这个说明下你在/data/nfs-volume/jenkins_home安装的内容到是要挂载到你的docker镜像里面的,说白了就是在你docker安装的
制作dubbo微服务的镜像底包
登录开源的这些内容可以看下 https://hub.docker.com/reposititory/docker/stanleyws 在运维主机200上
自定义Dockerfile
[root@hdss7-200 maven-3.6.1-8u232]
[root@hdss7-200 dockerfile]
jenkins
[root@hdss7-200 dockerfile]
8u112: Pulling from stanleyws/jre8
cd9a7cbe58f4: Pull complete
8372fab2fcdf: Pull complete
54746b802c92: Pull complete
969413759d76: Pull complete
3a44edd3f51d: Pull complete
Digest: sha256:921225313d0ae6ce26eac31fc36b5ba8a0a841ea4bd4c94e2a167a9a3eb74364
Status: Downloaded newer image for stanleyws/jre8:8u112
docker.io/stanleyws/jre8:8u112
[root@hdss7-200 dockerfile]
stanleyws/jre8 8u112 fa3a085d6ef1 4 years ago 363MB
[root@hdss7-200 dockerfile]
[root@hdss7-200 dockerfile]
The push refers to repository [harbor.od.com/public/jre]
0690f10a63a5: Pushed
c843b2cf4e12: Pushed
fddd8887b725: Pushed
42052a19230c: Pushed
8d4d1ab5ff74: Pushed
8u112: digest: sha256:733087bae1f15d492307fca1f668b3a5747045aad6af06821e3f64755268ed8e size: 1367
[root@hdss7-200 dockerfile]
/data/dockerfile
[root@hdss7-200 dockerfile]
[root@hdss7-200 dockerfile]
[root@hdss7-200 dockerfile]
[root@hdss7-200 jre8]
[root@hdss7-200 jre8]
FROM harbor.od.com/public/jre: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"]
[root@hdss7-200 jre8]
[root@hdss7-200 jre8]
---
rules:
- pattern: '.*'
[root@hdss7-200 jre8]
--2021-09-01 22:29:35-- https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar
Resolving repo1.maven.org (repo1.maven.org)... 199.232.196.209, 199.232.192.209
Connecting to repo1.maven.org (repo1.maven.org)|199.232.196.209|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 367417 (359K) [application/java-archive]
Saving to: ‘jmx_javaagent-0.3.1.jar’
100%[============================================================>] 367,417 270KB/s in 1.3s
2021-09-01 22:29:37 (270 KB/s) - ‘jmx_javaagent-0.3.1.jar’ saved [367417/367417]
[root@hdss7-200 jre8]
total 368
-rw-r--r-- 1 root root 30 Sep 1 22:28 config.yml
-rw-r--r-- 1 root root 297 Sep 1 22:26 Dockerfile
-rw-r--r-- 1 root root 367417 May 10 2018 jmx_javaagent-0.3.1.jar
[root@hdss7-200 jre8]
[root@hdss7-200 jre8]
[root@hdss7-200 jre8]
[root@hdss7-200 jre8]
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@hdss7-200 jre8]
在这里解释下上面的那个小脚本
[root@hdss7-200 jre8]# cat entrypoint.sh
#主要是定义了三个变量去执行一条命令,也就是M_OPTS、JAR_BALL、C_OPTS这三个变量,JAR_BALL好理解就是java的jia包
#!/bin/sh
#下面一句M_OPTS是java的一些启动参数,这个启动参数,运行时的时区是东八区,把pod的ip给传到上面wget下载的里面并打开一个端口,并很巧妙的使用${M_PORT:-"12346"},也就是如果你没有传端口默认打开的端口是12346,后面是config.yml是监控规则
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},后面的${JAR_BALL}是取的当前docker运行时的环境变量,就是把docker运行时的环境变量赋值到shell脚本的JAR_BALL的变量里面,,是有k8s的资源配置清单里给它传的,这也就是云原生的思想,为什么docker在k8s里面不是一个信息孤岛,是通过环境变量的形式可以给容器做初始化的超作,这也就就是典型的云原生做初始化,如果你属性k8s的工作方式了可以完全不用去写,,上面一条原理是一样的。
JAR_BALL=${JAR_BALL}
#下面是真正执行的命令,,下面exec是什么意思呢,因为在执行脚本/entrypoint.sh的时候应该有一个pid这个pid的值是1,docker应该有一个pid等于1的进程一直在前台进行,这才能维持你的docker有一个生命状态,如果不写那么docker的进制就会退出了,exec就相当于代替前面的entrypoint.sh脚本维持pid等于1的进程,,就是为了让docker的生命周期保持在running状态而不是pending状态,,也即是让java成为主进程
exec java -jar ${M_OPTS} ${C_OPTS} ${JAR_BALL}
[root@hdss7-200 jre8]#
当你发现你容器死活起步来的时候可以尝试用下exec的方式
下面是可以build镜像了
首先我们去harbor.od.com去创新一个项目 所有的业务镜像地包都从base镜像里面去捞 build
[root@hdss7-200 jre8]
Sending build context to Docker daemon 372.2kB
Step 1/7 : FROM harbor.od.com/public/jre:8u112
---> fa3a085d6ef1
Step 2/7 : RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
---> Running in 57f517e3a47b
Removing intermediate container 57f517e3a47b
---> f6e1accb02a4
Step 3/7 : ADD config.yml /opt/prom/config.yml
---> de1afa1bf257
Step 4/7 : ADD jmx_javaagent-0.3.1.jar /opt/prom/
---> 3d4fae48d937
Step 5/7 : WORKDIR /opt/project_dir
---> Running in 5db1382b07e5
Removing intermediate container 5db1382b07e5
---> 25a9f793b3be
Step 6/7 : ADD entrypoint.sh /entrypoint.sh
---> b4a738a44df7
Step 7/7 : CMD ["/entrypoint.sh"]
---> Running in a072d01b0082
Removing intermediate container a072d01b0082
---> 543b20f391f9
Successfully built 543b20f391f9
Successfully tagged harbor.od.com/base/jre8:8u112
[root@hdss7-200 jre8]
[root@hdss7-200 jre8]
The push refers to repository [harbor.od.com/base/jre8]
bee05a3ead66: Pushed
1e8546938d03: Pushed
ec7559a9b2a3: Pushed
ad8b92153ecf: Pushed
b400bce7c120: Pushed
0690f10a63a5: Mounted from public/jre
c843b2cf4e12: Mounted from public/jre
fddd8887b725: Mounted from public/jre
42052a19230c: Mounted from public/jre
8d4d1ab5ff74: Mounted from public/jre
8u112: digest: sha256:73df3fcedbc3430c5efa6a31c22cb5c168cca81d16022b49db298a4ac0881edd size: 2405
我们在生产中改的最多的也就是底包,所以这个最好多了解点
使用jenkins进行持续构建交付dubbo服务的提供者
配置流水线,点new item 点击自动刷新
版本更新后再等了你看有蓝海了
有了蓝海了就可以进行更新了创建了,先选择,在填写,最后创建 保留7天保留30个 第一个参数 第二个参数。 第四个参数 第五个参数 第6个参数 第七个参数 第八个参数 第九个参数和上面有所不同 第十个参数 准备流水线脚本
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.od.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.od.com/${params.image_name}:${params.git_ver}_${params.add_tag} . && docker push harbor.od.com/${params.image_name}:${params.git_ver}_${params.add_tag}"
}
}
}
}
然后点config是能看到你之前填写的内容的 真正构建项目的时候应该点上面那个back to dashboard 真正构建的时候点这两个都是可以的 然后就会进入刚才你设置的页面了
真正构建需要先去harbor创建一个app项目
填写下面的参数–10个参数都要有 因为gitee里面我的没有代码,所以下面就不在多请参数去做 然后点console output
编译完成后配置资源配置清单
下面的时间是为了快速定位问题用的
[root@hdss7-200 maven-3.6.1-8u232]
[root@hdss7-200 k8s-yaml]
[root@hdss7-200 k8s-yaml]
[root@hdss7-200 dubbo-demo-service]
[root@hdss7-200 dubbo-demo-service]
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: dubbo-demo-service
namespace: app
labels:
name: dubbo-demo-service
spec:
replicas: 1
selector:
matchLabels:
name: dubbo-demo-service
template:
metadata:
labels:
app: dubbo-demo-service
name: dubbo-demo-service
spec:
containers:
- name: dubbo-demo-service
image: harbor.od.com/app/dubbo-demo-service:master_191201_1200
ports:
- containerPort: 20880
protocol: TCP
env:
- name: JAR_BALL
value: dubbo-server.jar
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: harbor
restartPolicy: Always
terminationGracePeriodSeconds: 30
securityContext:
runAsUser: 0
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
revisionHistoryLimit: 7
progressDeadlineSeconds: 600
[root@hdss7-200 dubbo-demo-service]
在21上创建
[root@hdss7-21 ~]
namespace/app created
[root@hdss7-21 ~]
secret/harbor created
[root@hdss7-21 ~]
应该资源配置清单前先看zk是否正常 下面说明没问题
[root@hdss7-11 zookeeper]
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@hdss7-11 zookeeper]
[root@hdss7-21 ~]
deployment.extensions/dubbo-demo-service created
[root@hdss7-21 ~]
看pod是否正常先看下日志
告诉你服务端已启动说明正常了 查看zk 在zk里面有dubbo说明提供者交付成功了
|