2020-09-22

本文介绍了如何在Kubernetes(K8S)环境中部署和使用Apollo配置中心,包括数据库初始化、环境分库、DNS配置、镜像制作、服务部署以及多环境配置管理。Apollo作为配置管理工具,提供了配置的实时推送、权限管理等功能,通过Eureka进行服务发现,确保高可用性。部署时,不同环境如开发、测试、生产使用独立的admin service、config service和数据库,以实现分环境的配置中心。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置中心1. 配置中心介绍1.1. 配置管理方式
当前的微服务环境中,配置项都不是硬编码到代码中的,需要通过外部文件或者参数的方式来实现可动态调整的配置,目前主要有以下几种方式来管理:
*
数据库:部分开发会将配置写在数据库中,定期读取和应用
*
环境变量:这种是云原生环境中很常用的一种方式,通过在容器启动时对全局环境变量赋值的方式来完成
*
命令行参数:通过Pod的args或者docker容器的CMD来实现启动参数调整
*
configmap:K8S集群中独有配置管理方案,参考:ConfigMap
*
存储卷:将公共配置放在共享存储中,然后容器启动时挂载配置文件,不建议使用
*
第三方配置中心:如 Apollo、XDiamond、Qconf等,这类配置中心操作根据方便

1.2. Apollo
Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。Apollo支持4个维度管理Key-Value格式的配置:Namespace(名称空间)、Cluster(集群)、Environment(环境)、Application(应用)。具体介绍参考:https://github.com/ctripcorp/apollo/wiki1.2.1. Apollo 特性
*
统一管理不同环境(支持有限的环境关键词)、不同集群的配置
*
配置修改实时生效
*
版本发布管理
*
灰度发布
*
权限管理、发布审核、操作审计
*
客户端配置信息监控
*
提供Java和.Net原生客户端,且支持HTTP接口

1.2.2. Apollo 基础模型
用户发布配置到 Apollo 配置中心 --> 通知客户端配置发生变化 --> 客户端拉取配置
1.2.3. 整体架构
*
Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端
*
Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)
*
Config Service和Admin Service都是多实例、无状态部署,所以需要将自己注册到Eureka中并保持心跳
*
在Eureka之上我们架了一层Meta Server用于封装Eureka的服务发现接口
*
Client通过域名访问Meta Server获取Config Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Client侧会做load balance、错误重试
*
Portal通过域名访问Meta Server获取Admin Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Portal侧会做load balance、错误重试
*
为了简化部署,我们实际上会把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM进程中,因此必须要先部署 Config Service,否则其它服务交付会出错

选择Eureka的原因:
*
它提供了完整的Service Registry和Service Discovery实现

	* 

首先是提供了完整的实现,并且也经受住了Netflix自己的生产环境考验,相对使用起来会比较省心。
*
和Spring Cloud无缝集成

	* 

我们的项目本身就使用了Spring Cloud和Spring Boot,同时Spring Cloud还有一套非常完善的开源代码来整合Eureka,所以使用起来非常方便。
*
另外,Eureka还支持在我们应用自身的容器中启动,也就是说我们的应用启动完之后,既充当了Eureka的角色,同时也是服务的提供者。这样就极大的提高了服务的可用性。
*
这一点是我们选择Eureka而不是zk、etcd等的主要原因,为了提高配置中心的可用性和降低部署复杂度,我们需要尽可能地减少外部依赖。
*
Open Source

	* 

最后一点是开源,由于代码是开源的,所以非常便于我们了解它的实现原理和排查问题。

1.2.4. 客户端实现方式

* 

客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。
*
客户端还会定时从Apollo配置中心服务端拉取应用的最新配置。

	* 

这是一个fallback机制,为了防止推送机制失效导致配置不更新
*
客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified
*
定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property: apollo.refreshInterval来覆盖,单位为分钟。
*
客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中
*
客户端会把从服务端获取到的配置在本地文件系统缓存一份

	* 

