聊聊springcloud如何与k8s configMap整合实现配置动态刷新

news2024/11/24 15:59:59

前言

配置中心在微服务的服务治理场景基本上是属于标配,常见可以用来做配置中心有nacos、apollo、zookeeper、springcloud config、consul、etcd、redis、disconf、dimond、xxl-conf等。这些组件的特点都是需要安装,如果大家的部署环境中有用到k8s,且不需要用到太多配置中心的特殊功能,比如灰度发布、权限管理、发布审核、操作审计啥的,仅仅只是用来统一配置,以及实现配置的热更新,那今天讲主角configMap会是一个挺不错的选择

configMap简介

ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时,Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。

具体详细介绍可以查看官网

https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap/

configMap如何实现热更新

注: 假设大家对configMap已经有一定了解,如果对configMap,可以去了解一下,再来看本文

1、k8s configmap在哪些场景会自动实现热更新

a、 以挂载Volume 方式使用的 ConfigMap 数据会自动更新。更新时间大约10s左右

2、k8s configmap在哪些场景不会自动实现热更新

a、 以环境变量(ENV)方式使用的 ConfigMap ,Kubernetes不会做自动热更新:

b、 如果使用ConfigMap的subPath挂载为Container的Volume,Kubernetes不会做自动热更新

3、热更新验证示例

https://jimmysong.io/kubernetes-handbook/concepts/configmap-hot-update.html

上面讲的是configmap自带的热更新,算是一个小科普,跟本文的主线关系不大,接下来上主菜

springcloud如何与configmap整合实现动态刷新

注: 本示例springcloud版本为Hoxton.SR3

示例前置准备

1、示例configMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: lybgeek-properties
  namespace: lybgeek
data:
  lybgeek.properties: |
    test = k8s-config-666

2、准备示例需要的controller

    @RestController
    @RequestMapping("config")
    @RefreshScope
    class ConfigTestController{

        @Value("${test:local}")
        private String test;

        @GetMapping("test")
        public String test(){
            return test;
        }
    }

正文

1、在项目中pom中引入相关GAV

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

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-actuator</artifactId>
</dependency>

2、在项目中src/main/resource创建bootstrap.yml或者application.yml文件,填入如下内容

spring:
  cloud:
    kubernetes:
      config:
        name: ${LYBGEEK_CONFIG_MAP:lybgeek-properties}
        namespace: ${LYBGEEK_CONFIG_MAP_NAMESPACE:nisbos}
      reload:
        # 打开刷新功能
        enabled: ${LYBGEEK_CONFIG_MAP_RELOAD_ENABLED:true}
        # 监控configMap变化
        monitoring-config-maps: ${LYBGEEK_CONFIG_MONITOR:true}
        # 监控secrets变化
        monitoring-secrets: ${LYBGEEK_SECRETS_MONITOR:true}
        # 加载策略,有三种,
        # refresh:只重新加载用@ConfigurationProperties或@RefreshScope注释的配置bean。此重新加载级别利用了Spring Cloud Context的刷新功能。
        # restart_context:整个Spring ApplicationContext被优雅地重新启动。使用新配置重新创建bean。为了使重启上下文功能正常工作,您必须启用并公开restart端点
        # shutdown:关闭Spring ApplicationContext以激活容器的重新启动。使用此级别时,请确保所有非守护进程线程的生命周期都绑定到ApplicationContext,并且已配置复制控制器或副本集以重新启动pod。
        strategy: ${LYBGEEK_CONFIG_RELOAD_STRATEGY:restart_context}
        # 模式:event(默认):通过使用Kubernetes API(web套接字)来监视configMap或secrets中的更改。任何事件都会对配置进行重新检查,如果发生更改,还会重新加载。需要服务帐户上的视图角色才能侦听配置映射更改。secrets需要更高级别的角色(如编辑)(默认情况下,不监控secrets)。
       # 轮询:定期根据configMap和secrets重新创建配置,以查看其是否已更改。您可以使用spring.cloud.kubernetes.reload.period属性配置轮询周期,默认为15秒。它需要与受监控的属性源具有相同的角色。这意味着,例如,对文件装载的秘密源使用轮询不需要特定的权限。
        mode: ${LYBGEEK_CONFIG_RELOAD_MODE:polling}
        # 调成500毫秒
        period: ${LYBGEEK_CONFIG_POLLING:500}



