- Jenkins环境实现
- 信息说明
Jenkins服务以Pod形式运行在Kubernetes集群中,其在持续集成的过程中需要拉代码、做镜像、推镜像、应用资源清单等等操作。为了简化配置操作,故在基于官方Jenkins镜像基础上进行个性化配置,内容包括:
a)以root用户运行;
b)更正8h时区差;
c)配置与宿主机相同的ssh认证信息;
d)安装docker并配置自定义镜像仓库访问权限;
e)配置kubectl命令和集群权限等。 - https://gitee.com/crabluo/K8sDockerfile/tree/master/jenkins2.2223">镜像制作
https://gitee.com/crabluo/K8sDockerfile/tree/master/jenkins2.2223 - 命令操作
[root@master1 /k8snew/dockerfile/jenkins2.2223]# which kubectl
[root@master1 /k8snew/dockerfile/jenkins2.2223]# cp -r /bin/kubectl .
[root@master1 /k8snew/dockerfile/jenkins2.2223]# cp /root/.kube/config .
[root@master1 /k8snew/dockerfile/jenkins2.2223]# cp /root/.ssh/id_rsa .
[root@master1 /k8snew/dockerfile/jenkins2.2223]# cp /root/.docker/config.json .
[root@master1 /k8snew/dockerfile/jenkins2.2223]# chmod +x get-docker.sh kubectl
[root@master1 /k8snew/dockerfile/jenkins2.2223]# docker build . -t harbor.od.com/infra/jenkins:2.222.3
[root@master1 /k8snew/dockerfile/jenkins2.2223]# docker push harbor.od.com/infra/jenkins:2.222.3 - https://gitee.com/crabluo/K8sFiles/tree/master/jenkins">文件地址
https://gitee.com/crabluo/K8sFiles/tree/master/jenkins - 清单应用
kubectl apply -f dp.yaml
kubectl apply -f svc.yaml
kubectl apply -f ing.yaml
kubectl apply -f rbac-jenkins.yaml - ">页面效果

- 信息描述
Jenkins以Pod形式运行在集群中,同时maven等插件直接配置在jenkins_home下,而其缓存默认地址是/root/.m2,故当jenkins容器重启时,插件缓存内容将丢失。 - 解决姿势
方案有以下几种:
a)更改maven的默认缓存目录,将其持久化到jenkins容器的共享存储nfs中;
b)通过deployment.yaml应用清单前,可挂载相应的缓存目录到持久化目录。 - Zookeeper环境实现
- 环境说明
要部署zk集群,同时资源有限,故在master1,master2,master3上分别部署一个zk节点。 - 在自建dns服务器上配置解析
- 三台服务器分别执行启动命令
/usr/local/zookeeper/bin/zkServer.sh start
/usr/local/zookeeper/bin/zkServer.sh status - 服务验证
[root@master1 ~]# /usr/local/zookeeper/bin/zkCli.sh -server zk1.od.com:2181
回车
[zk: zk1.od.com:2181(CONNECTED) 4] ls /zookeeper
[quota] - Dubbo
- 信息说明
- 发布-订阅过程:
a)启动容器,运行服务提供者;
b)服务提供者在启动时,在注册中心发布注册自己提供的服务;
c)服务消费者在启动时,在注册中心订阅自己所需的服务。 - 构建镜像
docker build . -t harbor.od.com/base/jre8:8u112_with_logs
docker push docker pull harbor.od.com/base/jre8:8u112_with_logs - 交付Dubbo微服务
- 将服务部署到集群。
dp.yaml - 创建ns
kubectl create namespace app - 创建拉取harbor仓库镜像的认证信息
kubectl create secret docker-registry harbor —docker-server=harbor.od.com —docker-username=admin —docker-password=Harbor12345 -n app - 资源应用
kubectl apply -f dp.yaml - ">出现如下信息说明服务正常启动
root@dubbo-demo-service-68c998b99f-vmcgj:/opt/project_dir# tail -1000f /opt/logs/stdout.log
- 应用清单
kubectl apply -f . - ">日志查看

- ">监控查看

- 结合配置中心交付Dubbo微服务
- https://github.com/ctripcorp/apollo/releases/tag/v1.5.1
#需要下载3个软件包
">下载地址
https://github.com/ctripcorp/apollo/releases/tag/v1.5.1
#需要下载3个软件包
- ">页面效果

