K8S-ConfigMap 作为配置中心集成方案
作用是将kubernetes的configmap与SpringCloud Config结合起来。实时监控 ConfigMap、Secret 配置变化从而更新服务配置。定时轮询加载 ConfigMap、Secret 配置从而更新服务配置。这将创建一个具有 get、list 和 create 权限的角色,用于操作 Pods 和configmap资源。
使用 k8s 的 configmap 作为配置中心的背景
在去掉 nacos 作为服务发现和配置中心后,本身 k8s 具备服务发现的能力,所以如何使用 k8s 作为配置中心成为首要任务,以下是使用 configmap 作为配置中心的理由:
1.集中管理配置
ConfigMap 允许将应用程序的配置信息集中存储在 Kubernetes 集群中。这样,我们可以将所有的配置文件统一管理,而不需要在每个应用程序实例中维护独立的配置文件。
2.动态更新配置
使用 ConfigMap,可以在不重启应用程序的情况下更新配置。当修改 ConfigMap 中的配置数据时,Kubernetes 会自动将更新的配置信息传递给应用程序,从而实现动态更新配置的能力。
3.与环境解耦
通过将配置信息存储在 ConfigMap 中,可以将应用程序与特定环境的配置解耦。这意味着可以在不同的环境(如开发、测试、生产)中使用相同的应用程序镜像,只需通过不同的 ConfigMap 提供不同的配置。
4.与容器编排无缝集成
Kubernetes 提供了与 ConfigMap 的无缝集成。可以在 Pod 的定义中引用 ConfigMap,并将其挂载为容器的卷,使应用程序能够轻松访问配置数据。
5.版本控制和回滚
由于 ConfigMap 的配置信息是存储在 Kubernetes 集群中的,可以使用版本控制工具(如 Git)对配置进行管理。这样,可以轻松地回滚到先前的配置版本,以便在需要时进行故障恢复或回退。
使用 Kubernetes 的 ConfigMap 作为配置中心可以提供更好的配置管理、动态更新配置、环境解耦、容器编排集成以及版本控制和回滚的能力。这些优势使得 ConfigMap 成为在 Kubernetes 集群中管理应用程序配置的理想选择。
方案介绍
1.spring-cloud-starter-kubernetes
作用是将kubernetes的configmap与SpringCloud Config结合起来。
2.功能简介
SpringCloud Kubernetes Config 组件主要提供以下几种功能:
- 实时监控 ConfigMap、Secret 配置变化从而更新服务配置。
- 定时轮询加载 ConfigMap、Secret 配置从而更新服务配置。
3.配置发现过程
本质上配置管理利用了etcd的存储,首先是应用调用 spring-cloud-kubernetes-config 包,其调用了底层java实现的kubernetes-client,通过调用k8s api来实现从etcd中获取configmap和secret资源信息。
集成步骤
1.依赖引入
Spring Cloud Kubernetes 提供了众所周知的 Spring Cloud 接口的实现,允许开发人员在 Kubernetes 上构建和运行 Spring Cloud 应用程序。项目需要引入spring-cloud-Kubernetes的相关依赖,让客户端与k8s的服务端相连,以此来获取configmap的数据。需要引入的依赖如下。
1,我们的k8s的配置文件需要写在bootstrap.xml内才会生效,所以需要bootstrap的依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.3</version>
</dependency>
2.spring-cloud-starter-kubernetes-client-all的配置包含了所有k8s相关的依赖,这里只需引入spring-cloud-kubernetes-client-config,调用k8s的api去操作configmap拉取配置。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-kubernetes-client-config</artifactId>
<version>2.1.3</version>
</dependency>
3.spring-boot-actuator / spring-boot-actuator-autoconfigure 两个包的引入,使得应用可以进行热更新,当configmap/secret发生变更的时候,可以不重启Pod或进程进行热变更配置。(此依赖已经包含这两个依赖,只需引用这一个依赖就可以。)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator-autoconfigure</artifactId>
</dependency>
2.bootstrap.yaml配置
配置为:
spring:
cloud:
# 监控k8s configmap/secret api获取配置
kubernetes:
# 默认为true,可以不配置。
enabled: true
reload:
#自动更新配置的开关设置为打开
enabled: false
#更新配置信息的模式:polling是主动拉取,event是事件通知
# 1.polling:从 ConfigMap 和 Secret 中定期刷新配置,检测是否进行了修改。
# 2.event(默认):监视配置映射或机密的更改。任何事件都会对配置进行重新检查,如果发生更改,则会重新加载。
mode: polling
# 主动拉取的间隔时间是500毫秒
period: 500
#是否监控 Secret 的更改来执行更新
# monitoring-secrets: true
#刷新模式:
# (1)、refresh(默认):仅注释@ConfigurationProperties或@RefreshScope重新加载的配置Bean
# (2)、restart_context:整个Spring ApplicationContext正常重启。使用新配置重新创建Bean。
# (3)、shutdown:关闭以激活容器的重启。使用此级别时,请确保将所有非守护程序线程的生命周期绑定到该级别,
# 并将ApplicationContext 复制控制器或副本集配置为重新启动该pod。
strategy: refresh
config:
namespace: dev
name: ${spring.application.name}-dev
# 模式仅启动configmap获取,启用secret使用enable-api
# secrets:
# # 启用通过 K8S API 发现 Secret 配置,默认不开启
# enable-api: true
# namespace: dev
# name: ${spring.application.name}-secret
#labels: #指定 Label 标签名词,根据这个标签筛选 Secret,读取其中配置
# secret: enabled #自定义的 Label
management:
endpoint:
restart:
enabled: true
health:
enabled: true
info:
enabled: true
可以使用多个ConfigMap实例进行更高级的配置。该spring.cloud.kubernetes.config.sources列表使这成为可能。例如可以定义以下ConfigMap实例:
spring:
application:
name: cloud-k8s-app
cloud:
kubernetes:
config:
name: default-name
namespace: default-namespace
sources:
# Spring Cloud Kubernetes looks up a ConfigMap named c1 in namespace default-namespace
- name: c1
# Spring Cloud Kubernetes looks up a ConfigMap named default-name in whatever namespace n2
- namespace: n2
# Spring Cloud Kubernetes looks up a ConfigMap named c3 in namespace n3
- namespace: n3
name: c3
更多详细配置,参考官方文档:
Spring Cloud Kubernetes
3.service account(权限)配置
k8s集群通过RBAC进行权限控制,而运行在K8s上的Pod里的进程的权限则是通过service account进行认证。关于k8s权限具体鉴权可参考:
关于K8s中Service Account的一些笔记:Pod内部如何访问K8s API Server-云社区-华为云
1.创建service account(sa)
使用以下命令创建一个名为 my-service-account 的 ServiceAccount:
kubectl create serviceaccount my-service-account
2.创建role角色( 如果你已经有一个现有的角色或角色绑定,可以跳过此步骤。否则,你需要创建一个角色或角色绑定来定义权限。)
kubectl create role my-role --verb=get,list,create --resource=pods,configmap
这将创建一个具有 get、list 和 create 权限的角色,用于操作 Pods 和configmap资源。
3.创建roleBinding,关联sa与role角色
创建角色绑定的配置文件 my-role-binding.yaml:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: my-role-binding
subjects:
- kind: ServiceAccount
name: my-service-account
namespace: default
roleRef:
kind: Role
name: my-role
apiGroup: rbac.authorization.k8s.io
4.执行命令,创建RoleBinding
kubectl apply -f my-role-binding.yaml
5.验证
kubectl describe serviceaccount my-service-account
kubectl describe role my-role
kubectl describe rolebinding my-role-binding
这些命令将显示有关 ServiceAccount、角色和角色绑定的详细信息,包括与之关联的权限和资源。
6.其他命令
查看sa,role或者binding的yaml
kubectl get {serviceaccount/role/rolebinding} {serviceaccountname/rolename/rolebindingname} -n {namespace} -o yaml
4.编写ConfigMap
可以在华为云上自主创建,可以通过yaml创建,也可以通过华为的可视化操作页面创建。以hello-cce-backend为例,创建完如下:
配置文件放在data标签下,key为配置文件名字:value为具体配置文件内容。(注意要加 |,表示为字符串类型)。
更多推荐
所有评论(0)