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 [主要] 信息 o.s.c.b.c.属性源引导配置 - 定位属性 来源: [BootstrapPropertySource@1132379993 {name='bootstrapProperties-my-pwd', properties={MY-PWD=qwerty}}] 16:54:30.899 [主要] 信息 c.c.r.重新加载秘密应用程序 - The 以下配置文件处于活动状态:Kubernetes

过了一会儿,我得到以下日志,说它添加了对机密的监视程序:

16:54:35.460 [OkHttp https://10.96.0.1/...]调试 i.f.k.c.d.i.WatchConnectionManager - WebSocket 已成功打开 16:54:35.460 [主要] 信息 o.s.c.k.c.r.EventBasedConfigurationChangeDetector - 新增 Kubernetes watch: secrets-watch 16:54:35.460 [main] INFO o.s.c.k.c.r.EventBasedConfigurationChangeDetector - Kubernetes 已激活基于事件的配置更改检测器

然后,当我更改机密时,我得到以下行,说不会触发重新加载:

11:

20:15.963 [OkHttp https://10.96.0.1/...]警告 o.s.c.k.c.r.EventBasedConfigurationChangeDetector - 当前数字 的 Confimap 属性源与从 Kubernetes - 不会发生重新加载

关于此主题的文档非常稀缺。 我这里缺少任何配置吗?

链接到 Spring 引导应用程序:https://github.com/Azlop/spring-cloud-kubernetes-reload-secrets

我知道这是一个没有答案的老问题。我遇到了同样的问题,经过一些研究后解决了它。在这里,我分享我在这个问题上的经验,如果它可以帮助将来的某人。

Spring Cloud Kubernetes 已将外部配置映射存储为多个 ConfigMapPropertySource 实例,位于 CompositePropertySource 或 BootstrapPropertySource 中。当应用程序微型器更改了配置映射时,它会从 CompositePropertySource 中获取 ConfigMapPropertySource 实例,并将 ConfigMapPropertySource 实例的长度与传入的实例进行比较。如果长度不同,应用程序将返回一条错误消息:"Confimap PropertySources 的当前数量与从 Kubernetes 加载的数量不匹配 - 不会发生重新加载"。

但这里有一个潜在的问题:其他函数,在我的例子中它是一个加密器,可能会改变复合属性源的类型。稍后,应用程序无法获取 ConfigMapPropertySource 实例,并且必须失败。

所以我的解决方案是创建一个定制的基于事件的配置更改检测器,它已经改变了比较的逻辑。原始版本是:

private void onEvent(ConfigMap configMap) {
boolean changed = changed(locateMapPropertySources(this.configMapPropertySourceLocator, this.environment), findPropertySources(ConfigMapPropertySource.class));
if (changed) {
XXXX
}
}

您应该重写 findPropertySources 函数以适应您的位置。在我的实例中,我解开加密的 PropertySource 以获取原始 ConfigMapPropertySource 实例。

最后,注入自定义的EventBasedConfigurationChangeDetector来替换原版将解决此问题。

相关内容

  • 没有找到相关文章

最新更新