1、关于kubenetes configMap 介绍

  • configMap是kubernetes提供的基本服务之一,创建一个configmap资源,对应着一份配置文件,可以将该资源通过数据卷的形式映射到Pod上,这样Pod就能用上这个配置文件了。

2、spring-cloud-starter-kubernetes-config

  • spring-cloud-starter-kubernetes-config是spring-cloud-starter-kubernetes框架下的一个库,作用是将kubernetes的configmap与SpringCloud Config结合起来,通过spring-cloud-starter-kubernetes-config,我们的应用就像在通过SpringCloud Config取得配置信息,只不过这里的配置信息来自kubernetes的configmap

3、创建springboot应用

  1. 引入kubenetes-config组件,可以达到实时同步configmap变更的效果

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-kubernetes-config</artifactId>
            <version>1.0.1.RELEASE</version>
        </dependency>
        <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>
    
  2. 编写配置文件
    项目的src\main\resources路径下不要创建application.yml文件,只创建名为bootstrap.yml的文件,内容如下:

    management:
      endpoint:
        restart:
          enabled: true
        health:
          enabled: true
        info:
          enabled: true
    spring:
      application:
        name: springcloudk8sconfigmapdemo
      profiles:
        active: development
      cloud:
        kubernetes:
          reload:
            #自动更新配置的开关设置为打开
            enabled: true
            #更新配置信息的模式是主动拉取
            mode: polling
            #主动拉取的间隔时间是500毫秒
            period: 500
          config:
            sources:
              - name: ${spring.application.name}
                namespace: springcloudk8sconfigmapdemo
    
  • 配置项spring.cloud.kubernetes.reload和spring.cloud.kubernetes.config,前者用于开启自动更新配置,执行更新模式为500毫秒拉取一次,后者指定配置来源于kubernetes的哪个namespace下的哪个configmap;

    1. boostrap.yml 和 application.yml 区别:
      1. bootstrap.yml文件也是Spring Boot的默认配置文件,而且其加载的时间相比于application.yml更早。
      2. application.yml和bootstrap.yml虽然都是Spring Boot的默认配置文件,但是定位却不相同。
      3. bootstrap.yml可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。
      4. application.yml可以用来定义应用级别的参数,如果搭配 spring cloud config 使用,application.yml里面定义的文件可以实现动态替换。
      5. 总结就是:bootstrap.yml文件相当于项目启动时的引导文件,内容相对固定。application.yml文件是微服务的一些常规配置参数,变化比较频繁。
  • 配置类DummyConfig.java,注解ConfigurationProperties的prefix="greeting"表示该类用到的配置项都是名为"greeting"的配置项的子内容 :

    @Configuration
    @ConfigurationProperties(prefix = "greeting")
    public class DummyConfig {
    
        private String message = "This is a dummy message";
    
        public String getMessage() {
            return this.message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    }
    
  • 启动类Springcloudk8sconfigmapdemoApplication.java,简单起见,将用于验证配置项是否生效的web接口也写在了这里面,即hello方法 ,这个方法是应用的关键,方法内会返回配置文件的值,我们的应用能否成功取得k8s的configmap的配置文件,通过此方法的返回值就能验证了,还要增加path为/health的方法,因为在k8s部署时健康探针和就绪探针会调用此接口,如果没有响应pod就无法正常使用:

    @SpringBootApplication
    @RestController
    @EnableConfigurationProperties(DummyConfig.class)
    public class Springcloudk8sconfigmapdemoApplication {
    
        @Autowired
        private DummyConfig dummyConfig;
    
        @GetMapping("/health")
        public String health() {
            return "success";
        }
    
        @GetMapping("/hello")
        public String hello() {
            return dummyConfig.getMessage()
                    + " ["
                    + new SimpleDateFormat().format(new Date())
                    + "]";
        }
    
    
        public static void main(String[] args) {
            SpringApplication.run(Springcloudk8sconfigmapdemoApplication.class, args);
        }
    
    }
    
    

以上就是实战工程的所有代码了,仅仅只是引入了少量jar依赖,以及在启动配置文件中指定了configmap的信息和同步模式,即完成了获取配置文件的所有操作,至于代码中用到配置文件的地方,和使用SpringCloud Config并无差别。

4、在k8s中创建ConfigMap

  • 在kubernetes环境新建名为springcloudk8sconfigmapdemo.yml的文件,内容如下:

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: springcloudk8sconfigmapdemo
    data:
      application.yml: |-
        greeting:
          message: Say Hello to the World
        farewell:
          message: Say Goodbye
        ---
        spring:
          profiles: development
        greeting:
          message: Say Hello to the Developers
        farewell:
          message: Say Goodbye to the Developers
        ---
        spring:
          profiles: production
        greeting:
          message: Say Hello to the Ops
    
  • 在springcloudk8sconfigmapdemo.yml文件所在目录执行以下命令:

    kubectl apply -f springcloudk8sconfigmapdemo.yml
    
  • 部署后验证:

  1. 查询 pod名称

     kubectl -n spring-cloud-k8s-demo get pods
    
  2. 进入容器

    kubectl -n spring-cloud-k8s-demo exec -it spring-cloud-k8s-discovery-demo-deployment-8499cbdfc-ddsvs -c spring-cloud-k8s-discovery-demo -- sh
    
  3. 在容器内调用接口

    # curl http://localhost:8089/health
    /app # curl http://localhost:8089/health
    success
    
    # curl http://localhost:8089/hello
    /app # curl http://localhost:8089/hello
    Say Hello to the Developers [5/10/22 6:17 PM]
    
  4. 验证configMap优先级

    1. 在resources下创建 application-development.yml文件内容如下:

      greeting:
        message: application-developers
      farewell:
        message: Say Goodbye to the Developers
      
    2. bootstrap.yml 指定 development

        profiles:
          active: development
      
    3. 查看k8s configMap

      root@localhost:~/data/spring-cloud-k8s-feign-demo$ kubectl  -n spring-cloud-k8s-demo describe configmap  spring-cloud-k8s-configmap
      Name:         spring-cloud-k8s-configmap-demo
      Namespace:    spring-cloud-k8s-demo
      Labels:       <none>
      Annotations:  <none>
      
      Data
      ====
      application.yml:
      ----
      greeting:
        message: success!!!!
      farewell:
        message: Say Goodbye
      ---
      spring:
        profiles: development
      greeting:
        message: Say Hello to the Developers
      farewell:
        message: Say Goodbye to the Developers
      ---
      spring:
        profiles: production
      greeting:
        message: Say Hello to the Ops
      
      BinaryData
      ====
      
      Events:  <none>
      
      root@localhost:~/data/spring-cloud-k8s-feign-demo$
      
    4. 部署项目成功后进入容器验证:

      /app # curl http://localhost:8081/hello
      Say Hello to the Developers [5/11/22 7:33 PM]/app #
      

以上k8s集成configMap结束~

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