在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置
*
应用程序从Apollo客户端获取最新的配置、订阅配置更新通知

1.2.5. 高可用场景
场景
影响
降级
原因
某台config service下线
无影响

Config service无状态,客户端重连其它config service
所有config service下线
客户端无法读取最新配置,Portal无影响
客户端重启时,可以读取本地缓存配置文件

某台admin service下线
无影响

Admin service无状态,Portal重连其它admin service
所有admin service下线
客户端无影响,portal无法更新配置

某台portal下线
无影响

Portal域名通过slb绑定多台服务器,重试后指向可用的服务器
全部portal下线
客户端无影响,portal无法更新配置

某个数据中心下线
无影响

多数据中心部署,数据完全同步,Meta Server/Portal域名通过slb自动切换到其它存活的数据中心1.3. 部署架构图
生产实践中,开发环境、测试环境、生产环境放到三个不同的K8S集群中,三个环境中使用三套不同的 admin service、config service和数据库,共用同一个Protal前端。从而实现了分环境的配置中心。本次实验环境资源有限,采用不同的K8S名称空间区分不同的环境。

  1. 准备环境2.1. 停止dubbo微服务集群
    持续集成章节中的Provider、Consumer、Monitor全部停止掉。2.2. 拆分zookeeper集群
    为了模拟生产、测试、开发三种环境,将zookeeper集群拆分为独立的三个节点。

hdss7-11,hdss7-12,hdss7-21 操作一致

[root@hdss7-11 ~]# /opt/apps/zookeeper/bin/zkServer.sh stop
[root@hdss7-11 ~]# rm -fr /data/zookeeper/data/* /data/zookeeper/logs/* # 删除历史数据
[root@hdss7-11 ~]# sed -i ‘/^server/d’ /opt/apps/zookeeper/conf/zoo.cfg # 删除集群配置

[root@hdss7-11 ~]# /opt/apps/zookeeper/bin/zkServer.sh start
[root@hdss7-11 ~]# /opt/apps/zookeeper/bin/zkServer.sh status # 启动后,所有节点都为 standalone 模式
ZooKeeper JMX enabled by default
Using config: /opt/apps/zookeeper/bin/…/conf/zoo.cfg
Mode: standalone
2.3. 创建名称空间

[root@hdss7-22 ~]# kubectl create namespace pro
[root@hdss7-22 ~]# kubectl create namespace fat
[root@hdss7-22 ~]# kubectl create namespace dev
[root@hdss7-22 ~]# kubectl create secret docker-registry harbor --docker-username=admin --docker-password=‘Harbor12345’ --docker-server=http://harbor.od.com -n pro
[root@hdss7-22 ~]# kubectl create secret docker-registry harbor --docker-username=admin --docker-password=‘Harbor12345’ --docker-server=http://harbor.od.com -n fat
[root@hdss7-22 ~]# kubectl create secret docker-registry harbor --docker-username=admin --docker-password=‘Harbor12345’ --docker-server=http://harbor.od.com -n dev
3. 部署Config Service3.1. 初始化数据库3.1.1. 刷SQL脚本

数据库服务器: hdss7-150.host.com MySQL 5.7

[root@hdss7-150 src]# wget -O config.sql https://raw.githubusercontent.com/ctripcorp/apollo/1.5.1/scripts/db/migration/configdb/V1.0.0__initialization.sql

SQL脚本中的调整:

1. 不同环境分库;

2. 不同环境中 ApolloConfigDB.ServerConfig 表中Eureka地址调整

[root@hdss7-150 src]# sed -i ‘s#http://localhost:8080/eureka/#http://config.od.com/eureka/#’ config.sql
[root@hdss7-150 src]# sed ‘s/ApolloConfigDB/ApolloConfigFatDB/;s#http://config.od.com/eureka/#http://config-fat.od.com/eureka/#’ config.sql > config-fat.sql
[root@hdss7-150 src]# sed ‘s/ApolloConfigDB/ApolloConfigDevDB/;s#http://config.od.com/eureka/#http://config-dev.od.com/eureka/#’ config.sql > config-dev.sql

