Spring Cloud Kubernetes 的服务发现和配置在本地为什么什么都读不到?ConfigMap 要不要写 import?ConfigMap 改了之后多久生效?为什么开了 reload 还是不刷新?这篇在本机 kind 集群里用真实的 Deployment、Service 和 ConfigMap 逐项验证。
应用跑在集群外面(宿主机),只有 kubeconfig:getServices() = [],getInstances("web") = [],配置:greeting=local-greeting,local.only=yes,shared.key=null;app.msg:@RefreshScope=local-msg,普通单例=local-msg,@ConfigurationProperties=local-msg
加上 spring.main.cloud-platform=kubernetes(强制当作跑在 Kubernetes 上):
DiscoveryClient.getServices() = [web]
getInstances("web") = [10.244.0.10:80|metadata键=[app, k8s_namespace, kubectl.kubernetes.io/last-applied-configuration, port.<unset>, type],k8s_namespace=x133,type=ClusterIP, 10.244.0.6:80|metadata键=[app, k8s_namespace, kubectl.kubernetes.io/last-applied-configuration, port.<unset>, type],k8s_namespace=x133,type=ClusterIP]
kubectl 看到的 Service web 的 Endpoints = 10.244.0.10 10.244.0.6需要识别为 Kubernetes 平台;实例来自 Endpoints,metadata 带 Service 的标签与注解。
扩到 3 个副本:1.0 秒后 getInstances 返回 3 个 缩到 1 个副本:0.2 秒后 getInstances 返回 1 个
1 秒内可见。
ConfigMap orders(application.properties: greeting=k8s-greeting、shared.key=from-cm、app.msg=k8s-v1):configmap/orders unchanged 没有写 spring.config.import:启动成功,greeting=local-greeting,local.only=yes,shared.key=null;app.msg:@RefreshScope=local-msg,普通单例=local-msg,@ConfigurationProperties=local-msg spring.config.import=optional:kubernetes::greeting=k8s-greeting,local.only=yes,shared.key=from-cm;app.msg:@RefreshScope=k8s-v1,普通单例=k8s-v1,@ConfigurationProperties=k8s-v1
要写 spring.config.import=kubernetes:;不写则被悄悄忽略。
默认(没开 reload),改成 k8s-v2 后等 10 秒:greeting=k8s-greeting,local.only=yes,shared.key=from-cm;app.msg:@RefreshScope=k8s-v1,普通单例=k8s-v1,@ConfigurationProperties=k8s-v1 开启 reload.enabled=true,没有 actuator 依赖:改成 k8s-v3 之后 20 秒内没有看到变化:greeting=k8s-greeting,local.only=yes,shared.key=from-cm;app.msg:@RefreshScope=k8s-v1,普通单例=k8s-v1,@ConfigurationProperties=k8s-v1 开启 reload.enabled=true,加上 spring-boot-starter-actuator:改成 k8s-v3 之后 0.2 秒看到变化:greeting=k8s-greeting,local.only=yes,shared.key=from-cm;app.msg:@RefreshScope=k8s-v3,普通单例=k8s-v1,@ConfigurationProperties=k8s-v3
reload.enabled=true 加 actuator 依赖,约 0.2 秒生效。