Nacos 介绍
Nacos 是阿里云开源一款在微服务场景下用于处理应用配置发布管理和服务注册管理的服务平台。其主要提供了如下几个特性:
- 服务发现和服务健康监测
基于 DNS 和 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
- 动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
- 动态 DNS 服务
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。
- 服务及其元数据管理
Nacos 从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
KubeGems 中的 Nacos
KubeGems 自v1.21版本之后开启了对 Nacos 配置中心的支持,并利用了内置 Plugins CRD 实现了对 Nacos 的快速启动。

KubeGems 中的 Nacos 安装源来至官方社区提供https://github.com/nacos-group/nacos-k8s,并在 plugin crd 中来管理部署的版本。用过 Nacos 的同学可能知道,其内部的数据模型主要围绕dataid、group和namespace这 3 个进行操作。由于 KubeGems 的设计是一个支持多租户的平台,所以在应用 nacos 数据模型时,按照了 tenant + project来区分内部的命名空间。
 

启用和配置插件
KubeGems 启用 Nacos 需要具备系统管理员的权限进行操作。管理员进入管理后台的“插件管理”,点击“启用“按钮“即可开启Nacos。

直到出现如下状态,代表插件运行正常

此时,我们就可以在租户的环境中开始使用 Nacos 服务

个性化配置
Nacos插件的配置以 CRD 的形式存放在 nacos命名空间中,我们可以通过命令kubectl edit plugin nacos -n nacos对插件进行个性化配置。
apiVersion: plugins.kubegems.io/v1beta1
kind: Plugin
metadata:
  finalizers:
  - plugins.kubegems.io/finalizer
  generation: 1
  name: nacos
  namespace: nacos
spec:
  kind: helm
  path: helm
  url: https://github.com/nacos-group/nacos-k8s.git
  values:
    namespace: nacos
    global:
      mode: cluster
    nacos:
      replicaCount: 1
      image:
        repository: registry.cn-beijing.aliyuncs.com/kubegems/nacos-server
        tag: v2.1.1
      plugin:
        image:
          repository: registry.cn-beijing.aliyuncs.com/kubegems/nacos-peer-finder-plugin
    persistence:
      data:
        storageClassName: local-path
      enabled: true
    service:
      type: ClusterIP
  version: master
提示:KubeGems的插件 CRD 由 https://github.com/kubegems/bundle-controller提供支持,我们也可以直接使用 bundle-controller 在非 kubegems 集群中管理插件。
集群部署
Nacos集群由社区提供支持部署,kubegems 默认将 nacos 的全局运行模式设置为“cluster”,如果您需要扩展成多集群,只需修改replicaCount的副本数为 3 即可。

开放集群外访问
Nacos 插件默认运行在 Kubernetes 内部,如果需要在集群外访问 Nacos 需借助网关实现。管理员可以在后台创建一条基于默认网关的 ingress 来代理 nacos api。过程如下:
第一步: 进入路由功能页面,选择 nacos 命名空间

第二步:创建并提交一条路由规则,用于 nacos 的代理

第三步:获取访问地址

提示:Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成
使用配置中心
进入应用环境下的“应用配置”,可以点击右上角的“获取访问信息”查看当前环境下的 nacos sdk 所需的配置信息

配置管理
点击“创建配置项”就可以创建配置

配置历史与回滚

监听列表

运行测试
我们用 nacos-sdk-go/v1来做一个简单的认证
package main
import (
    "fmt"
    "time"
    "github.com/nacos-group/nacos-sdk-go/clients"
    "github.com/nacos-group/nacos-sdk-go/common/constant"
    "github.com/nacos-group/nacos-sdk-go/vo"
)
func main() {
    sc := []constant.ServerConfig{
        {
            IpAddr: "nacos.kubegems.io",
            Port:   31956,
        },
    }
    cc := constant.ClientConfig{
        NamespaceId:         "69f7325702bc396a8773f9a0a94eea310b21ec39", //namespace id
        TimeoutMs:           5000,
        NotLoadCacheAtStart: true,
        LogDir:              "/tmp/nacos/log",
        CacheDir:            "/tmp/nacos/cache",
        LogLevel:            "debug",
    }
    client, err := clients.NewConfigClient(
        vo.NacosClientParam{
            ClientConfig:  &cc,
            ServerConfigs: sc,
        },
    )
    if err != nil {
        panic(err)
    }
    content, err := client.GetConfig(vo.ConfigParam{
        DataId: "test",
        Group:  "e3",
    })
    fmt.Println("GetConfig,config :" + content)
    err = client.ListenConfig(vo.ConfigParam{
        DataId: "test",
        Group:  "e3",
        OnChange: func(namespace, group, dataId, data string) {
            fmt.Println("config changed group:" + group + ", dataId:" + dataId + ", content:" + data)
        },
    })
    time.Sleep(300 * time.Second)
}