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