Replies: 2 comments
-
go apollo SDK支持备份到cm的能力测试场景(Java类似)预置条件
测试步骤和预期结果:
|
Beta Was this translation helpful? Give feedback.
0 replies
-
终于有了进展 🎉 看设计是每个 APP 一个 configmap,每个 namespace 为一个 key-value,那是否可以测试一下对 ETCD 和 apiserver 的负载影响? |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
Apollo客户端原有的文件持久化方式将配置信息存储在本地文件中,在k8s环境下存在一些局限性,特别是在Apollo服务端宕机的情况下:如果Pod重启,本地文件可能会丢失,导致配置信息不可用。为了提高配置信息的可靠性和容错性,我们提出了一种新的持久化方案,即通过Kubernetes的ConfigMap来存储配置信息。
1. 目标
● 确保在Apollo服务端宕机且Pod重启时,应用能够从ConfigMap恢复配置信息。
● 用户通过客户端配置控制是否启用ConfigMap持久化功能。
● 同时支持configMap和文件两种持久化方式,构造链式恢复,进一步提升可用性
2.用户配置要求
● 所在Pod的Service Account需具备读写ConfigMap的权限。
● java客户端:通过设置环境变量apollo.cache.kubernetes.enable=true启用持久化功能,并可通过apollo.configmap-namespace指定ConfigMap的namespace。
● go客户端:在AppConfig中将IsBackupConfigToConfigMap字段设为 true 以启用ConfigMap持久化,并通过 ConfigMapNamespace字段设置ConfigMap的namespace。
3.技术实现概览
Go语言实现
Java语言实现
4.容错与灰度发布处理
● 配置信息读取的优先级:远程server>文件缓存>configMap缓存
● 灰度发布时ConfigMap的局限性及解决方案: 客户端无法知道哪些是灰度数据,且多个pod会共享同⼀个configMap,导致冲突,所以 configMap无法支持灰度数据的持久化。 不过这些灰度数据仍可以通过本地文件或服务端拉取获得,因此设计为远程-文件-configMap三层的链式拉取
● 提供兜底机制:宕机恢复时,先访问服务端能否正常返回数据,如果不行,去本地文件加载数据。如果文件也未找到,返回用户设置的cluster+namespace对应的configmap的数据,如果再找不到,去idc数据中心请求,如果都不能找到,返回default+namespace的configmap数据,作为兜底
(推荐开启configmap的同时开启文件缓存,configmap不支持灰度数据的存储)
5.配置映射关系
● 明确AppId、Cluster、Namespace在java、go客户端中的映射方式。
● appId做configMap名,cluster+namespace做key,配置值为value。
使用json存储真实配置文件信息,并定义统一的configMapName,key,value。使k8s中使用java、go两种客户端的不同pod中的应用程序能同时使用同一个configMap,提高了兼容性
Beta Was this translation helpful? Give feedback.
All reactions