- Apollo使用示例
- https://gitee.com/crabluo/dubbo-demo-service">项目地址
https://gitee.com/crabluo/dubbo-demo-service
">连接配置信息

- ">Jenkins项目构建

- 构建成功后应用资源清单
dp-apollo.yaml - 应用(基于之前的svc.yaml和ing.yaml,此处不做赘述)
kubectl apply -f dp-apollo.yaml
#查看apollo配置中心,能看到正在连接的服务信息
#当将dubbo-demo-service的副本数变为2时,配置中心也能看到2个连接实例列表。">查看对应Pod日志,确定service服务已正常启动
#查看apollo配置中心,能看到正在连接的服务信息
#当将dubbo-demo-service的副本数变为2时,配置中心也能看到2个连接实例列表。- http://demo.od.com/hello?name=apollo
">浏览器访问: http://demo.od.com/hello?name=apollo
- https://www.yuque.com/crabluo/k8s/iahvix#Kd2kA">在相应服务器上部署zk,请参考链接,此处不做赘述
链接:https://www.yuque.com/crabluo/k8s/iahvix#Kd2kA - 基于源sql进行以下操作
cp configdb.sql configdb_test.sql
cp configdb.sql configdb_prod.sql
vim configdb_prod.sql
">修改(增加Test以区分库名)
vim configdb_test.sql
vim configdb_prod.sql
- 数据导入
mysql -uroot -p123456 < configdb_test.sql
mysql -uroot -p123456 < configdb_prod.sql - http://config-test.od.com/eureka“ where ServerConfig.Key=”eureka.service.url”;
> update ApolloConfigProdDB.ServerConfig set ServerConfig.Value=”http://config-prod.od.com/eureka“ where ServerConfig.Key=”eureka.service.url”;">数据修改
> update ApolloConfigTestDB.ServerConfig set ServerConfig.Value=”http://config-test.od.com/eureka“ where ServerConfig.Key=”eureka.service.url”;
> update ApolloConfigProdDB.ServerConfig set ServerConfig.Value=”http://config-prod.od.com/eureka“ where ServerConfig.Key=”eureka.service.url”; - 授权
> grant INSERT,DELETE,UPDATE,SELECT on ApolloConfigTestDB. to “apolloconfig”@”%” identified by “123456”;
> grant INSERT,DELETE,UPDATE,SELECT on ApolloConfigProdDB. to “apolloconfig”@”%” identified by “123456”; - 修改PortalDB数据,保证页面显示配置可分环境
use ApolloPortalDB;
select * from ServerConfig\G;
update ServerConfig set Value=’fat,pro’ where Id=1; - ">修改portal对应的资源清单ConfigMap.yaml

- 因为之前portal有过添加操作,故清空相关数据
> use ApolloPortalDB;
> truncate table AppNamespace;
> truncate table App;
Jenkins环境实现
自定义镜像
信息说明
Jenkins服务以Pod形式运行在Kubernetes集群中,其在持续集成的过程中需要拉代码、做镜像、推镜像、应用资源清单等等操作。为了简化配置操作,故在基于官方Jenkins镜像基础上进行个性化配置,内容包括:
a)以root用户运行;
b)更正8h时区差;
c)配置与宿主机相同的ssh认证信息;
d)安装docker并配置自定义镜像仓库访问权限;
e)配置kubectl命令和集群权限等。
镜像制作
https://gitee.com/crabluo/K8sDockerfile/tree/master/jenkins2.2223
[root@master1 /luomurui/gitee/K8sDockerfile/jenkins2.2223]# lsconfig config.json Dockerfile get-docker.sh id_rsa kubectl
[root@master1 /k8snew/dockerfile/jenkins2.2223]# cat DockerfileFROM jenkins/jenkins:2.222.3USER rootRUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\echo 'Asia/Shanghai' >/etc/timezoneADD id_rsa /root/.ssh/id_rsaADD config.json /root/.docker/config.jsonADD get-docker.sh /get-docker.shADD kubectl /bin/kubectlADD config /root/.kube/configRUN chmod +x /bin/kubectlRUN echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config &&\/get-docker.sh
说明:
- Dockerfile内容包含的所有文件取自于宿主机,get-docker.sh取自于docker官网
- config:k8s集群认证文件
- config.json:自定义harbor仓库认证文件
- Dockerfile:制作镜像的文件
- get-docker.sh:安装docker脚本
- id_rsa:宿主机ssh私钥文件
- kubectl:集群命令工具
命令操作
[root@master1 /k8snew/dockerfile/jenkins2.2223]# which kubectl
[root@master1 /k8snew/dockerfile/jenkins2.2223]# cp -r /bin/kubectl .
[root@master1 /k8snew/dockerfile/jenkins2.2223]# cp /root/.kube/config .
[root@master1 /k8snew/dockerfile/jenkins2.2223]# cp /root/.ssh/id_rsa .
[root@master1 /k8snew/dockerfile/jenkins2.2223]# cp /root/.docker/config.json .
[root@master1 /k8snew/dockerfile/jenkins2.2223]# chmod +x get-docker.sh kubectl
[root@master1 /k8snew/dockerfile/jenkins2.2223]# docker build . -t harbor.od.com/infra/jenkins:2.222.3
[root@master1 /k8snew/dockerfile/jenkins2.2223]# docker push harbor.od.com/infra/jenkins:2.222.3
NFS环境实现
参考:https://www.cnblogs.com/kazihuo/p/13130120.html
本章节环境 NFS Server 部署在 master2(10.2.2.166)上。
资源清单应用
文件地址
https://gitee.com/crabluo/K8sFiles/tree/master/jenkins
清单应用
kubectl apply -f dp.yaml
kubectl apply -f svc.yaml
kubectl apply -f ing.yaml
kubectl apply -f rbac-jenkins.yaml
页面效果展示
#地址解析
服务对应解析域名:jenkins.od.com
页面效果

