管理微服务配置与Kubernetes ConfigMap

通过Kubernetes集群管理微服务应用时,一些用户习惯使用命令行操作,但维护微服务配置仍需在控制台进行。因此,EDAS将微服务配置的运维操作集成至Kubernetes集群中,您可以直接通过Kubectl等工具发布相关微服务配置。同时,EDAS还支持将Kubernetes中的ConfigMap内容管理集成至微服务配置控制台中,实现配置的统一管理。本文介绍如何管理Kubernetes ConfigMap与微服务配置。

技术原理

集群导入EDAS后,EDAS会托管一个增强版的Nacos Controller组件。 该控制器监听DynamicConfiguration资源,根据YAML中定义的内容将配置从Kubernetes集群中的ConfigMap同步至Nacos Server,或将配置从Nacos Server同步写入至Kubernetes集群中的ConfigMap。

  • 通过Kubernetes ConfigMap管理微服务配置时,Kubernetes集群配置和微服务配置的运维操作都在Kubernetes集群中,由Nacos Controller完成微服务配置的同步。

    image
  • 通过微服务配置管理Kubernetes ConfigMap时,ConfigMap配置和微服务配置的运维操作都在控制台,由Nacos Controller完成配置并下发至ConfigMap中。

    image

前提条件

K8s集群已导入EDAS,且集群版本≥1.16。具体操作,请参见在EDAS控制台导入Kubernetes集群

使用限制

当前仅支持通过配置YAML使用该功能。

黑屏操作入口

通过Kubernetes ConfigMap管理微服务配置

使用场景

如果您是经常使用K8s黑屏操作的运维人员,可以执行以下步骤通过ConfigMap发布微服务配置。

操作步骤

  1. 创建dc.yaml文件,定义同步ConfigMap中的配置至微服务配置控制台的参数信息。

    apiVersion: nacos.io/v1
    kind: DynamicConfiguration
    metadata:
        name: demo
        namespace: default
    spec:
      # 定义哪些dataId需要被同步。
      dataIds:
      - demo-data-id1.properties
      - demo-data-id2.yml
      # 定义同步到哪个微服务空间以及分组。
      nacosServer:
        # EDAS微服务空间ID。
        namespace: cn-hangzhou:demo
        group: demo_group
      # 同步策略
      strategy:
        syncPolicy: Always # Always/IfAbsent,当策略为IfAbsent时,当被同步侧存在配置时,跳过同步行为。
        syncDirection: cluster2server # cluster2server 表示从K8s集群同步到nacos server。
        syncDeletion: true # 同步删除配置操作。
      # 配置实际存放处,当前仅支持ConfigMap。
      objectRef:
        apiVersion: v1
        kind: ConfigMap
        name: configmap-for-nacos
    
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
        name: configmap-for-nacos
        namespace: default
    data:
        # 以DataId为key,Content为Value。需要被同步的DataId需要在DynamicConfiguration.spec.DataIds中注册。
        demo-data-id1.properties: |
          demo-key=demo.value
          demo-key2=demo.value2
        demo-data-id2.yml: |
          app:
            name: demo-app-name
    

    其中nacosServer下的namespace需替换为您当前Region的所属微服务空间ID,获取方式:

    1. 登录EDAS控制台

    2. 在左侧导航栏中选择资源管理 > 微服务空间

    3. 微服务空间页面查看当前Region的所有微服务空间ID,您可以任选其中一个替换。

      image.png

  2. 执行以下命令,创建DynamicConfiguration资源。

    kubectl apply -f dc.yaml

    日志提示以下信息,表明DynamicConfiguration已成功创建。

    dynamicconfiguration.nacos.io/demo created
    configmap/configmap-for-nacos created
  3. 执行以下命令,查询Demo部署状态。

    kubectl get dc -A

    日志提示以下信息,表明已成功部署。

    NAMESPACE   NAME                            PHASE     AGE
    default     demo                            succeed   4s
  4. 在EDAS控制台,选择应用管理> 微服务配置,在配置列表页面选择所属微服务空间后查看配置,可查看部署好的Demo。您可单击操作列的编辑查看配置详情。

    image.png

  5. 执行以下命令,修改ConfigMap内容,本文示例为修改demo-data-id2.yml配置文件。

    kubectl edit configmap configmap-for-nacos

    以下部分代码示例是将demo-data-id2.yml配置文件中appnamedemo-app-name修改为demo-app-name2

    apiVersion: v1
    data:
      demo-data-id1.properties: |
        demo-key=demo.value
        demo-key2=demo.value2
      demo-data-id2.yml: |
        app:
          name: demo-app-name2  # 修改名称。
    kind: ConfigMap
    metadata:
      name: configmap-for-nacos
      namespace: default
  6. 执行以下命令,查看已修改后的demo-data-id2.yml文件,确认已修改成功。

    kubectl get cm configmap-for-nacos -oyaml
  7. 执行以下命令,查看DynamicConfiguration状态。

    kubectl get dc demo -oyaml

    可以看到status.syncStatuses中lastSyncTime发生了变化。

    apiVersion: nacos.io/v1
    kind: DynamicConfiguration
    metadata:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"nacos.io/v1","kind":"DynamicConfiguration","metadata":{"annotations":{},"name":"demo","namespace":"default"},"spec":{"dataIds":["demo-data-id1.properties","demo-data-id2.yml"],"nacosServer":{"group":"demo_group","namespace":"cn-hangzhou"},"objectRef":{"apiVersion":"v1","kind":"ConfigMap","name":"configmap-for-nacos"},"strategy":{"syncDeletion":true,"syncDirection":"cluster2server","syncPolicy":"Always"}}}
      creationTimestamp: "2023-11-08T11:48:55Z"
      finalizers:
      - nacos.io/dc-finalizer
      generation: 1
      name: demo
      namespace: default
      resourceVersion: "138343446"
      uid: ca4a6ff8-20e7-4371-a072-9336403b****
    spec:
      dataIds:
      - demo-data-id1.properties
      - demo-data-id2.yml
      nacosServer:
        group: demo_group
        namespace: cn-hangzhou
      objectRef:
        apiVersion: v1
        kind: ConfigMap
        name: configmap-for-nacos
      strategy:
        syncDeletion: true
        syncDirection: cluster2server
        syncPolicy: Always
    status:
      objectRef:
        apiVersion: v1
        kind: ConfigMap
        name: configmap-for-nacos
        namespace: default
      observedGeneration: 1
      phase: succeed
      syncStatuses:
      - dataId: demo-data-id1.properties
        lastSyncFrom: cluster
        lastSyncTime: "2023-11-08T11:48:55Z"
        md5: 903f7d9a989744f3058266617514****
        ready: true
      - dataId: demo-data-id2.yml
        lastSyncFrom: cluster
        lastSyncTime: "2023-11-08T11:52:08Z"
        md5: 843229a8c3d760be382562ed70a6****
        ready: true
  8. 在EDAS控制台,也可以看到配置已更新。

    image.png

