Kubernetes Nacos

本项目包含一个可构建的Nacos Docker Image,旨在利用StatefulSets在Kubernetes上部署Nacos

English Document

快速开始

  • Clone 项目
  1. git clone https://github.com/nacos-group/nacos-k8s.git
  • 简单例子

如果你使用简单方式快速启动,请注意这是没有使用持久化卷的,可能存在数据丢失风险:

  1. cd nacos-k8s
  2. chmod +x quick-startup.sh
  3. ./quick-startup.sh
  • 测试

    • 服务注册
  1. curl -X PUT 'http://cluster-ip:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
  • 服务发现
  1. curl -X GET 'http://cluster-ip:8848/nacos/v1/ns/instances?serviceName=nacos.naming.serviceName'
  • 发布配置
  1. curl -X POST "http://cluster-ip:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=helloWorld"
  • 获取配置
  1. curl -X GET "http://cluster-ip:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"

高级使用

在高级使用中,Nacos在K8S拥有自动扩容缩容和数据持久特性,请注意如果需要使用这部分功能请使用PVC持久卷,Nacos的自动扩容缩容需要依赖持久卷,以及数据持久化也是一样,本例中使用的是NFS来使用PVC.

部署 NFS

  • 创建角色
  1. kubectl create -f deploy/nfs/rbac.yaml

如果的K8S命名空间不是default,请在部署RBAC之前执行以下脚本:

  1. # Set the subject of the RBAC objects to the current namespace where the provisioner is being deployed
  2. $ NS=$(kubectl config get-contexts|grep -e "^\*" |awk '{print $5}')
  3. $ NAMESPACE=${NS:-default}
  4. $ sed -i'' "s/namespace:.*/namespace: $NAMESPACE/g" ./deploy/nfs/rbac.yaml
  • 创建 ServiceAccount 和部署 NFS-Client Provisioner
  1. kubectl create -f deploy/nfs/deployment.yaml
  • 创建 NFS StorageClass
  1. kubectl create -f deploy/nfs/class.yaml
  • 验证NFS部署成功
  1. kubectl get pod -l app=nfs-client-provisioner

部署数据库

  • 部署主库
  1. cd nacos-k8s
  2. kubectl create -f deploy/mysql/mysql-master-nfs.yaml
  • 部署从库
  1. cd nacos-k8s
  2. kubectl create -f deploy/mysql/mysql-slave-nfs.yaml
  • 验证数据库是否正常工作
  1. # master
  2. kubectl get pod
  3. NAME READY STATUS RESTARTS AGE
  4. mysql-master-gf2vd 1/1 Running 0 111m
  5. # slave
  6. kubectl get pod
  7. mysql-slave-kf9cb 1/1 Running 0 110m

部署Nacos

  • 修改 depoly/nacos/nacos-pvc-nfs.yaml
  1. data:
  2. mysql.master.db.name: "主库名称"
  3. mysql.master.port: "主库端口"
  4. mysql.slave.port: "从库端口"
  5. mysql.master.user: "主库用户名"
  6. mysql.master.password: "主库密码"
  • 创建 Nacos
  1. kubectl create -f nacos-k8s/deploy/nacos/nacos-pvc-nfs.yaml
  • 验证Nacos节点启动成功
  1. kubectl get pod -l app=nacos
  2. NAME READY STATUS RESTARTS AGE
  3. nacos-0 1/1 Running 0 19h
  4. nacos-1 1/1 Running 0 19h
  5. nacos-2 1/1 Running 0 19h

扩容测试

  • 在扩容前,使用 kubectl exec获取在pod中的Nacos集群配置文件信息
  1. for i in 0 1; do echo nacos-$i; kubectl exec nacos-$i cat conf/cluster.conf; done

StatefulSet控制器根据其序数索引为每个Pod提供唯一的主机名。 主机名采用 - 的形式。 因为nacos StatefulSet的副本字段设置为2,所以当前集群文件中只有两个Nacos节点地址

k8s

  • 使用kubectl scale 对Nacos动态扩容
  1. kubectl scale sts nacos --replicas=3

scale

  • 在扩容后,使用 kubectl exec获取在pod中的Nacos集群配置文件信息
  1. for i in 0 1 2; do echo nacos-$i; kubectl exec nacos-$i cat conf/cluster.conf; done

get_cluster_after

  • 使用 kubectl exec执行Nacos API 在每台节点上获取当前Leader是否一致
  1. for i in 0 1 2; do echo nacos-$i; kubectl exec nacos-$i curl GET "http://localhost:8848/nacos/v1/ns/raft/state"; done

到这里你可以发现新节点已经正常加入Nacos集群当中

例子部署环境

  • 机器配置

    内网IP主机名配置
    172.17.79.3k8s-masterCentOS Linux release 7.4.1708 (Core) Single-core processor Mem 4G Cloud disk 40G
    172.17.79.4node01CentOS Linux release 7.4.1708 (Core) Single-core processor Mem 4G Cloud disk 40G
    172.17.79.5node02CentOS Linux release 7.4.1708 (Core) Single-core processor Mem 4G Cloud disk 40G
  • Kubernetes 版本:1.12.2 (如果你和我一样只使用了三台机器,那么记得开启master节点的部署功能)

  • NFS 版本:4.1 在k8s-master进行安装Server端,并且指定共享目录,本项目指定的/data/nfs-share
  • Git

限制

  • 必须要使用持久卷,否则会出现数据丢失的情况

项目目录

目录描述
plugin帮助Nacos集群进行动态扩容的插件Docker镜像源码
deployK8s 部署文件

配置属性

  • nacos-pvc-nfs.yaml or nacos-quick-start.yaml

    名称必要描述
    mysql.master.db.nameY主库名称
    mysql.master.portN主库端口
    mysql.slave.portN从库端口
    mysql.master.userY主库用户名
    mysql.master.passwordY主库密码
    NACOS_REPLICASN确定执行Nacos启动节点数量,如果不适用动态扩容插件,就必须配置这个属性,否则使用扩容插件后不会生效
    NACOS_SERVER_PORTNNacos 端口
    PREFER_HOST_MODEY启动Nacos集群按域名解析
  • nfs deployment.yaml

    名称必要描述
    NFS_SERVERYNFS 服务端地址
    NFS_PATHYNFS 共享目录
    serverYNFS 服务端地址
    pathYNFS 共享目录
  • mysql

    名称必要描述
    MYSQL_ROOT_PASSWORDNROOT 密码
    MYSQL_DATABASEY数据库名称
    MYSQL_USERY数据库用户名
    MYSQL_PASSWORDY数据库密码
    MYSQL_REPLICATION_USERY数据库复制用户
    MYSQL_REPLICATION_PASSWORDY数据库复制用户密码
    Nfs:serverNNFS 服务端地址,如果使用本地部署不需要配置
    Nfs:pathNNFS 共享目录,如果使用本地部署不需要配置