Springboot整合Spring Cloud Kubernetes读取ConfigMap支持自动刷新配置的教程
1前言
欢迎访问南瓜慢说www.pkslow.com获取更多精彩文章!
Docker&Kubernetes相关文章:容器技术
之前介绍了SpringCloudConfig的用法,但对于Kubernetes应用,可能会需要读取ConfigMap的配置,我们看看Springboot是如何方便地读取ConfigMap和Secret。
2整合SpringCloudKubenetes
SpringCloudKubernetes提供了SpringCloud应用与Kubernetes服务关联,我们也可以自己写Java程序来获取Kubernetes的特性,但Spring又为我们做了。
2.1项目代码
引入依赖:
org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-kubernetes-config
只需要SpringbootWeb和SpringCloudKubernetesConfig即可,很简单。
Springboot启动类:
@SpringBootApplication publicclassConfigMapMain{ publicstaticvoidmain(String[]args){ SpringApplication.run(ConfigMapMain.class,args); } }
准备一个EndPoint来展示所读到的配置信息:
@RestController publicclassPkslowController{ @Value("${pkslow.age:0}") privateIntegerage; @Value("${pkslow.email:null}") privateStringemail; @Value("${pkslow.webSite:null}") privateStringwebSite; @Value("${pkslow.password:null}") privateStringpassword; @GetMapping("/pkslow") publicMapgetConfig(){ Map map=newHashMap<>(); map.put("age",age.toString()); map.put("email",email); map.put("webSite",webSite); map.put("password",password); returnmap; } }
默认是为空的,password是从Secret读取,其它从ConfigMap读取。
应用的配置文件如下:
server: port:8080 spring: application: name:spring-cloud-kubernetes-configmap cloud: kubernetes: config: name:spring-cloud-kubernetes-configmap
这里的spring.cloud.kubernetes.config.name是重点,后续要通过它来找ConfigMap。
加密密码:
$echo-n"pkslow-pass"|base64 cGtzbG93LXBhc3M=
创建KubernetesSecret:
kind:Secret apiVersion:v1 metadata: name:spring-cloud-kubernetes-secret namespace:default data: pkslow.password:cGtzbG93LXBhc3M= type:Opaque
ConfigMap的内容如下:
kind:ConfigMap apiVersion:v1 metadata: name:spring-cloud-kubernetes-configmap namespace:default labels: app:scdf-server data: application.yaml:|- pkslow: age:19 email:admin@pkslow.com webSite:www.pkslow.com
要注意的是,这里的名字与前面配置的是一致的,都是spring-cloud-kubernetes-configmap。
接着完成Dockerfile和K8s部署文件就可以了。注意要将Secret的值映射到环境变量:
env: -name:PKSLOW_PASSWORD valueFrom: secretKeyRef: name:spring-cloud-kubernetes-secret key:pkslow.password
2.2启动与测试
应用会在启动时就去Kubernetes找相应的ConfigMap和Secret:
. ____ _ ____
/\\/___'_____(_)___ ___\\\\
(()\___|'_|'_||'_\/_`|\\\\
\\/ ___)||_)|||||||(_|| ))))
' |____|.__|_||_|_||_\__,|////
=========|_|==============|___/=/_/_/_/
::SpringBoot:: (v2.2.5.RELEASE)
2020-08-2500:13:17.374 INFO7---[ main]b.c.PropertySourceBootstrapConfiguration:Locatedpropertysource:CompositePropertySource{name='composite-configmap',propertySources=[ConfigMapPropertySource{name='configmap.spring-cloud-kubernetes-configmap.default'}]}
访问spring-cloud-kubernetes-configmap.localhost/pkslow,可以正确读取配置,ConfigMap和Secret的内容都获取到了:
3自动刷新配置
3.1原理介绍与代码变更
我们需要在Web运行过程中修改配置并使配置生效,有多种模式。修改配置文件如下:
server: port:8080 spring: application: name:spring-cloud-kubernetes-configmap cloud: kubernetes: config: name:spring-cloud-kubernetes-configmap namespace:default secrets: name:spring-cloud-kubernetes-secret namespace:default enabled:true reload: enabled:true monitoring-config-maps:true monitoring-secrets:true strategy:restart_context mode:event management: endpoint: restart: enabled:true endpoints: web: exposure: include:restart
(1)spring.cloud.kubernetes.reload.enabled=true需要打开刷新功能;
(2)加载策略strategy:
- refresh:只对特定的配置生效,有注解@ConfigurationProperties或@RefreshScope。
- restart_context:整个SpringContext会优雅重启,里面的所有配置都会重新加载。
需要打开actuatorendpoint,所以要配置management.endpoint。还要增加依赖:
org.springframework.boot spring-boot-actuator org.springframework.boot spring-boot-actuator-autoconfigure
shutdown:重启容器。
(3)模式mode
- 事件Event:会通过k8sAPI监控ConfigMap的变更,读取配置并生效。
- Polling:定期查看是否有变化,有变化则触发,默认为15秒。
3.2测试
我们修改一下ConfigMap的配置,并更新到K8s。
$kubectlapply-fsrc/main/k8s/config.yaml configmap/spring-cloud-kubernetes-configmapconfigured
查看发现age和email都修改了:
我们查看一下Pod的日志如下:
Springboot先是检测到了ConfigMap有了变更,然后触发Context重启。
4总结
SpringCloudKubernetes为我们提供了不少SpringCloud整合Kubernetes的特性,可以引入使用。
到此这篇关于Springboot整合SpringCloudKubernetes读取ConfigMap支持自动刷新配置的文章就介绍到这了,更多相关Springboot整合SpringCloudKubernetes内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。