spring-boot - Spring Cloud Kubernetes 不重新加载秘密更改
问题描述
我正在探索 Spring Cloud Kubernetes 的功能,方法是使用它的特性来动态重新加载秘密。但是,我仍然没有得到这个工作。
我有一个简单的 Spring Boot 应用程序,它只打印出安装在 pod 中的秘密内容。这是bootstrap.properties中的配置
spring.cloud.kubernetes.reload.enabled=true
spring.cloud.kubernetes.reload.monitoring-secrets=true
spring.cloud.kubernetes.secrets.enabled=true
spring.cloud.kubernetes.secrets.paths=/etc/secret-volume
management.endpoint.info.enabled=true
management.endpoint.health.enabled=true
management.endpoint.restart.enabled=true
在application.properties中,我定义了获取密钥值的属性:
mysecret.password=${MY-PWD}
在 Spring Boot 应用程序中,我定义了一个将存储秘密值的 bean:
@Configuration
@ConfigurationProperties(prefix = "mysecret")
public class MySecret {
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
当我在 minikube 上运行应用程序时,我在日志中看到 Spring 检测到声明的机密并激活配置文件:
16:54:30.887 [main] INFO oscbcPropertySourceBootstrapConfiguration - 定位属性源:[BootstrapPropertySource@1132379993 {name='bootstrapProperties-my-pwd', properties={MY-PWD=qwerty}}] 16:54:30.899 [main] INFO ccrReloadSecretsApplication - 以下配置文件处于活动状态:kubernetes
过了一会儿,我得到下面的日志,上面写着它被添加了一个对秘密的观察者:
16:54:35.460 [OkHttp https://10.96.0.1/...] 调试 ifkcdiWatchConnectionManager - WebSocket 成功打开 16:54:35.460 [main] INFO osckcrEventBasedConfigurationChangeDetector - 添加了新的 Kubernetes 手表:secrets-watch 16:54:35.460 [ main] INFO osckcrEventBasedConfigurationChangeDetector - 已激活 Kubernetes 基于事件的配置更改检测器
然后,当我更改密码时,我得到这条线说不会触发重新加载:
11:20:15.963 [OkHttp https://10.96.0.1/...] WARN osckcrEventBasedConfigurationChangeDetector - 当前的 Confimap PropertySource 数量与从 Kubernetes 加载的不匹配 - 不会发生重新加载
关于这个主题的文档非常稀缺。我这里有什么遗漏的配置吗?
链接到 Spring Boot 应用程序:https ://github.com/Azlop/spring-cloud-kubernetes-reload-secrets
解决方案
我知道这是一个没有答案的老问题。我遇到了同样的问题,经过一番研究后解决了。在这里,我分享我对这个问题的经验,如果它可以帮助将来的人。
Spring Cloud Kubernetes 已将外部配置映射存储为 CompositePropertySource 或 BootstrapPropertySource 中的多个 ConfigMapPropertySource 实例。当应用程序管理 configmap 已更改时,它会从 CompositePropertySource 获取 ConfigMapPropertySource 实例,并将 ConfigMapPropertySource 实例的长度与传入实例进行比较。如果长度不同,应用程序会返回错误消息:“当前的 Confimap PropertySource 数量与从 Kubernetes 加载的不匹配 - 不会重新加载”。
但是这里有一个潜在的问题:其他函数,在我的例子中是一个加密器,可能会改变 CompositePropertySource 的类型。后来,应用程序无法获取 ConfigMapPropertySource 实例,并且必须比较失败。
所以我的解决方案是创建一个自定义的 EventBasedConfigurationChangeDetector ,它已经改变了比较的逻辑。原始版本是:
private void onEvent(ConfigMap configMap) {
boolean changed = changed(locateMapPropertySources(this.configMapPropertySourceLocator, this.environment), findPropertySources(ConfigMapPropertySource.class));
if (changed) {
XXXX
}
}
您应该重写 findPropertySources 函数以适应您的情况。在我的实例中,我解开加密的 PropertySource 以获取原始 ConfigMapPropertySource 实例。
最后,注入您自定义的 EventBasedConfigurationChangeDetector 来替换原版的将解决该问题。
推荐阅读
- c# - Cefsharp - 键盘在重新聚焦之前无法工作
- java - 大型 json 文件上的 Talend Java 堆空间
- terraform - 如何将多个 aws 提供程序传递给一个模块?
- javascript - 如何在Javascript / React中拆分数组中列表项中的文本?
- python - 使用 scrapy 从表中抓取数据
- javascript - setTimeout 在它调用的同一个函数中?
- java - 如何从具有最大日期时间对象的列表中获取对象
- python - 在应用程序初始化期间将对象分配给应用程序
- pivot - 透视和连接 Power Query
- javascript - 猫鼬异步承诺似乎不起作用