使用 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为具体配置文件内容。(注意要加 |,表示为字符串类型)。

Logo

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

更多推荐