中文 | English
Apollo-ConfigMap 用来同步 Apollo Config 配置中心的配置到K8S集群的ConfigMap中。
Apollo Config 是一款可靠的分布式配置管理中心,支持properties/yaml/xml/json等配置文件的管理和分发;客户端接入上支持Java/Go/Python等语言的SDK接入。
本项目提供一个新的 K8S 中应用的接入Apollo配置中心的方式:
部署apollo-configmap controller, 创建ApolloConfigServer和ApolloConfig K8S资源;
controller 会自动同步Apollo配置中心的配置到 K8S 集群的 ConfigMap中,并且自动感知Apollo的配置变更,实现配置变更自动更新ConfigMap。
- K8S集群中部署apollo-configmap controller:
kubectl apply -f dist/install.yaml
- 查看已创建的资源:
kubectl get all -n apollo-configmap-system
查看controller Pod 的日志,确保controller正常运行:
kubectl logs -n apollo-configmap-system apollo-configmap-controller-manager-7588796dc6-hgf5r
您应该看到类似以下的日志:
2025-01-22T10:50:20Z INFO setup starting manager
2025-01-22T10:50:20Z INFO controller-runtime.metrics Starting metrics server
2025-01-22T10:50:55Z INFO Starting Controller {"controller": "apolloconfigserver", "controllerGroup": "apollo.adamswanglin.com", "controllerKind": "ApolloConfigServer"}
2025-01-22T10:50:55Z INFO Starting Controller {"controller": "apolloconfig", "controllerGroup": "apollo.adamswanglin.com", "controllerKind": "ApolloConfig"}
2025-01-22T10:50:55Z INFO Starting workers {"controller": "apolloconfigserver", "controllerGroup": "apollo.adamswanglin.com", "controllerKind": "ApolloConfigServer", "worker count": 1}
2025-01-22T10:50:55Z INFO Starting workers {"controller": "apolloconfig", "controllerGroup": "apollo.adamswanglin.com", "controllerKind": "ApolloConfig", "worker count": 1}
本示例使用Apollo官方文档中的演示环境(Demo):
http://81.68.181.139 账号/密码:apollo/admin
- 创建 ApolloConfigServer 资源:
ApolloConfigServer 资源对应 Apollo Config Service 服务实例, 需要配置的是Apollo Config Service 的地址。
apiVersion: apollo.adamswanglin.com/v1
kind: ApolloConfigServer
metadata:
name: demo-server
namespace: default
spec:
configServerURL: http://81.68.181.139:8080
- 创建 ApolloConfig 资源: ApolloConfig对应的是 Apollo的namespace, 简单理解一个配置文件部署一个资源。
apiVersion: apollo.adamswanglin.com/v1
kind: ApolloConfig
metadata:
name: demo-config-1
namespace: default
spec:
apollo:
accessKeySecret: 5e4f59f2035046c2a18e53e31b138f93
appId: "000111"
clusterName: default
namespaceName: application
apolloConfigServer: default/demo-server
configMap: apollo-config
fileName: application1.properties
- 自动生成ConfigMap
kubectl get apolloconfig demo-config-1 -o yaml
ApolloConfig中状态变化
apiVersion: apollo.adamswanglin.com/v1
kind: ApolloConfig
...
status:
lastSynced: "2025-01-23T02:10:49Z"
notificationId: 35175
releaseKey: 20250123101103-0d2f651648d02d85 # apollo release key
syncStatus: Success # 同步状态
updateAt: "2025-01-23T02:10:49Z"
自动生成的ConfigMap
kubectl get cm apollo-config -o yaml
apiVersion: v1
data:
application1.properties: |
aps.redis.auth = false
Test = {\n"key": "value"\n}
1 = false
c = c
kind: ConfigMap
metadata:
creationTimestamp: "2025-01-17T06:44:08Z"
name: apollo-config
namespace: default
ownerReferences:
- apiVersion: apollo.adamswanglin.com/v1
blockOwnerDeletion: true
controller: true
kind: ApolloConfig
name: demo-config-1
uid: 6134b53a-82c0-4c6b-93bf-147ab4b4eca0
resourceVersion: "7393121"
uid: 1f62db9f-d098-4871-8ef1-9664aafb4239
Apollo相关概念
字段路径 | 类型 | 示例值 | 说明 |
---|---|---|---|
spec.apollo | 对象 | - | Apollo 相关概念 |
spec.apollo.accessKeySecret | 字符串 | - | 用于访问 Apollo 的密钥 |
spec.apollo.appId | 字符串 | "000111" | Apollo 中的应用 ID |
spec.apollo.clusterName | 字符串 | default | Apollo 集群名称 |
spec.apollo.namespaceName | 字符串 | application | Apollo 命名空间 properties类型可以不带后缀例如application, json/xml/yaml等类型需要带后缀例如application.json, application.yaml等 |
spec.apolloConfigServer | 字符串 | demo-server | K8S中ApolloConfigServer的NamespacedName 格式{{namespace}}/{{name}} |
spec.configMap | 字符串 | apollo-config | 自动生成的 ConfigMap 名称 |
spec.fileName | 字符串 | application1.properties | 指定ConfigMapData中的文件名,可以为空,为空取apollo.namespaceName |
- 删除 ApolloConfig 资源,会自动删除关联的 ConfigMap 资源。
# 删除ApolloConfig和关联的ConfigMap
kubectl delete apolloconfigs demo-config-1
如果希望保留ConfigMap,仅删除ApolloConfig,请使用--cascade=orphan
# 仅删除ApolloConfig
kubectl delete apolloconfigs demo-config-1 --cascade=orphan
相关grafana dashboard 见 grafana 文件夹
-
kubebuilder自带的 controller-runtime指标
-
自定义指标
# ApolloConfig 数量 Gauge类型
# label: resource_namespace ApolloConfig 所在K8S集群namespace, sync_status 同步状态 包括 Success/Fail/Syncing
apollo_config_count{resource_namespace="default", sync_status="Success"}
# 访问Apollo Config Service的http请求相关Counter和Bucket类型
# label: method HTTP Method, status HTTP Status, url 请求路径(目前有两种)
http_requests_total{method="GET", status="OK", url="configs/{appId}/{clusterName}/{namespaceName}"}
http_request_duration_seconds_count{method="GET", status="OK", url="configs/{appId}/{clusterName}/{namespaceName}"}
http_request_duration_seconds_sum{method="GET", status="OK", url="configs/{appId}/{clusterName}/{namespaceName}"}
http_request_duration_seconds_bucket{method="GET", status="OK", url="configs/{appId}/{clusterName}/{namespaceName}"}
- 本包使用 kubebuilder markers 生成 Kubernetes 配置。运行
make manifests
以在config/crd
和config/rbac
中创建 CRD 和角色。 - 运行
make generate
生成deepcopy.go
。 - 运行
make docker-build
构建镜像。 - 运行
make deploy
部署到本机集群。
本项目基于 Apache-2.0 许可证授权。