K8s环境下SCDF应用配置优先级及PCF属性抑制问题咨询
1. 让Config Server配置优先级高于SCDF设置的环境属性
SCDF默认会将部分管理类属性以环境变量的形式注入部署的应用,而Spring Boot中环境变量的优先级高于Config Server拉取的外部配置,导致你的Config Server配置被覆盖。解决思路是阻止SCDF注入这些默认环境变量,或者调整属性传递方式:
清空SCDF默认注入的属性
在Bitnami Helm Chart的values.yaml中,覆盖SCDF的默认应用属性,将不需要的默认值设为空:server: defaultApplicationProperties: management.endpoints.web.exposure.include: "" # 其他你想阻止注入的属性也可以在此清空这样SCDF就不会主动注入这些属性,应用会优先使用Config Server拉取的配置。
调整属性传递优先级
如果需要保留部分SCDF默认属性,但允许Config Server覆盖,可以将SCDF的默认属性从环境变量改为Spring应用属性传递。在SCDF配置中,使用applicationProperties而非environmentProperties传递属性,这类属性的优先级低于Config Server的外部配置,会被后者覆盖。
2. 抑制K8s环境中的PCF专属属性
那些含vcap的属性是SCDF为Cloud Foundry环境预设的,在K8s中完全无用,可通过以下两种方式处理:
覆盖PCF属性为K8s适配值
在values.yaml中直接替换这些PCF相关属性,改用K8s环境可用的标识:server: defaultApplicationProperties: management.metrics.tags.instance.index: "${HOSTNAME##*-}" # 提取StatefulSet Pod的序号 wavefront.application.service: "${spring.cloud.dataflow.stream.app.label:unknown}-${spring.cloud.dataflow.stream.app.type:unknown}-${HOSTNAME##*-}" management.metrics.tags.application.name: "${spring.cloud.dataflow.stream.app.label:unknown}"注:K8s没有原生的实例索引,这里用
HOSTNAME环境变量提取StatefulSet Pod的后缀序号(如my-app-0中的0),如果是Deployment的Pod,可直接用HOSTNAME作为实例标识。禁用SCDF的PCF自动配置
直接让SCDF不加载Cloud Foundry相关的自动配置类,从根源上避免生成PCF属性。在values.yaml中添加启动参数:scdf: extraArgs: - --spring.autoconfigure.exclude=org.springframework.cloud.deployer.spi.cloudfoundry.CloudFoundryDeployerAutoConfiguration
内容的提问来源于stack exchange,提问作者CuriousK