插件便捷配置
在Jenkins的插件管理页面能安装所需插件,在此介绍另一种插件配置方式。
以Maven插件为例,在jenkins的数据目录jenkins_home目录下,下载maven包并解压后,在jenkins工程项目中指定具体的maven工具路径,即可实现指定插件的调用。
因Jenkins Pod用的是master2上的nfs存储,故在master2上对应的目录下进行以下操作:
[root@master2 /srv/data/nfs-volume/jenkins_home]# wget https://archive.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
[root@master2 /srv/data/nfs-volume/jenkins_home]# tar -axvf maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
具体使用方式后续内容将进行补充说明!
服务使用细节
Jenkins服务的权限需求分配,忘记密码解决方式,安装插件提速及关闭CSRF等等,参考链接:
https://www.cnblogs.com/kazihuo/category/1179102.html
可完善的地方
信息描述
Jenkins以Pod形式运行在集群中,同时maven等插件直接配置在jenkins_home下,而其缓存默认地址是/root/.m2,故当jenkins容器重启时,插件缓存内容将丢失。
解决姿势
方案有以下几种:
a)更改maven的默认缓存目录,将其持久化到jenkins容器的共享存储nfs中;
b)通过deployment.yaml应用清单前,可挂载相应的缓存目录到持久化目录。
Zookeeper环境实现
Java环境
本章节使用JDK1.8版本,参考:https://www.cnblogs.com/kazihuo/p/9332766.html
Zk部署
环境说明
要部署zk集群,同时资源有限,故在master1,master2,master3上分别部署一个zk节点。
在自建dns服务器上配置解析
[root@master2 ~]# cat /var/named/od.com.zone |grep zk
zk1 A 10.2.2.137
zk2 A 10.2.2.166
zk3 A 10.2.2.96
#服务部署(三台服务器相同操作)
wget https://downloads.apache.org/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -axvf zookeeper-3.4.14.tar.gz -C /usr/local/
ln -sv /usr/local/zookeeper-3.4.14 /usr/local/zookeeper
mkdir -pv /data/zookeeper/data /data/zookeeper/logs
cat /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
clientPort=2181
server.1=zk1.od.com:2888:3888
server.2=zk2.od.com:2888:3888
server.3=zk3.od.com:2888:3888
#三台服务器配置不同的myid
[root@master1 ~]# cat /data/zookeeper/data/myid
1
[root@master2 ~]# cat /data/zookeeper/data/myid
2
[root@master3 ~]# cat /data/zookeeper/data/myid
3
启动验证
三台服务器分别执行启动命令
/usr/local/zookeeper/bin/zkServer.sh start
/usr/local/zookeeper/bin/zkServer.sh status
服务验证
[root@master1 ~]# /usr/local/zookeeper/bin/zkCli.sh -server zk1.od.com:2181
回车
[zk: zk1.od.com:2181(CONNECTED) 4] ls /zookeeper
[quota]
Dubbo
Dubbo概述
Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC(一种远程调用) 分布式服务框架(SOA),致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
Dubbo 和 Spring Cloud 有什么区别?
1、通信方式不同:Dubbo 使用的是 RPC 通信,而Spring Cloud 使用的是HTTP RESTFul 方式。
2、组成不一样:
- dubbo的服务注册中心为Zookeerper,服务监控中心为dubbo-monitor,无消息总线,服务跟踪、批量任务等组件;
- spring-cloud的服务注册中心为spring-cloud netflix enruka,服务监控中心为spring-boot admin,有消息总线,数据流、服务跟踪、批量任务等组件。
为什么要用dubbo?
以服务应用为例,随着用户量的增加,体态从小到大,功能从简单到复杂,架构体系会发生演变,将出现以下问题:
a)当服务越来越多时,服务URL配置管理变得复杂,F5硬件负载均衡器的单点压力也越来越大;
b)服务间依赖关系错综复杂,哪个服务的启动基于哪个服务等依赖信息变得庞大凌乱;
c)服务的调用量越来越大,容量瓶颈慢慢显露。
为解决由服务架构演变所产生的问题,dubbo出现了,服务治理图:
技术架构
信息说明
| 节点 | 角色说明 |
|---|---|
| Provider | 暴露服务的服务提供方 |
| Consumer | 调用远程服务的服务消费方 |
| Registry | 服务注册与发现的注册中心 |
| Monitor | 统计服务的调用次数和调用时间的监控中心 |
| Container | 服务运行容器(载体) |
发布-订阅过程:
a)启动容器,运行服务提供者;
b)服务提供者在启动时,在注册中心发布注册自己提供的服务;
c)服务消费者在启动时,在注册中心订阅自己所需的服务。
Dubbo底包镜像制作
Dubbo服务要以Pod形式跑在Kubernetes集群中,要有相应的java环境作为底包。
#文件地址
https://gitee.com/crabluo/K8sDockerfile/tree/master/jre8
[root@master1 /luomurui/k8snew/dockerfile/jre8/jre8-with-logs]# ls
config.yml Dockerfile entrypoint.sh jmx_javaagent-0.3.1.jar
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
[root@master1 /luomurui/k8snew/dockerfile/jre8/jre8-with-logs]# cat Dockerfile
FROM kazihuo/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@master1 /luomurui/k8snew/dockerfile/jre8/jre8-with-logs]# cat 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}
mkdir -p /opt/logs
exec java -jar ${M_OPTS} ${C_OPTS} ${JAR_BALL} 2>&1 >> /opt/logs/stdout.log
构建镜像
docker build . -t harbor.od.com/base/jre8:8u112_with_logs
docker push docker pull harbor.od.com/base/jre8:8u112_with_logs
交付Dubbo微服务
交付dubbo-service
参数信息
Jenkinsfile内容
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} . && export DOCKER_API_VERSION=1.39 && docker push harbor.od.com/${params.image_name}:${params.git_ver}_${params.add_tag}"
}
}
}
}
项目构建
构建结果
清单应用
将服务部署到集群。
dp.yaml
kind: Deployment
apiVersion: apps/v1
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_200615_1706
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
创建ns
kubectl create namespace app
创建拉取harbor仓库镜像的认证信息
kubectl create secret docker-registry harbor —docker-server=harbor.od.com —docker-username=admin —docker-password=Harbor12345 -n app
资源应用
kubectl apply -f dp.yaml
效果验证
因制作底包的过程中将日志输出到指定文件,故用 kubectl logs pod 命令不能查看到日志,需要进入容器后查看具体的日志文件。
出现如下信息说明服务正常启动
root@dubbo-demo-service-68c998b99f-vmcgj:/opt/project_dir# tail -1000f /opt/logs/stdout.log

