docker-compose 自动部署apollo

Posted hukey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker-compose 自动部署apollo相关的知识,希望对你有一定的参考价值。

1.痛点描述


某个业务根据场景的不同,业务部署方式有两种选择:

  1. 使用三台主机组 k8s 部署
  2. 单机使用 docker-compose 进行部署。

业务服务是通过 java springboot 框架编写的。每个微服务的系统端口配置及相互调用配置都写在 application.yml 中。


目前的痛点是:k8s通过 pod:port -> svc:80 ,所有业务服务 service 端口都映射为 80 清单配置文件如下:

apiVersion: v1
kind: Service
metadata:
  name: xxx
  labels:
    app: xxx
    service: xxx
spec:
  ports:
  - port: 80	# service端口为:80
    name: http
    targetPort: 8969
  selector:
    app: xxx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: xxx
  labels:
    app: xxx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: xxx
  template:
    metadata:
      labels:
        app: xxx
    spec:
      serviceAccountName: xxx
      imagePullSecrets:
      - name: harbor-registry
      nodeName: k8s-node01
      containers:
      - name: xxx
        image: xxx:v2
        imagePullPolicy: Always
        ports:
        - containerPort: 8969	# 服务端口

因此当服务之间调用时,直接采用 服务名:80 端口的方式进行调用,如下:

bash-4.4# egrep http  application.yml
ftServer: http://xxx:80

而在使用 docker-compose 时,如果也采用 80 端口的,就需要对业务服务端口进行全部的更新,都启用为 80 端口,如下:

# head config/application.yml
#服务器配置
server:
  port: 80

将所有业务服务都修改为 80 端口,这样做在 容器环境中也不是不可行。但是需要多考虑一步,如果是在非容器的环境中呢? 例如,本地直接启动服务,那么所有的服务端口又得改为不同的端口。

上面的所有的问题都是维护业务服务配置文件的问题,因此考虑到使用 配置中心的方式 将所有的配置统一起来,无论是 k8s 、docker-compose、或者 本机 host 都采用同一份配置信息,万变不离其宗。

基于以上痛点,解决方案如下:

  1. 将业务服务端口统一规划,由运维统一出口。规划的原则是:每个服务的端口禁止重复。后期上新服务端口也需要运维授权;
  2. k8s中service端口与 Pod端口一致,服务之间调用采用service 端口进行,该点也是基于在第1点完成的情况下才能实现;
  3. docker-compose中端口默认采用业务服务端口进行相互调用。

通过以上三点改造,就能将 k8s、docker-compose、host本地 统一为 一份配置文件,再基于 配置中心的方式集中管理。

接下来就是配置中心的选择,这里直接采用 apollo 进行管控。

使用 apollo 就需要考虑如果以最优的方式与环境进行融合。

apollo 部署分为好几种方式:

  1. 本地部署
  2. docker 部署
  3. k8s 部署

这里可以参考我之前的博文:https://www.cnblogs.com/hukey/p/14822521.html

但是这三种方式对于经常在 k8s、docker-compose 之间切换也存在运维问题,例如:k8s环境,apollo采用k8s部署,如果切换到docker-compose又需要采用docker部署。

因此,采用一个折中的方案:采用 docker-compose 实现 apollo 的部署。即方便数据管理又简单易用。


2.部署apollo


采用 docker-compose 的方式进行部署。下载地址:链接:https://pan.baidu.com/s/1HfT6_S_52fxXXBjXRp2Faw 提取码:hkey
目录:博客园文章共享目录 / 持续集成 / docker-compose部署apollo


目录结构如下:

root@apollo(192.168.199.105)/data/apollo>tree
.
├── docker-compose.yaml
├── run-apollo.sh
├── images
│   ├── apollo-adminservice-2.1.0-image.tar.gz
│   ├── apollo-configservice-2.1.0-image.tar.gz
│   ├── apollo-portal-2.1.0-image.tar.gz
│   └── mysql-5.7.18-image.tar.gz
└── mysql
    ├── data
    └── source
        ├── apolloconfigdb.sql
        └── apolloportaldb.sql

4 directories, 7 files

2.1 程序包下载


2.2 清单文件


docker-compose.yaml 文件如下:

version: "3.7"
services:
  mysql:
    container_name: mysql
    image: mysql:5.7.18
    environment:
    - "MYSQL_ROOT_PASSWORD=123456"
    - "TZ=Asia/Shanghai"
    restart: always
    command: --max-connections=1000 --server-id=1 --log-bin=mysql-bin
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      interval: 5s
      timeout: 1s
      retries: 10
    volumes:
    #- ./mysql/mydir:/mydir
    - ./mysql/data:/var/lib/mysql
    #- ./mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf # 本地存放配置文件
    - ./mysql/source:/docker-entrypoint-initdb.d  # 全备备份sql文件放置到此目录下
    network_mode: "host"

  apollo-configservice:
    container_name: apollo-configservice
    image: apolloconfig/apollo-configservice:2.1.0
    restart: always
    environment:
    - SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8&useSSL=false&serverTimezone=GMT
    - SPRING_DATASOURCE_USERNAME=root
    - SPRING_DATASOURCE_PASSWORD=123456
    volumes:
    - /tmp/logs:/opt/logs
    healthcheck:
      test: ["CMD", "curl" ,"localhost:8080/health"]
      interval: 5s
      timeout: 1s
      retries: 10
    depends_on:
      mysql:
        condition: service_healthy
    network_mode: "host"

  apollo-adminservice:
    container_name: apollo-adminservice
    image: apolloconfig/apollo-adminservice:2.1.0
    restart: always
    environment:
    - SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8&useSSL=false&serverTimezone=GMT
    - SPRING_DATASOURCE_USERNAME=root
    - SPRING_DATASOURCE_PASSWORD=123456
    volumes:
    - /tmp/logs:/opt/logs
    healthcheck:
      test: ["CMD", "curl" ,"localhost:8090/health"]
      interval: 5s
      timeout: 1s
      retries: 10
    depends_on:
      apollo-configservice:
        condition: service_healthy
    network_mode: "host"

  apollo-portal:
    container_name: apollo-portal
    image: apolloconfig/apollo-portal:2.1.0
    restart: always
    environment:
    - SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8&useSSL=false&serverTimezone=GMT
    - SPRING_DATASOURCE_USERNAME=root 
    - SPRING_DATASOURCE_PASSWORD=123456
    - APOLLO_PORTAL_ENVS=pro    #注意这里,如果要修改不同环境名,则数据库也必须修改 ApolloPortalDB.ServerConfig 中 apollo.portal.envs 该行的信息,否则启动会发生报错
    - PRO_META=http://localhost:8080 # 这里需要写环境名对应的 configservice 服务。
    volumes:
    - /tmp/logs:/opt/logs
    healthcheck:
      test: ["CMD", "curl" ,"localhost:8070/health"]
      interval: 5s
      timeout: 1s
      retries: 10
    depends_on:
      apollo-adminservice:
        condition: service_healthy
      apollo-configservice:
        condition: service_healthy
    network_mode: "host"


2.3 执行脚本


start-apollo.sh

#!/bin/bash
# Author:hukey
for image in `/usr/bin/ls images/*.tar.gz`; do
  docker load < $image
done
docker-compose up -d

执行结果:

>sh run-apollo.sh
[+] Running 4/4
 ✔ Container mysql                 Healthy 12.0s
 ✔ Container apollo-configservice  Healthy 49.8s
 ✔ Container apollo-adminservice   Healthy 92.3s
 ✔ Container apollo-portal         Started 92.6s


--- EOF ---

docker-compose 一键部署分布式配置中心Apollo

简介

说起分布式肯定要想到分布式配置中心、分布式日志、分布式链路追踪等

在分布式部署中业务往往有很多配置比如: 应用程序在启动和运行时需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数据库连接参数、启动参数等,都需要去维护和配置,但不可能一台台服务器登录上去配置
今天我要跟大家分享一下分布式配置中心Apollo:

Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

搭建

官方文档中有两种搭建方式一种是下载源代码进行搭建,一种是使用Docker或者K8S进行搭建,今天我们使用Docker来进行搭建,毕竟Docker对于开发者来说更友好一些。

如果已有Mysql服务,推荐已有Mysql服务或者云服务RDS来当数据库使用,毕竟数据无价。