management:
  endpoint:
    restart:
      enabled: true
  endpoints:
    web:
      exposure:
        include: restart

核心配置属性介绍

a、spring.cloud.kubernetes.config.name configMap名字,默认是spring.application.name
b、spring.cloud.kubernetes.config.namespace k8s命名空间
c、spring.cloud.kubernetes.reload.enabled=true 开启加载
d、spring.cloud.kubernetes.reload.strategy 加载支持的策略

  • refresh:只重新加载用@ConfigurationProperties或@RefreshScope注释的配置bean。此重新加载级别利用了Spring
    Cloud Context的刷新功能。
  • restart_context:整个Spring ApplicationContext被优雅地重新启动。使用新配置重新创建bean。为了使重启上下文功能正常工作,您必须启用并公开restart端点
  • shutdown:关闭Spring ApplicationContext以激活容器的重新启动。使用此级别时,请确保所有非守护进程线程的生命周期都绑定到ApplicationContext,并且已配置复制控制器或副本集以重新启动pod。

e、spring.cloud.kubernetes.reload.mode 加载支持的模式

  • event(默认):通过使用Kubernetes
    API(web套接字)来监视configMap或secrets中的更改。任何事件都会对配置进行重新检查,如果发生更改,还会重新加载。需要服务帐户上的视图角色才能侦听配置映射更改。secrets需要更高级别的角色(如编辑)(默认情况下,不监控secrets)。
  • 轮询:定期根据configMap和secrets重新创建配置,以查看其是否已更改。您可以使用spring.cloud.kubernetes.reload.period属性配置轮询周期,默认为15秒。它需要与受监控的属性源具有相同的角色。这意味着,例如,对文件装载的秘密源使用轮询不需要特定的权限。

3、测试

先浏览器访问我们准备好的controller


将configmap的内容改为

apiVersion: v1
kind: ConfigMap
metadata:
  name: lybgeek-properties
  namespace: lybgeek
data:
  lybgeek.properties: |
    test = k8s-config-999

我们观察下业务打印出来的日志


出现restarted,然后我们再访问我们controller

原先的k8s-config-666已经改成k8s-config-999,说明配置热更新生效

在实验的过程中可能会出现

User “system:serviceaccount:lybgeek:default” cannot get resource “configmaps” in API group “” in the namespace “lybgeek”.

那是因为system:serviceaccount:lybgeek:default没有拉取configMap的权限,因此我们将相应的权限给补上即可。

a、 创建ClusterRole

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  namespace: lybgeek
  name: configmap-test
rules:
- apiGroups:
  - ""
  resources:
  - configmaps
  verbs:
  - get

b、 system:serviceaccount:lybgeek:default与创建好的ClusterRole(configmap-test)绑定

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata
  name: configmap-test-clusterrolebinding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: configmap-test
subjects:
- kind: ServiceAccount
  name: default
  namespace: lybgeek

总结

本文介绍springcloud如何与k8s configMap整合实现配置动态刷新,其实是借助spring-cloud-kubernetes的能力,详细介绍可以查看官网
https://docs.spring.io/spring-cloud-kubernetes/docs/current/reference/html/#propertysource-reload
官网也有提供了示例
https://github.com/spring-cloud/spring-cloud-kubernetes/tree/main/spring-cloud-kubernetes-examples/kubernetes-reload-example

在官网有一个警告

就是该功能在2020.0版本之后,该功能已经被弃用了,改为使用Spring Cloud Kubernates Configuration Watcher。如果大家项目的k8s版本是 >= 1.9,使用Reloader来做配置热更新也是一个不错选择,对这个组件感兴趣的朋友可以查看官网
https://github.com/stakater/Reloader

有网友也提供configMap热更新的其他方案,详情可以查看如下链接
https://cctoctofx.netlify.app/post/cloud-computing/k8s-config-update/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/846653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创意项目管理软件推荐:满足客户需求的完美解决方案