交付dubbo-monitor
服务地址
源地址:https://github.com/Jeromefromcn/dubbo-monitor
笔者地址:https://gitee.com/crabluo/K8sDockerfile/tree/master/dubbo-monitor
修改配置
说明:笔者提供的gitee项目地址是经过需求配置修改后的东西!
[root@master1 /luomurui/k8snew/dockerfile/dubbo-monitor]# cat dubbo-monitor-simple/conf/dubbo_origin.properties
dubbo.container=log4j,spring,registry,jetty
dubbo.application.name=simple-monitor
dubbo.application.owner=
dubbo.registry.address=zookeeper://zk1.od.com:2181?backup=zk2.od.com:2181,zk3.od.com:2181
dubbo.protocol.port=20880
dubbo.jetty.port=8080
dubbo.jetty.directory=/dubbo-monitor-simple/monitor
dubbo.charts.directory=/dubbo-monitor-simple/charts
dubbo.statistics.directory=/dubbo-monitor-simple/statistics
dubbo.log4j.file=logs/dubbo-monitor-simple.log
dubbo.log4j.level=WARN
制作镜像
#准备环境
#修改bin/start.sh文件,调节内容包括:
1)将所用内存适当调小(不调节的话有些浪费资源);
2)将以后台方式启动改为前台启动(不然的话以Pod形式跑的话会起来又挂)。
#以下是源文件,需要修改地方通过红框标记,修改后的内容请参考笔者提供的gitee项目地址文件。
#打包上传
docker build . -t harbor.od.com/infra/dubbo-monitor:latest
docker push harbor.od.com/infra/dubbo-monitor:latest
资源应用
#文件地址
https://gitee.com/crabluo/K8sFiles/tree/master/dubbo-monitor
效果查看
#地址解析
服务对应解析域名:dubbo-monitor.od.com
域名具体配置方式请参考:https://www.yuque.com/crabluo/k8s/zdl28a#ouF85
交付dubbo-consumer
资源信息
#Jenkins参数化构建内容
#清单文件
dp.yaml
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
name: dubbo-demo-consumer
namespace: app
labels:
name: dubbo-demo-consumer
spec:
replicas: 1
selector:
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_200616_1042
ports:
- containerPort: 8080
protocol: TCP
- containerPort: 20880
protocol: TCP
env:
- name: JAR_BALL
value: dubbo-client.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
svc.yaml
kind: Service
apiVersion: v1
metadata:
name: dubbo-demo-consumer
namespace: app
spec:
ports:
- protocol: TCP
port: 8080
targetPort: 8080
selector:
app: dubbo-demo-consumer
ing.yaml
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: dubbo-demo-consumer
namespace: app
spec:
rules:
- host: demo.od.com
http:
paths:
- path: /
backend:
serviceName: dubbo-demo-consumer
servicePort: 8080
资源应用
Jenkins项目构建成功后,将有一个镜像提交到harbor仓库,应用相关资源配置清单。
应用清单
kubectl apply -f .
日志查看