version: "3"
services:
  apollo-configservice: #Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端
    image: apolloconfig/apollo-configservice:1.8.1
    restart: always
    #container_name: apollo-configservice
    volumes:
          - ./logs/apollo-configservice:/opt/logs
    ports:
      - "8080:8080"
    environment:
      - TZ='Asia/Shanghai'    
      - SERVER_PORT=8080
      - EUREKA_INSTANCE_IP_ADDRESS=xxx.xxx.xxx.xxx
      - EUREKA_INSTANCE_HOME_PAGE_URL=http://xxx.xxx.xxx.xxx:8080
      - SPRING_DATASOURCE_URL=jdbc:mysql://xxx.xxx.xxx.xxx:3306/ApolloConfigDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=MysqkPassWord!
      
      
  apollo-adminservice: #Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)
    image: apolloconfig/apollo-adminservice:1.8.1
    restart: always
    #container_name: apollo-adminservice
    volumes:
      - ./logs/apollo-adminservice:/opt/logs
    ports:
      - "8090:8090"
    depends_on:
      - apollo-configservice
    environment:
      - TZ='Asia/Shanghai'    
      - SERVER_PORT=8090
      - EUREKA_INSTANCE_IP_ADDRESS=xxx.xxx.xxx.xxx
      - SPRING_DATASOURCE_URL=jdbc:mysql://xxx.xxx.xxx.xxx:3306/ApolloConfigDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=MysqkPassWord!
      
      
  apollo-portal: #管理界面
    image: apolloconfig/apollo-portal:1.8.1
    restart: always
    container_name: apollo-portal
    volumes:
      - ./logs/apollo-portal:/opt/logs
    ports:
      - "8070:8070"
    depends_on:
      - apollo-adminservice
    environment:
      - TZ='Asia/Shanghai'    
      - SERVER_PORT=8070
      - EUREKA_INSTANCE_IP_ADDRESS=xxx.xxx.xxx.xxx
      - APOLLO_PORTAL_ENVS=dev
      - DEV_META=http://xxx.xxx.xxx.xxx:8080
      - SPRING_DATASOURCE_URL=jdbc:mysql://xxx.xxx.xxx.xxx:3306/ApolloPortalDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=MysqkPassWord!

从以上docker-compose.yaml中可以看出共包含3个服务,分别为:

  1. Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端

  2. Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)

  3. Portal(管理界面)
    如果想了解它们之间的运行方式推荐查看官方文档

日志挂载到外部./logs目录下

大家可以看到上方并没有给出Mysql的部署,如果需要使用容器部署Mysql可以参照下方docker-compose.yaml

version: '3'

services: 

  mysql: # myslq 数据库
    image: 'mysql/mysql-server'
    container_name: 'mysql'
    restart: always
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --lower-case-table-names=1
    environment: #环境变量
      MYSQL_ROOT_HOST: "%" 
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: brook
      MYSQL_PASSWORD: password
    ports:
      - "3306:3306"

上述mysql的docker-compose.yaml 仅供测试使用

初始化数据库
初始化

[apolloconfigdb.sql](https://github.com/apolloconfig/apollo/blob/master/scripts/docker-quick-start/sql/apolloconfigdb.sql) 和 [apolloportaldb.sql](https://github.com/apolloconfig/apollo/blob/master/scripts/docker-quick-start/sql/apolloportaldb.sql)


数据库初始化后,记得修改apolloconfigdb库中serverconfig表的 eureka.service.url 否则 apollo-adminservice无法注册到eureka

修改后切换到Apollo docker-compose.yaml目录 然后使用

docker-compose up -d #启动文件中的三个服务并且后台运行


查看启动情况

docker-compose ps


访问 http://10.0.0.53:8070/ #Apollo管理端

默认用户名:apollo
默认密码:admin

创建一个测试项目

测试

创建一个.NetCore项目 添加Apollo.net client

添加Apollo

配置Apollo

配置如上

添加测试内容
代码中获取Apollo

启动程序 请求/weatherforecast/apollotest

发现并未获取到apollo中设置的配置

检查Apollo发现配置的值并没有发布

所以大家配置或者修改了Apollo一定记得发布,我们发布后再次刷新浏览器

发现数据已经是新的数据了,我们再次修改一下Apollo的Value

刷新

致此 Apollo已经搭建完毕并且可以正常使用了

代码

示例中的代码在

https://github.com/yuefengkai/Brook.Apollo

欢迎大家Start

注意如果程序启动后无法拉取配置,可以打开Apollo的日志,在控制台中可以看到详细的配置 放到Program.cs Main函数第一行即可!

LogManager.UseConsoleLogging(Com.Ctrip.Framework.Apollo.Logging.LogLevel.Trace);

参考

1.https://github.com/apolloconfig/apollo.net
2.https://github.com/apolloconfig/apollo
3.https://github.com/apolloconfig/apollo/tree/master/scripts/docker-quick-start

 

以上是关于docker-compose 自动部署apollo的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose 一键部署分布式配置中心Apollo

Apollo 网关在 docker-compose 中不起作用

docker-compose的flask自动部署

使用 Apollo Express、Nginx 和 docker-compose 保护 websocket

k8s 部署 apollo 配置中心

k8s 部署 apollo 配置中心