[root@hdss7-150 src]# mysql -uroot -p < config.sql
[root@hdss7-150 src]# mysql -uroot -p < config-fat.sql
[root@hdss7-150 src]# mysql -uroot -p < config-dev.sql

授权,实践中不同环境的库可以使用不同的用户名和密码

因为Pod连接MySQL是做了SNAT,所以需要使用Node IP授权,如果需要显示Pod地址,可以添加路由表

mysql> grant SELECT,INSERT,UPDATE,DELETE on ApolloConfigDB.* to apolloconfig@‘10.4.7.%’ identified by ‘Centos.1992!@#’ ;
mysql> grant SELECT,INSERT,UPDATE,DELETE on ApolloConfigFatDB.* to apolloconfig@‘10.4.7.%’ identified by ‘Centos.1992!@#’ ;
mysql> grant SELECT,INSERT,UPDATE,DELETE on ApolloConfigDevDB.* to apolloconfig@‘10.4.7.%’ identified by ‘Centos.1992!@#’ ;
mysql> show grants for apolloconfig@‘10.4.7.%’;
±-------------------------------------------------------------------------------------------+
| Grants for apolloconfig@10.4.7.% |
±-------------------------------------------------------------------------------------------+
| GRANT USAGE ON . TO ‘apolloconfig’@‘10.4.7.%’ |
| GRANT SELECT, INSERT, UPDATE, DELETE ON ApolloConfigDB.* TO ‘apolloconfig’@‘10.4.7.%’ |
| GRANT SELECT, INSERT, UPDATE, DELETE ON ApolloConfigFatDB.* TO ‘apolloconfig’@‘10.4.7.%’ |
| GRANT SELECT, INSERT, UPDATE, DELETE ON ApolloConfigDevDB.* TO ‘apolloconfig’@‘10.4.7.%’ |
±-------------------------------------------------------------------------------------------+
3.1.2. 配置DNS解析

[root@hdss7-11 ~]# vim /var/named/od.com.zone

config A 10.4.7.10
config-fat A 10.4.7.10
config-dev A 10.4.7.10
mysql A 10.4.7.150
[root@hdss7-11 ~]# systemctl restart named
3.2. 制作Config Service镜像

下载页面: https://github.com/ctripcorp/apollo/releases/tag/v1.5.1

[root@hdss7-200 src]# unzip apollo-configservice-1.5.1-github.zip -d docker_files/apollo-configservice
[root@hdss7-200 src]# cd docker_files/apollo-configservice
[root@hdss7-200 apollo-configservice]# ls config/ -l # 以下配置采用 configmap 挂载
total 8
-rw-r–r-- 1 root root 289 Nov 9 23:21 application-github.properties # DB信息
-rw-r–r-- 1 root root 30 Apr 20 2017 app.properties # appid,jdkVersion信息

修改 scripts/startup.sh; 其中内存参数需要根据情况调整,此处增加了一个APOLLO_CONFIG_SERVICE_NAME,没有通过环境变量传递

#!/bin/bash

https://github.com/ctripcorp/apollo/tree/1.5.1/scripts/apollo-on-kubernetes/apollo-config-server/scripts

SERVICE_NAME=apollo-configservice

Adjust log dir if necessary

LOG_DIR=/opt/logs/apollo-config-server

Adjust server port if necessary

SERVER_PORT=8080
APOLLO_CONFIG_SERVICE_NAME=$(hostname -i)

SERVER_URL=“http://APOLLOCONFIGSERVICENAME:{APOLLO_CONFIG_SERVICE_NAME}:APOLLOCONFIGSERVICENAME:{SERVER_PORT}”

Adjust memory settings if necessary