发现功能强大的工作管理软件&#xff0c;让创意大放异彩。将您团队的愿景变成引人注目的项目。 一、交付总是令人印象深刻的工作 Zoho Projects的创意项目管理软件可帮助您和您的团队在一个地方监督多个项目。使用我们的内置管理工具和模板&#xff0c;花更少的时间在管理上&a…

Verilator仿真环境搭建

Verilator简介与使用_Hwang_shuo的博客-CSDN博客 Verilator是一种开源的Verilog/SystemVerilog仿真器&#xff0c;可用于编译代码以及代码在线检查&#xff0c;Verilator能够读取Verilog或者SystemVerilog文件&#xff0c;并进行lint checks(基于lint工具的语法检测)&#xff…

第六章:Linux基础IO

系列文章目录 文章目录 系列文章目录前言打开文件预备知识回顾C文件IO操作C语言I/O库函数fopen/fcloseperrorfwrite/freadfgets/fputsprintf/fprintf/sprintf/snprintfstdin/stdout/stderr 标志位系统调用IO接口open/closeumaskwrite/read lseek库函数IO操作与系统调用IO操作比…

ubuntu 20.0.4 搭建nvidia 显卡环境

一、安装docker 1、安装dokcer sudo apt install docker.io2、docker 添加到用户组 创建docker用户组 sudo groupadd docker添加当前用户加入docker用户组 sudo usermod -aG docker ${USER}重启docker服务 sudo systemctl restart docker切换或者退出当前账户再从新登入 …

【单片机】51单片机,晨启科技,板子引脚对应关系

一般引脚: sbit beepP2^4; //将单片机的P2.4端口定义为beep.本口用于屏蔽上电后蜂鸣器响 sbit ledP1^0; //将单片机的P1.0端口定义为led&#xff0c;用于点亮LED-D1 sbit DIG1P0^0; //数码管位选1 sbit DIG2P0^1; //数码管位选2P10xFF;//初始化P1引脚全部置高&a…

【计算机网络】第四章 IPv4

文章目录 4.3 IPv44.3.1 IPv4 地址概述4.3.2 分类编址的 IPv4 地址 4.3 IPv4 IPv4是互联网协议第四版&#xff08;Internet Protocol version 4&#xff09;的简称。它是现今互联网最常用的网络层协议&#xff0c;为互联网上的设备提供了唯一的逻辑地址&#xff0c;用于在网络…

【电机绘图】:插补算法(一)—直线插补—逐点比较法

今日介绍学习一种使用电机作画、绘图、加工零件时需要使用的算法 &#xff1a; 插补算法 本文提供直线插补的概念基础&#xff0c;基本思路分析&#xff0c;C语言实现等&#xff0c;代码会直接贴出&#xff01; 插补算法是指在数值计算或数据处理中&#xff0c;根据已有的数据…

Windows环境利用QT+CMake编译mingw版本的opencv

Opencv官网没有提供mingw版本的opencv库&#xff0c;所以需要自己编译&#xff0c;下面是编译过程&#xff0c;32位64位方法类似。 可以直接下载编译好的mingw版本opencv4.4&#xff1a; 使用CMAKE3.22QT5.13编译后的opencv4.4&#xff08;32位的&#xff09;资源-CSDN文库 …

【win10专业版远程控制】 自带远程桌面公司内网电脑

使用win10专业版自带远程桌面公司内网电脑 文章目录 使用win10专业版自带远程桌面公司内网电脑 在现代社会中&#xff0c;各类电子硬件已经遍布我们身边&#xff0c;除了应用在个人娱乐场景的消费类电子产品外&#xff0c;各项工作也离不开电脑的帮助&#xff0c;特别是涉及到数…

Nginx环境搭建、docker安装

1.Nginx安装 1&#xff09;首先创建Nginx的目录并进入 [rootlucky ~]# mkdir /soft && mkdir /soft/nginx/ [rootlucky ~]# cd /soft/nginx/ [rootlucky nginx]# 2&#xff09;下载Nginx的安装包&#xff0c;可以通过FTP工具上传离线环境包&#xff0c;也可通过wget命…