通过微服务配置管理Kubernetes ConfigMap内容

使用场景

如果您是经常使用微服务配置白屏的运维人员,可以执行以下步骤通过微服务配置控制台集中管理ConfigMap内容。

操作步骤

  1. 应用管理 > 微服务配置页面创建配置。具体操作,请参见创建配置

    image.png

  2. 创建dc2.yaml文件,定义同步微服务配置至集群中的ConfigMap内容。

    apiVersion: nacos.io/v1
    kind: DynamicConfiguration
    metadata:
        name: demo2
        namespace: default
    spec:
      # 定义哪些dataId需要被同步。
      dataIds:
      - DEMO_JVM_CONFIG
      # 定义同步到哪个微服务空间以及分组。
      nacosServer:
        # EDAS微服务空间ID。
        namespace: cn-hangzhou:demo
        group: demo_group
      # 同步策略。
      strategy:
        syncPolicy: Always # Always / IfAbsent,当策略为IfAbsent时,当被同步侧存在配置时,跳过同步行为。
        syncDirection: server2cluster # cluster2server 表示nacos server同步到K8s中。
        syncDeletion: true # 同步删除配置操作。
  3. 执行以下命令,创建DynamicConfiguration资源。

    kubectl apply -f dc2.yaml

    日志显示以下信息,表明DynamicConfiguration已成功创建。

    dynamicconfiguration.nacos.io/demo2 created
  4. 执行以下命令,查看Demo部署状态。

    kubectl get dc -A

    日志显示以下信息,表明Demo已成功部署。

    NAMESPACE   NAME                            PHASE     AGE
    default     demo                            succeed   19m
    default     demo2                           succeed   9s
  5. 创建成功后,执行以下命令,集群内出现一个存放着同步配置信息的同名ConfigMap。

    kubectl get cm | grep demo2
    demo2                                             1      38s
  6. 执行以下命令,查看集群内的ConfigMap。

    kubectl get cm demo2 -oyaml

    可以看到目前的ConfigMap配置内容如下所示:

    apiVersion: v1
    data:
      DEMO_JVM_CONFIG: -Xmx1g -Xms1g
    kind: ConfigMap
    metadata:
      creationTimestamp: "2023-11-08T12:08:42Z"
      labels:
        nacos.io/owned-by-dc: demo2
      name: demo2
      namespace: default
      ownerReferences:
      - apiVersion: nacos.io/v1
        blockOwnerDeletion: true
        controller: true
        kind: DynamicConfiguration
        name: demo2
        uid: 7a94527d-c8e5-4ebe-b2df-25448a3e****
      resourceVersion: "138354722"
      uid: a3437c94-5304-41b2-a2ad-15cf090b****
  7. 在EDAS控制台修改配置内容后发布。

    image.png

  8. 执行以下命令,查看集群内的ConfigMap。

    kubectl get cm demo2 -oyaml

    可以看到配置已同步修改成功。

    apiVersion: v1
    data:
      DEMO_JVM_CONFIG: -Xmx2g -Xms2g
    kind: ConfigMap
    metadata:
      creationTimestamp: "2023-11-08T12:08:42Z"
      labels:
        nacos.io/owned-by-dc: demo2
      name: demo2
      namespace: default
      ownerReferences:
      - apiVersion: nacos.io/v1
        blockOwnerDeletion: true
        controller: true
        kind: DynamicConfiguration
        name: demo2
        uid: 7a94527d-c8e5-4ebe-b2df-25448a3e****
      resourceVersion: "138367066"
      uid: a3437c94-5304-41b2-a2ad-15cf090b****

相关文档

  • 在EDAS控制台创建配置的具体操作,请参见创建配置

  • 该功能的开源版本,请参见开源版本