#export JAVA_OPTS="-Xms6144m -Xmx6144m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m -XX:NewSize=4096m -XX:MaxNewSize=4096m -XX:SurvivorRatio=8"

Only uncomment the following when you are using server jvm

#export JAVA_OPTS="$JAVA_OPTS -server -XX:-ReduceInitialCardMarks"

########### The following is the same for configservice, adminservice, portal ###########
export JAVA_OPTS=“JAVAOPTS−XX:ParallelGCThreads=4−XX:MaxTenuringThreshold=9−XX:+DisableExplicitGC−XX:+ScavengeBeforeFullGC−XX:SoftRefLRUPolicyMSPerMB=0−XX:+ExplicitGCInvokesConcurrent−XX:+HeapDumpOnOutOfMemoryError−XX:−OmitStackTraceInFastThrow−Duser.timezone=Asia/Shanghai−Dclient.encoding.override=UTF−8−Dfile.encoding=UTF−8−Djava.security.egd=file:/dev/./urandom"exportJAVAOPTS="JAVA_OPTS -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=9 -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+ExplicitGCInvokesConcurrent -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom" export JAVA_OPTS="JAVAOPTSXX:ParallelGCThreads=4XX:MaxTenuringThreshold=9XX:+DisableExplicitGCXX:+ScavengeBeforeFullGCXX:SoftRefLRUPolicyMSPerMB=0XX:+ExplicitGCInvokesConcurrentXX:+HeapDumpOnOutOfMemoryErrorXX:OmitStackTraceInFastThrowDuser.timezone=Asia/ShanghaiDclient.encoding.override=UTF8Dfile.encoding=UTF8Djava.security.egd=file:/dev/./urandom"exportJAVAOPTS="JAVA_OPTS -Dserver.port=SERVERPORT−Dlogging.file=SERVER_PORT -Dlogging.file=SERVERPORTDlogg

标题基于PHP + JavaScript的助眠小程序设计与实现AI更换标题第1章引言介绍助眠小程序的研究背景、意义,以及论文的研究内容和创新点。1.1研究背景与意义阐述助眠小程序在当前社会的重要性和应用价值。1.2国内外研究现状分析国内外在助眠小程序方面的研究进展及现状。1.3论文研究内容与创新点概述论文的主要研究内容和创新之处。第2章相关理论基础介绍助眠小程序设计与实现所涉及的相关理论基础。2.1PHP编程技术阐述PHP编程技术的基本概念、特点和在助眠小程序中的应用。2.2JavaScript编程技术介绍JavaScript编程技术的核心思想、作用及在小程序中的实现方式。2.3小程序设计原理讲解小程序的设计原则、架构和关键技术。第3章助眠小程序需求分析对助眠小程序进行详细的需求分析,为后续设计与实现奠定基础。3.1用户需求调研用户需求调研的过程和方法,总结用户需求。3.2功能需求分析根据用户需求,分析并确定助眠小程序的核心功能和辅助功能。3.3性能需求分析明确助眠小程序在性能方面的要求,如响应速度、稳定性等。第4章助眠小程序设计详细阐述助眠小程序的设计方案,包括整体架构、功能模块和界面设计。4.1整体架构设计给出助眠小程序的整体架构设计思路和实现方案。4.2功能模块设计详细介绍各个功能模块的设计思路和实现方法。4.3界面设计阐述助眠小程序的界面设计风格、布局和交互设计。第5章助眠小程序实现与测试讲解助眠小程序的实现过程,并进行详细的测试与分析。5.1开发环境搭建与配置介绍开发环境的搭建过程和相关配置信息。5.2代码实现与优化详细阐述助眠小程序的代码实现过程,包括关键技术的运用和优化措施。5.3测试与性能分析对助眠小程序进行全面的测试,包括功能测试、性能测试等,并分析测试结果。第6章结论与展望总结论文的研究成果,展望未来的研究方向和应用前景。6.1研究成果总结概括性地总结论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值