1.痛点描述
某个业务根据场景的不同,业务部署方式有两种选择:
使用三台主机组 k8s 部署
单机使用 docker-compose 进行部署。
业务服务是通过 java springboot 框架编写的。每个微服务的系统端口配置及相互调用配置都写在 application.yml 中。
目前的痛点是:k8s通过 pod:port -> svc:80 ,所有业务服务 service 端口都映射为 80 清单配置文件如下:
apiVersion: v1kind: Servicemetadata: name: xxx labels: app: xxx service: xxxspec: ports: - port: 80 # service端口为:80 name: http targetPort: 8969 selector: app: xxx---apiVersion: apps/v1kind: Deploymentmetadata: name: xxx labels: app: xxxspec: 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 都采用同一份配置信息,万变不离其宗。
基于以上痛点,解决方案如下:
将业务服务端口统一规划,由运维统一出口。规划的原则是:每个服务的端口禁止重复。后期上新服务端口也需要运维授权;
k8s中service端口与 Pod端口一致,服务之间调用采用service 端口进行,该点也是基于在第1点完成的情况下才能实现;
docker-compose中端口默认采用业务服务端口进行相互调用。
通过以上三点改造,就能将 k8s、docker-compose、host本地 统一为 一份配置文件,再基于 配置中心的方式集中管理。
接下来就是配置中心的选择,这里直接采用 apollo 进行管控。
使用 apollo 就需要考虑如果以最优的方式与环境进行融合。
apollo 部署分为好几种方式:
本地部署
docker 部署
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 files2.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:hukeyfor image in `/usr/bin/ls images/*.tar.gz`; do docker load < $imagedonedocker-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
下一条:全面图解Docker架构设计
品质保证
多年的生产力软件专家
专业实力
资深技术支持项目实施团队
安全无忧
多位认证安全工程师
多元服务
软件提供方案整合,项目咨询实施
购软平台-找企业级软件,上购软平台。平台提供更齐全的软件产品、更专业的技术服务,同时提供行业资讯、软件使用教程和技巧。购软平台打造企业级数字产品综合应用服务平台。用户体验和数字类产品的专业化服务是我们不断追求的目标。购软平台您身边的企业级数字产品优秀服务商。