Jenkins环境实现

自定义镜像

信息说明
Jenkins服务以Pod形式运行在Kubernetes集群中,其在持续集成的过程中需要拉代码、做镜像、推镜像、应用资源清单等等操作。为了简化配置操作,故在基于官方Jenkins镜像基础上进行个性化配置,内容包括:
a)以root用户运行;
b)更正8h时区差;
c)配置与宿主机相同的ssh认证信息;
d)安装docker并配置自定义镜像仓库访问权限;
e)配置kubectl命令和集群权限等。

镜像制作
https://gitee.com/crabluo/K8sDockerfile/tree/master/jenkins2.2223

  1. [root@master1 /luomurui/gitee/K8sDockerfile/jenkins2.2223]# ls
  2. config config.json Dockerfile get-docker.sh id_rsa kubectl
  1. [root@master1 /k8snew/dockerfile/jenkins2.2223]# cat Dockerfile
  2. FROM jenkins/jenkins:2.222.3
  3. USER root
  4. RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
  5. echo 'Asia/Shanghai' >/etc/timezone
  6. ADD id_rsa /root/.ssh/id_rsa
  7. ADD config.json /root/.docker/config.json
  8. ADD get-docker.sh /get-docker.sh
  9. ADD kubectl /bin/kubectl
  10. ADD config /root/.kube/config
  11. RUN chmod +x /bin/kubectl
  12. RUN echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config &&\
  13. /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

页面效果
image.png

插件便捷配置

在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出现了,服务治理图:
image.png

技术架构
image.png

信息说明

节点 角色说明
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

Jenkins新建pipeline项目,配置信息如下:

参数信息

#添加参数化构建(包含字符参数和选项参数)
image.png
image.png
image.png
image.png
image.png

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}"
        }
      }
    }
}

项目构建

点击参数化构建,如下:
image.png

构建结果

构建成功后可在harbor仓库看到对应的镜像包。
image.png

清单应用

将服务部署到集群。
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
image.png

交付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项目地址文件。
image.png

#打包上传
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

#清单应用
kubectl apply -f .

效果查看

#地址解析
服务对应解析域名:dubbo-monitor.od.com
域名具体配置方式请参考:https://www.yuque.com/crabluo/k8s/zdl28a#ouF85

#页面效果
image.png

交付dubbo-consumer

资源信息

#Jenkins参数化构建内容
image.png

#清单文件
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 .

日志查看
image.png

监控查看
image.png

功能验证

#地址解析
服务对应解析域名:demo.od.com
域名具体配置方式请参考:https://www.yuque.com/crabluo/k8s/zdl28a#ouF85

#页面效果
访问 http://demo.od.com/hello?name=crabluo
image.png

结合配置中心交付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
image.png

#初始化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个软件包
image.png

#创建目录
[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)
image.png
[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

页面效果
image.png

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 .

#页面效果
image.png

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

#页面效果
image.png

#登陆信息
apollo/admin

Apollo使用示例

状态查看

依次点击右上角的 管理员工具 > 系统信息 ,查看相应的环境信息。
image.png

dubbo-demo-service连接apollo

项目地址
https://gitee.com/crabluo/dubbo-demo-service

连接配置信息
image.png
image.png

项目创建

点击 创建项目 ,配置页面如下;
image.png
点击刚新建的项目,再点击右上角的 新增配置,添加具体信息,确认后点击 发布;
image.png

打包apollo方式镜像

Jenkins项目构建
image.png

资源应用

构建成功后应用资源清单
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服务已正常启动
image.png
#查看apollo配置中心,能看到正在连接的服务信息
image.png
#当将dubbo-demo-service的副本数变为2时,配置中心也能看到2个连接实例列表。

dubbo-demo-consumer连接apollo

源代码apollo连接信息查看

image.png
image.png

项目创建

image.png

打包apollo方式镜像

image.png

资源应用

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
image.png

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
image.png
vim configdb_prod.sql
image.png

数据导入
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
image.png

数据清空

因为之前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
image.png

服务配置添加

#不同环境下Pod调用不同配置中心的区别体现在deploy.yaml文件中
a)namespace(test prod);
b)环境变量,如下:
image.png

#apollo添加环境配置
dubbo-demo-service
image.png
image.png
dubbo-demo-web
image.png
image.png

服务调用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
image.png
http://demo-prod.od.com/hello?name=CrabLuo
image.png