数据标注对新零售的意义及人工智能在新零售领域的应用?

数据标签对于新零售至关重要&#xff0c;因为它构成了训练和部署人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;模型的基础。在新零售的背景下&#xff0c;数据标签涉及对数据进行分类、标记或注释以使其能够被机器理解的过程。然后&#xff0c;这些…

手把手写深度学习(20):搭建LLM大语言模型的敏感词过滤系统

前言:随着Llama 2、通义千问7B等越来越多的大语言模型开源,开发者们可以基于这些开源的模型搭建自己的对话系统、Agent等。但是因为我们的国情,需要开发者对这些模型进行一些特殊的“安全性”考虑,保证与用户的交互不会出现“有害信息”。这篇博客手把手教大家搭建一个大语…

效率利器之事件委托

前言 公司产品部推出了一款新产品&#xff0c;经理指派小A负责推广工作。小A通过多方打听了解到推广流程&#xff0c;需要使用公司证件在几个平台注册账号&#xff0c;并经过多轮审批。小A经历了一番操作后感到身心俱疲&#xff0c;最终成功将产品发布到公众平台上。 与此同时…

GB:重测序+转录2023经典文章,一篇就够

在三代测序崛起的现在&#xff0c;HiFi Reads以其超长读长&#xff0c;高准确率及灵敏度、GC偏向性小、无PCR偏向性等特色优势在动植物基因组、微生态领域等研究中正崭露头角&#xff0c;成为组学研究技术的新热门。高品质的HiFi Reads成为攻克动植物基因组组装难点的有力助推&…

SNAP插件sen2Three去云操作

1.先把这篇文章看了 2.去官网下载Sen2Three 3.这时候可以大概看看Sen2Three的官方文档&#xff0c;我们知道了需要用anaconda2环境 4.我是已经安装有anaconda3,所以需要两个并存&#xff0c;此时可以参考这篇文章 5.这是ananconda2的链接&#xff0c;直接下载安装即可&#xff…

南卡签约游泳冠军傅园慧,创造防水运动耳机的新天花板!

近日&#xff0c;国内骨传导运动耳机龙头品牌NANK南卡&#xff0c;正式官宣知名游泳冠军傅园慧出任品牌形象大使。在此之外&#xff0c;南卡品牌方还特邀了同样作为游泳冠军的孙杨&#xff0c;以及知名演员张新成、流行歌手段奥娟等多位明星来体验旗下的运动耳机&#xff0c;皆…

Python中搭建IP代理池的妙招

在Python的爬虫世界里&#xff0c;你是否也想搭建一个功能强大的IP代理池&#xff0c;让你的爬虫无忧无虑地畅游各大网站&#xff1f;今天&#xff0c;我就来教你使用Scrapy框架搭建IP代理池&#xff0c;让你的爬虫更加智能、高效&#xff01;跟着我一步一步来&#xff0c;轻松…

天津最新python培训班就业形势 python能就业吗?

小编认为Python是一门非常适合学习的编程语言&#xff0c;无论性别如何。它易于学习、功能强大&#xff0c;并且在各个领域都有广泛的应用&#xff0c;因此&#xff0c;性别不应该成为学习Python的障碍&#xff0c;那么学习Python是否就能找到满意的工作呢&#xff1f; 这是一…

PyTorch深度学习实战(10)——过拟合及其解决方法

PyTorch深度学习实战&#xff08;10&#xff09;——过拟合及其解决方法 0. 前言1. 过拟合基本概念2. 添加 Dropout 解决过拟合3. 使用正则化解决过拟合3.1 L1 正则化3.2 L2 正则化 4. 学习率衰减小结系列链接 0. 前言 过拟合 (Overfitting) 是指在机器学习中&#xff0c;模型…

问题解决方案

前端开发 1、npm安装的时候老是卡住 reify:rxjs: timing reifyNode:node_modules/vue/cli/node_modules 查看当前使用的那个镜像 nrm lsnpm ---------- https://registry.npmjs.org/yarn --------- https://registry.yarnpkg.com/cnpm --------- https://r.cnpmjs.org/taobao …