调用刷新时,从文件系统装载和加载的 K8s ConfigMap 属性不起作用

K8s ConfigMap Properties mounted and loaded from file system does not work when refresh is called

我有一个 Spring 部署到 K8s 的引导应用程序。我正在使用 ConfigMap 实例通过 运行 Spring Cloud Kubernetes 应用程序将我的 application.properties 安装到 Pod 中,并让 Spring Cloud Kubernetes 从文件系统中读取它们

application.properties:

spring.application.name=spring-cloud-k8s-minion
server.port=8080
spring.cloud.kubernetes.config.paths=/etc/app-config/application.properties

management.endpoint.refresh.enabled=true
management.endpoints.web.exposure.include=*

pom.xml:

    <spring-boot.version>2.6.7</spring-boot.version>
    <spring-cloud.version>2021.0.2</spring-cloud.version>
    <spring.cloud.k8s.version>2.1.2</spring.cloud.k8s.version>

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-kubernetes-client</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-kubernetes-client-config</artifactId>
    </dependency>

@Configuration()
@ConfigurationProperties(prefix = "minion")
public class MinionConfig {

    private String type = "generic-minion";

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

我有一个公开配置的休息端点,并且可以在加载时验证属性是否已加载到我的应用程序中。

如果我更新配置:

kubectl edit configmap -n development spring-cloud-k8s-minion -o yaml

exec 进入我的 pod/container 以查看是否重新加载了新配置 我可以看到新值。到目前为止一切顺利。

现在,如果我调用 /actuator/refresh,新值不会加载到我的应用程序中。我在这里缺少什么?

我找到了解决方法。我必须将 spring.cloud.kubernetes.config.paths 移动到 bootstrap.properties

至少对我来说,不清楚放在哪里 spring.cloud.kubernetes.config.paths。如果您检查 docs,您找不到任何关于它位置的信息。

总的来说,我们必须在 bootstrap.propertiesapplication.proeprties 之间猜测!