• Springboot整合Spring Cloud Kubernetes读取ConfigMap,支持自动刷新配置


    1 前言

    欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章!

    Docker & Kubernetes相关文章:容器技术

    之前介绍了Spring Cloud Config的用法,但对于Kubernetes应用,可能会需要读取ConfigMap的配置,我们看看Springboot是如何方便地读取ConfigMapSecret

    2 整合Spring Cloud Kubenetes

    Spring Cloud Kubernetes提供了Spring Cloud应用与Kubernetes服务关联,我们也可以自己写Java程序来获取Kubernetes的特性,但Spring又为我们做了。

    2.1 项目代码

    引入依赖:

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

    只需要Springboot WebSpring Cloud Kubernetes Config即可,很简单。

    Springboot启动类:

    @SpringBootApplication
    public class ConfigMapMain {
        public static void main(String[] args) {
            SpringApplication.run(ConfigMapMain.class, args);
        }
    }
    

    准备一个EndPoint来展示所读到的配置信息:

    @RestController
    public class PkslowController {
        @Value("${pkslow.age:0}")
        private Integer age;
    
        @Value("${pkslow.email:null}")
        private String email;
    
        @Value("${pkslow.webSite:null}")
        private String webSite;
    
        @Value("${pkslow.password:null}")
        private String password;
    
        @GetMapping("/pkslow")
        public Map<String, String> getConfig() {
            Map<String, String> map = new HashMap<>();
            map.put("age", age.toString());
            map.put("email", email);
            map.put("webSite", webSite);
            map.put("password", password);
            return map;
        }
    }
    

    默认是为空的,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=
    

    创建Kubernetes Secret

    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

    接着完成DockerfileK8s部署文件就可以了。注意要将Secret的值映射到环境变量:

    env:
    	- name: PKSLOW_PASSWORD
    		valueFrom:
    			secretKeyRef:
    				name: spring-cloud-kubernetes-secret
    				key: pkslow.password
    

    2.2 启动与测试

    应用会在启动时就去Kubernetes找相应的ConfigMapSecret

      .   ____          _            __ _ _
     /\ / ___'_ __ _ _(_)_ __  __ _    
    ( ( )\___ | '_ | '_| | '_ / _` |    
     \/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v2.2.5.RELEASE)
    
    2020-08-25 00:13:17.374  INFO 7 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='composite-configmap', propertySources=[ConfigMapPropertySource {name='configmap.spring-cloud-kubernetes-configmap.default'}]}
    2020-08-25 00:13:17.376  INFO 7 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='composite-secrets', propertySources=[]}
    

    访问spring-cloud-kubernetes-configmap.localhost/pkslow,可以正确读取配置,ConfigMapSecret的内容都获取到了:

    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:整个Spring Context会优雅重启,里面的所有配置都会重新加载。

    需要打开actuator endpoint,所以要配置management.endpoint。还要增加依赖:

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-actuator</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-actuator-autoconfigure</artifactId>
    </dependency>
    
    • shutdown:重启容器。

    (3)模式mode

    • 事件Event:会通过k8s API监控ConfigMap的变更,读取配置并生效。
    • Polling:定期查看是否有变化,有变化则触发,默认为15秒。

    3.2 测试

    我们修改一下ConfigMap的配置,并更新到K8s

    $ kubectl apply -f src/main/k8s/config.yaml 
    configmap/spring-cloud-kubernetes-configmap configured
    

    查看发现ageemail都修改了:

    我们查看一下Pod的日志如下:

    Springboot先是检测到了ConfigMap有了变更,然后触发Context重启。

    4 总结

    Spring Cloud Kubernetes为我们提供了不少Spring Cloud整合Kubernetes的特性,可以引入使用。


    配置相关文章:
    Springboot整合Spring Cloud Kubernetes读取ConfigMap,支持自动刷新配置

    Spring Cloud Config在Spring Cloud Task中的应用,比Web应用更简单

    Spring Cloud Config整合Spring Cloud Kubernetes,在k8s上管理配置

    使用Spring Cloud Config统一管理配置,别再到处放配置文件了

    Java怎么从这四个位置读取配置文件Properties(普通文件系统-classpath-jar-URL)

    注解@ConfigurationProperties让配置整齐而简单

    只想用一篇文章记录@Value的使用,不想再找其它了

    Springboot整合Jasypt,让配置信息安全最优雅方便的方式


    欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

    多读书,多分享;多写作,多整理。

  • 相关阅读:
    【Android】11.2 通过重写对应的方法保存和恢复实例的状态
    【Android】11.1 Activity的生命周期和管理
    【Android】11.0 第11章 活动和片段--本章示例主界面
    【Android】10.5 滚动视图(RecyclerView)
    【Android】10.4 卡片视图
    【Android】10.3 网格视图(GridView)
    【Android】10.2 使用Android Support Library增强组件功能
    【Android】10.1 扩展组件库和其他视图--本章示例主界面
    【Android】9.3 自定义列表视图的外观
    【Android】9.2 内置行视图的分类和呈现效果
  • 原文地址:https://www.cnblogs.com/larrydpk/p/13611431.html
Copyright © 2020-2023  润新知