监控查看

功能验证
#地址解析
服务对应解析域名:demo.od.com
域名具体配置方式请参考:https://www.yuque.com/crabluo/k8s/zdl28a#ouF85
#页面效果
访问 http://demo.od.com/hello?name=crabluo
结合配置中心交付Dubbo微服务
Apollo概述
配置是独立于程序的可配变量,同一份程序在不同配置下会有不同的行为,常见的配置有连接字符串,应用配置和业务配置等。
配置有多种形态,常见类别:
- 配置文件,如Spring应用程序的配置文件是application.properties文件;
- 环境变量,配置可预置在操作系统的环境变量里,程序运行时读取;
- 启动参数,在程序启动时一次性提供参数,如java程序启动时可通过 java -D 方式配置启动参数;
- 基于数据库,易变配置也可放在数据库中。
配置管理现状
- 配置格式散乱多样化(xml,ini,conf,yaml等等);
- 主要采用本地静态资源,应用多副本场景下配置修改麻烦;
- 易混淆不同环境,易引发生产事故;
- 配置缺乏安全审计和版本控制功能;
- 不同环境的应用,配置不同,持续集成过程中需要多次打包等。
Apollo配置中心概述:https://mp.weixin.qq.com/s/-hUaQPzfsl9Lm3IqQW3VDQ
Apollo环境实现
数据库配置
#信息说明
MariaDB部署在node4(10.2.2.162)上,并通过自建dns添加解析:
[root@master2 ~]# cat /var/named/od.com.zone |grep mysql
mysql A 10.2.2.162
#安装配置
#软件安装
[root@node4 ~]# yum -y install mariadb-server
#配置字符集
vim /etc/my.cnf.d/mysql-clients.cnf
[mysql]
default-character-set = utf8mb4
vim /etc/my.cnf.d/server.cnf
[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci
init_connect = "SET NAMES 'utf8mb4'"
#启动及自启
systemctl start mariadb
systemctl enable mariadb
#配置密码
mysqladmin -u root password
#验证字符集
mysql -uroot -p123456
#初始化sql
https://gitee.com/nobodyiam/apollo/tree/1.5.1/scripts/db/migration/configdb
https://gitee.com/nobodyiam/apollo/tree/1.5.1/scripts/db/migration/portaldb
下载后导入到数据库。
#用户授权
mysql> GRANT ALL PRIVILEGES ON ApolloConfigDB. TO ‘apolloconfig’@’%’ IDENTIFIED BY ‘123456’ WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON ApolloPortalDB. TO ‘apolloportal’@’%’ IDENTIFIED BY ‘123456’ WITH GRANT OPTION;
#修改初始数据
mysql> update ApolloConfigDB.ServerConfig set ServerConfig.Value=”http://config.od.com/eureka/“ where ServerConfig.key=”eureka.service.url”;
> update ApolloPortalDB.ServerConfig set Value=’[{“orgId”:”od01”,”orgName”:”Linux学院”},{“orgId”:”od02”,”orgName”:”云计算学院”},{“orgId”:”od03”,”orgName”:”Python学院”}]’ where Id=2;
#域名解析
[root@master2 ~]# vim /var/named/od.com.zone
config A 10.2.2.6
Apollo相关组件交付
地址链接中的文件是已经过下面配置的成品!!!
https://gitee.com/crabluo/K8sDockerfile/tree/master/apollo
下载地址
https://github.com/ctripcorp/apollo/releases/tag/v1.5.1
#需要下载3个软件包

#创建目录
[root@master1 /luomurui/k8snew/dockerfile]# mkdir -p apollo/{apollo-adminservice,apollo-configservice,apollo-portal}
#解压包到对应目录
unzip -o apollo-configservice-1.5.1-github.zip -d /luomurui/k8snew/dockerfile/apollo/apollo-configservice/
unzip -o apollo-adminservice-1.5.1-github.zip -d /luomurui/k8snew/dockerfile/apollo/apollo-adminservice/
unzip -o apollo-portal-1.5.1-github.zip -d /luomurui/k8snew/dockerfile/apollo/apollo-portal/
apollo-configservice交付
# 配置数据库信息
[root@master1 /luomurui/k8snew/dockerfile/apollo/apollo-configservice]# vim config/application-github.properties
# DataSource
spring.datasource.url = jdbc:mysql://mysql.od.com:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = apolloconfig
spring.datasource.password = 123456
#包中默认的启动脚本是跑在正常环境下的,在k8s中以pod方式运行需要改启动脚本
#将 [root@master1 /luomurui/k8snew/dockerfile/apollo/apollo-configservice]# ll scripts/startup.sh
此文件内容替换为
https://github.com/ctripcorp/apollo/blob/1.5.1/scripts/apollo-on-kubernetes/apollo-config-server/scripts/startup-kubernetes.sh
文件内容。
#同时还在startup.sh中加了一行内容 APOLLO_ADMIN_SERVICE_NAME=$(hostname -i)
[root@master1 /luomurui/k8snew/dockerfile/apollo/apollo-configservice]# chmod +x scripts/startup.sh
#Dockerfile
官网文件:
https://github.com/ctripcorp/apollo/blob/1.5.1/scripts/apollo-on-kubernetes/apollo-config-server/Dockerfile
官网底包环境不太好使,实际使用文件如下:
# Dockerfile for apollo-config-server
FROM kazihuo/jre8:8u112
ENV VERSION 1.5.1
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
ADD apollo-configservice-${VERSION}.jar /apollo-configservice/apollo-configservice.jar
ADD config/ /apollo-configservice/config
ADD scripts/ /apollo-configservice/scripts
CMD ["/apollo-configservice/scripts/startup.sh"]
#build&push
docker build . -t harbor.od.com/infra/apollo-configservice:v1.5.1
docker push harbor.od.com/infra/apollo-configservice:v1.5.1
#资源应用
#清单地址
https://gitee.com/crabluo/K8sFiles/tree/master/apollo/configservice
#命令应用
kubectl apply -f .
说明:资源清单中使用了ConfigMap,将配置注入到Pod中。
#验证
#命令效果
# curl -I config.od.com
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Wed, 17 Jun 2020 06:31:39 GMT
Content-Type: text/html;charset=UTF-8
Content-Length: 5108
Connection: keep-alive
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
页面效果

apollo-adminservice交付
按照 交付apollo-configservice组件 方式交付 apollo-adminservice组件。
改配置
start.sh文件参考:https://gitee.com/nobodyiam/apollo/blob/v1.5.1/scripts/apollo-on-kubernetes/apollo-admin-server/scripts/startup-kubernetes.sh
加权限
#Dockerfile
FROM kazihuo/jre8:8u112
ENV VERSION 1.5.1
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
echo "Asia/Shanghai" > /etc/timezone
ADD apollo-adminservice-${VERSION}.jar /apollo-adminservice/apollo-adminservice.jar
ADD config/ /apollo-adminservice/config
ADD scripts/ /apollo-adminservice/scripts
CMD ["/apollo-adminservice/scripts/startup.sh"]
#build&push
docker build . -t harbor.od.com/infra/apollo-adminservice:v1.5.1
docker push harbor.od.com/infra/apollo-adminservice:v1.5.1
#资源应用
#文件地址
https://gitee.com/crabluo/K8sFiles/tree/master/apollo/adminservice
#命令应用
kubectl apply -f .
#页面效果
apollo-portal交付
按照 交付apollo-configservice组件 方式交付 apollo-portal组件。
改配置
start.sh文件参考:https://gitee.com/nobodyiam/apollo/blob/v1.5.1/scripts/apollo-on-kubernetes/apollo-portal-server/scripts/startup-kubernetes.sh
加权限
#Dockerfile
FROM kazihuo/jre8:8u112
ENV VERSION 1.5.1
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
echo "Asia/Shanghai" > /etc/timezone
ADD apollo-portal-${VERSION}.jar /apollo-portal/apollo-portal.jar
ADD config/ /apollo-portal/config
ADD scripts/ /apollo-portal/scripts
CMD ["/apollo-portal/scripts/startup.sh"]
#build&push
docker build . -t harbor.od.com/infra/apollo-portal:v1.5.1
docker push harbor.od.com/infra/apollo-portal:v1.5.1
#资源应用
#文件地址
https://gitee.com/crabluo/K8sFiles/tree/master/apollo/portal
#命令应用
kubectl apply -f .
#地址解析
服务对应解析域名:portal.od.com
域名具体配置方式请参考:https://www.yuque.com/crabluo/k8s/zdl28a#ouF85
#页面效果
Apollo使用示例
状态查看
依次点击右上角的 管理员工具 > 系统信息 ,查看相应的环境信息。
dubbo-demo-service连接apollo
项目地址
https://gitee.com/crabluo/dubbo-demo-service
连接配置信息


项目创建
点击 创建项目 ,配置页面如下;
点击刚新建的项目,再点击右上角的 新增配置,添加具体信息,确认后点击 发布;
打包apollo方式镜像
Jenkins项目构建

资源应用
构建成功后应用资源清单
dp-apollo.yaml
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
name: dubbo-demo-service
namespace: app
labels:
name: dubbo-demo-service
spec:
selector:
mactchLabels:
app: dubbo-demo-service
name: dubbo-demo-service
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:apollo_200617_1804
ports:
- containerPort: 20880
protocol: TCP
env:
- name: JAR_BALL
value: dubbo-server.jar
- name: C_OPTS
value: -Denv=dev -Dapollo.meta=http://config.od.com
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
应用(基于之前的svc.yaml和ing.yaml,此处不做赘述)
kubectl apply -f dp-apollo.yaml
效果查看
查看对应Pod日志,确定service服务已正常启动

#查看apollo配置中心,能看到正在连接的服务信息

#当将dubbo-demo-service的副本数变为2时,配置中心也能看到2个连接实例列表。
dubbo-demo-consumer连接apollo
源代码apollo连接信息查看
项目创建
打包apollo方式镜像
资源应用
dp-apollo.yaml
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
name: dubbo-demo-consumer
namespace: app
labels:
name: dubbo-demo-consumer
spec:
replicas: 1
selector:
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:apollo_200618_1155
ports:
- containerPort: 8080
protocol: TCP
- containerPort: 20880
protocol: TCP
env:
- name: JAR_BALL
value: dubbo-client.jar
- name: C_OPTS
value: -Denv=dev -Dapollo.meta=http://config.od.com
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
效果查看
浏览器访问: http://demo.od.com/hello?name=apollo

Apollo配置中心分环境管理
总体说明
整体apollo配置中心环境涉及到 adminservice configservice portal 三部分组件,当需要对其开发环境,生产环境等分环境使用,可以采用在不同namespace中分别部署一套三组件即可实现分环境配置管理需求。
此文讲述另外一种方式,即将 adminservice configservice 两组件分环境部署,最后将数据汇集到一个 portal 组件中显示,通过环境列表的可选操作,实现一个 portal 组件管理不同环境的配置需求管理。
相关文件地址:https://gitee.com/crabluo/K8sFiles/tree/master/apollo/different_env
基建环境
zookeeper环境
配置两个不同环境的zk服务
#配置dns解析
[root@master2 ~]# cat /var/named/od.com.zone |grep zk
zk-test A 10.2.2.163
zk-prod A 10.2.2.162
在相应服务器上部署zk,请参考链接,此处不做赘述
链接:https://www.yuque.com/crabluo/k8s/iahvix#Kd2kA
namespace&secret
kubectl create ns test
kubectl create ns prod
kubectl create secret docker-registry harbor —docker-server=harbor.od.com —docker-username=admin —docker-password=Harbor12345 -n test
kubectl create secret docker-registry harbor —docker-server=harbor.od.com —docker-username=admin —docker-password=Harbor12345 -n prod
sql环境
因为条件有限,故多环境下使用的还是同一个数据库地址,故不同环境的不同数据需要使用不同的库名进行区分,所以需要将初始化SQL进行修改。
因为共用一个portal,故sql中只修改 configdb.sql 文件。
基于源sql进行以下操作
cp configdb.sql configdb_test.sql
cp configdb.sql configdb_prod.sql
修改(增加Test以区分库名)
vim configdb_test.sql

vim configdb_prod.sql

数据导入
mysql -uroot -p123456 < configdb_test.sql
mysql -uroot -p123456 < configdb_prod.sql
数据修改
> update ApolloConfigTestDB.ServerConfig set ServerConfig.Value=”http://config-test.od.com/eureka“ where ServerConfig.Key=”eureka.service.url”;
> update ApolloConfigProdDB.ServerConfig set ServerConfig.Value=”http://config-prod.od.com/eureka“ where ServerConfig.Key=”eureka.service.url”;
授权
> grant INSERT,DELETE,UPDATE,SELECT on ApolloConfigTestDB. to “apolloconfig”@”%” identified by “123456”;
> grant INSERT,DELETE,UPDATE,SELECT on ApolloConfigProdDB. to “apolloconfig”@”%” identified by “123456”;
修改PortalDB数据,保证页面显示配置可分环境
use ApolloPortalDB;
select * from ServerConfig\G;
update ServerConfig set Value=’fat,pro’ where Id=1;
修改portal对应的资源清单ConfigMap.yaml

数据清空
因为之前portal有过添加操作,故清空相关数据
> use ApolloPortalDB;
> truncate table AppNamespace;
> truncate table App;
资源应用
apollo各组件交付
资源地址: https://gitee.com/crabluo/K8sFiles/tree/master/apollo/different_env
应用目录下所有yaml文件并配置对应域名解析
kubectl apply -f test/configservice/
kubectl apply -f test/adminservice/
apollo页面验证
依次点击 管理员工具 > 系统参数,输入查询,能看到配置的对应信息。
apollo.portal.envs
fat,pro
服务配置添加
#不同环境下Pod调用不同配置中心的区别体现在deploy.yaml文件中
a)namespace(test prod);
b)环境变量,如下:
#apollo添加环境配置
dubbo-demo-service

dubbo-demo-web
服务调用apollo配置信息
应用目录下所有yaml文件并配置对应域名解析
kubectl apply -f test/dubbo-demo-service/
kubectl apply -f prod/dubbo-demo-service/
kubectl apply -f test/dubbo-demo-consumer/
kubectl apply -f prod/dubbo-demo-consumer/
页面效果
http://demo-test.od.com/hello?name=test
http://demo-prod.od.com/hello?name=CrabLuo





