Nacos 2.3.0 正式版发布,Nacos Controller 项目开源

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Nacos 2.3.0 正式版发布,Nacos Controller 项目开源

作者: 杨翊


新版本发布

Nacos 2.3.0-BETA 版本经过 1 个多月的社区测试,修复了部分的问题并对部分新功能的使用进行了少量优化后,于 2023 年 12 月 7 日正式发布。


Nacos 2.3.0 版本基于 2.3.0-BETA 版本为基础,主要进行了如下更新:


  • 基于能力协商机制,支持通过 Grpc 的方式进行持久化服务实例的注册及删除。
  • Console UI 中显示更多内容,例如部署模式等。
  • 对参数校验功能的实现方式进行优化。
  • 对 TopN 指标的实现进行重构,优化准确性和内存消耗。


详细的更新日志请查看:


## Feature
[#11393] Support register or deregister persistent instance by grpc.
## Enhancement&Refactor
[#11275] Enhance console ui deploy, show more information like `mode`.
[#11298] Strip groupNamePrefix of instance serviceName at register or deregister.
[#11310] Simplify the validate method for serviceinfo.
[#11342] Simplify BatchDeregister instances conditions to ip and port.
[#11343] Simplified parameters checker control logic.
[#11352] Refactor topN logic to enhance memory usage and accuracy.
## BugFix
[#10353] Handling DataIntegrityViolationException and DuplicateKeyException together.
[#11299] Fix console ui auth pagination failure.
[#11382] Fix console ui listening query pagination failure.
[#11384] Fix console ui comparing configuration failure.
[#11390] Fix Config EncryptionPluginService order problem.
[#11442] Fix listen configuration check failed without namespace.
## Dependency
[#11216] Declare httpcore as direct dependency to fix avoid conflict.
[#11396] Upgrade jackson same with spring boot dependency.
[#11439] Upgrade some UI component to solve security problem.


Nacos Controller 项目开源


在云原生下,应用代码与运行环境可以通过 Helm 或 Kustomize 等软件进行交付、维护、CICD,但应用的 Nacos 配置依然需要手工地迁移、或使用控制台修改发布配置。借助于 Nacos Controller[1]项目,我们可以将 Nacos 配置管理下移到 Kubernetes 集群中,又或是可以将 Kubernetes 中 ConfigMap 配置上移到 Nacos 控制台中,从而实现统一管理能力。


Nacos 配置下移到 Kubernetes 集群中

工作机制

Nacos Controller 监听集群内的 DC 资源,当 DC 资源发生变化时,Nacos Controller 将其中的配置内容同步到 Nacos Server 中。



简易 Demo

在 Nacos Controller 中,我们定义了一份 CRD:DynamicConfiguration(简称 DC),我们将 Nacos 配置保存在 ConfigMap 中,对配置的任何修改都通过 DC 将其中的配置同步到对应的 Nacos 服务端中。在后续的配置维护中,直接修改对应的 ConfigMap 即可。以下是一份简易的 Demo 示例:


apiVersion: nacos.io/v1
kind: DynamicConfiguration
metadata:
    name: dc-demo-cluster2server
spec:
  dataIds:
  - data-id1.properties
  - data-id2.yml
  nacosServer:
    endpoint: <your-nacos-server-endpoint>
    namespace: <your-nacos-namespace-id>
    group: <your-nacos-group>
    authRef:
      apiVersion: v1
      kind: Secret
      name: nacos-auth
  strategy:
    syncPolicy: Always
    syncDirection: cluster2server
    syncDeletion: true
  objectRef:
    apiVersion: v1
    kind: ConfigMap
    name: nacos-config-cm
---
apiVersion: v1
kind: ConfigMap
metadata:
    name: nacos-config-cm
    namespace: default
data:
    data-id1.properties: |
      key=value
      key2=value2
    data-id2.yml: |
      app:
        name: test
---
apiVersion: v1
kind: Secret
metadata:
    name: nacos-auth
data:
    ak: <base64 ak>
    sk: <base64 sk>


Kubernetes 配置上移到 Nacos 控制台

工作机制

首先需要用户创建 DC 资源指定需要同步哪些 DataId,Nacos Controller 根据读取到的 DC 配置,选择性监听 Nacos Server 中的相关配置并将配置改动同步到 Kubernetes 集群中。



简易 Demo

云原生下,应用除了需要加载 Nacos 配置外,还可能依赖一些环境变量,比如 JVM 参数通过环境变量注入。做得比较好的方式是通过 ConfigMap 等 Kubernetes 原生方式管理配置,通过引用的方式传递给应用 Pod。在 Nacos Controller 中,我们可以定义一份 DC,将 Nacos 服务端中的某些 DataId 同步到 Kubernetes 集群中的 ConfigMap 中,从而实现配置的统一管理。以下是一份示例 Demo:


apiVersion: nacos.io/v1
kind: DynamicConfiguration
metadata:
    name: dc-demo-server2cluster
spec:
  dataIds:
  - APP1_JVM_PARAMS
  - APP2_JVM_PARAMS
  nacosServer:
    endpoint: <your-nacos-server-endpoint>
    namespace: <your-nacos-namespace-id>
    group: <your-nacos-group>
    authRef:
      apiVersion: v1
      kind: Secret
      name: nacos-auth
  strategy:
    syncPolicy: Always
    syncDirection: server2cluster
    syncDeletion: true
---
apiVersion: v1
kind: Secret
metadata:
    name: nacos-auth
data:
    ak: <base64 ak>
    sk: <base64 sk>


云原生下的配置管理最佳实践

在使用 Kubernetes 的场景下,一个微服务应用的配置被分割成两部份,一部分存放管理在 Kubernetes 集群中的 Secret 或 ConfigMap 中,另一部份存放管理与 Nacos 配置中心。对于运维人员,我们需要知道哪些配置是存放在何处且同时需要对两个平台的配置管理操作均有所了解,一来是增加了运维人员的知识门槛,二来是增加了应用配置运维的操作成本。通过 Nacos Controller 项目,我们将应用的所有配置集中于一处管理,降低应用配置运维的门槛与复杂性。



面向 Kubernetes 运维偏好的用户

通过 Nacos Controller 项目,我们将应用与应用配置的交付和维护集中在 Kubernetes 集群中。



以下通过一份 Helm 应用 Chart 包说明如何集中管理。


.
├── Chart.yaml
├── charts
├── conf
│   ├── application-dev.properties
│   ├── application.properties
│   ├── consumer-app.properties
│   └── provider-app.yaml
├── templates
│   ├── consumer.yaml
│   ├── dc.yaml
│   └── provider.yaml
└── values.yaml


以上是一份 Chart 包目录结构,其中 conf 目录存放的是 Nacos 配置,文件名即 DataId,文件内容即对应的 Content。在 templates/dc.yaml 中,我们定义一份 ConfigMap 来组装这些配置。templates 目录中的 consumer.yaml 与 provider.yaml 分别是应用定义。


apiVersion: v1
kind: ConfigMap
metadata:
  name: nacos-config
  namespace: {{ .Release.Namespace }}
data:
  {{- range $path, $_ := .Files.Glob "conf/**" }}
  {{ $path | base }}: |-
{{ $.Files.Get $path | indent 4}}
  {{- end }}


使用上述方式定义好应用与配置后,可以借助 git 实现应用、配置的版本管理。当需要发布应用或配置时,修改对应文件后,执行 helm upgrade 命令即可。


面向 Nacos 运维偏好的用户

Nacos 配置管理能力使得应用可以动态调整运行配置,但对于一些特殊的参数,如 JVM 参数、特殊环境变量、特殊目录文件等内容,Nacos 配置管理依然无法涵盖。在 Kubernetes 集群中,我们一般将环境变量或一些特殊文件配置写入 ConfigMap 中,通过 envFrom 能力将内容引用到环境变量中或者 volumeMount 挂载到文件系统中。这样的配置管理能力与 Nacos 配置管理能力是散开的,不利于统一管理。借助于 Nacos Controller,我们将这些配置上移到 Nacos 控制台中,进行统一管理。



以下是一份 Demo 应用,通过 Nacos 控制台管理 JVM 启动参数:


apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo-app
  template:
    metadata:
      labels:
        app: demo-app
    spec:
      containers:
      - name: demo-app
        image: openjdk:8 #替换为你的应用镜像
        command: ["/bin/sh", "-c", "java -jar ${JVM_PARAMS} /app.jar"]
        env:
        - name: JVM_PARAMS # 从ConfigMap中载入JVM参数到环境变量中
          valueFrom:
            configMapKeyRef:
              name: nacos-config
              key: APP1_JVM_PARAMS
---
apiVersion: nacos.io/v1
kind: DynamicConfiguration
metadata:
    name: nacos-config
spec:
  dataIds:
  - APP1_JVM_PARAMS
  - APP2_JVM_PARAMS
  nacosServer:
    endpoint: <your-nacos-server-endpoint>
    namespace: <your-nacos-namespace-id>
    group: <your-nacos-group>
    authRef:
      apiVersion: v1
      kind: Secret
      name: nacos-auth
  strategy:
    syncPolicy: Always
    syncDirection: server2cluster
    syncDeletion: true
---
apiVersion: v1
kind: Secret
metadata:
    name: nacos-auth
data:
    ak: <base64 ak>
    sk: <base64 sk>


在 Nacos 控制台中,修改 DataId:APP1_JVM_PARAMS 后,配置将自动同步到集群的 ConfigMap 中。只需重启相关应用,则对应的 JVM 参数将自动变化。成功实现将应用的所有配置集中管理在 Nacos 上。


Nacos 社区新晋 Committer


社区中新增了 2 位 Committer Karsonto[2]和 Daydreamer-ia[3]。同时,Nacos 社区又迎来了一位来自开源之夏的 Committer 同学 Daydreamer-ia 。



展望


2.X 后续计划

从 2021 年 3 月 2.0.0 正式版发布至今,2.X 版本已经走了接近2年时间,如今 2.3.0 版本发布,完成了大部分功能的插件化提炼,在之后的 2.3.X 版本中,会主要对当前版本的问题进行修复,并做出小范围的功能优化。同时对于 2.4.0 版本,会作为一个 Nacos3.0 的过度版本,对大量代码进行优化重构,在提升稳定性、健壮性的同时,提升易用性和可观测性,向 Nacos3.0 版本平稳过度。


3.0 计划

Nacos 社区同时也开启了关于 Nacos3.0 的畅想和规划,Nacos 将会从统一控制面、支持国产化、存储计算分离等方向进一步演进 Nacos 的功能和架构,欢迎社区积极参与到新版本的建设中。



About Nacos

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。


最后欢迎大家使用钉钉搜索群号加入 Nacos 社区群,钉钉群号:12810027056


相关链接:

[1] Nacos Controller

https://github.com/nacos-group/nacos-controller

[2] Karsonto

https://github.com/karsonto

[3]Daydreamer-ia

https://github.com/Daydreamer-ia

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
运维 API Nacos
nacos常见问题之controller 必须云服务才能使用如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
33 3
|
6月前
|
Java Unix Nacos
微服务轮子项目(12) - nacos注册中心(上)
微服务轮子项目(12) - nacos注册中心
81 0
|
2月前
|
缓存 Java Nacos
nacos常见问题之项目yml连接失败如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
|
4月前
|
API Nacos 数据库
Nacos配置问题之启动项目报错如何解决
Nacos是一个开源的、易于部署的动态服务发现、配置管理和服务管理平台,旨在帮助微服务架构下的应用进行快速配置更新和服务治理;在实际运用中,用户可能会遇到各种报错,本合集将常见的Nacos报错问题进行归纳和解答,以便使用者能够快速定位和解决这些问题。
311 0
|
4月前
|
前端开发 jenkins 持续交付
前后端分离项目知识汇总(GateWay,Nacos配置中心,Jenkins自动化部署,项目总结)-3
前后端分离项目知识汇总(GateWay,Nacos配置中心,Jenkins自动化部署,项目总结)
70 0
|
4月前
|
jenkins Java 持续交付
前后端分离项目知识汇总(GateWay,Nacos配置中心,Jenkins自动化部署,项目总结)-2
前后端分离项目知识汇总(GateWay,Nacos配置中心,Jenkins自动化部署,项目总结)
58 0
|
4月前
|
前端开发 Java jenkins
前后端分离项目知识汇总(GateWay,Nacos配置中心,Jenkins自动化部署,项目总结)-1
前后端分离项目知识汇总(GateWay,Nacos配置中心,Jenkins自动化部署,项目总结)
55 0
|
4月前
|
存储 Cloud Native Nacos
恭喜 Nacos 和 Sentinel 荣获 2023 开源创新榜“优秀开源项目”
恭喜 Nacos 和 Sentinel 荣获 2023 开源创新榜“优秀开源项目”
|
5月前
|
存储 Nacos
在Nacos中,作为交付项目 如何快速设置nacos中的配置文件?
在Nacos中,作为交付项目 如何快速设置nacos中的配置文件?
89 1
|
6月前
|
前端开发 jenkins 持续交付
前后端分离项目知识汇总(GateWay,Nacos配置中心,Jenkins自动化部署,项目总结)-3
前后端分离项目知识汇总(GateWay,Nacos配置中心,Jenkins自动化部署,项目总结)
78 0