Nacos的集群管理实战

                                              作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.集群部署说明

1.集群部署架构图

如上图所示,起用Nacos的时候推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面。

官网支持三种访问模式,我们推荐使用第三种:
    http://ip1:port/openAPI
        直连ip模式,机器挂则需要修改ip才可以使用。

    http://SLB:port/openAPI 
        挂载SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),直连SLB即可,下面挂server真实ip,可读性不好。

    http://nacos.com:port/openAPI 
        域名 + SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),可读性好,而且换ip方便,推荐模式。

参考链接:
	https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
	https://nacos.io/docs/latest/manual/admin/deployment/deployment-cluster

2.端口情况说明

端口 与主端口的偏移量 描述
8848 0 主端口,客户端、控制台及OpenAPI所使用的HTTP端口
9848 1000 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
9849 1001 服务端gRPC请求服务端端口,用于服务间同步等
7848 -1000 Jraft请求服务端端口,用于处理服务端间的Raft相关请求
Nacos2.X版本新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port,默认8848)基础上,进行一定偏移量自动生成,具体端口内容及偏移量请参考如上表所示。

使用VIP/nginx请求时,需要配置成TCP转发,不能配置http2转发,否则连接会被nginx断开。

对外暴露端口时,只需要暴露主端口(默认8848)和gRPC端口(默认9848),其他端口为服务端之间的通信端口,请勿暴露其他端口,同时建议所有端口均不暴露在公网下。

客户端拥有相同的计算逻辑,用户如同1.X的使用方式,配置主端口(默认8848),通过相同的偏移量,计算对应gRPC端口(默认9848)。

因此如果客户端和服务端之前存在端口转发,或防火墙时,需要对端口转发配置和防火墙配置做相应的调整。


参考链接:
	https://nacos.io/docs/latest/manual/admin/deployment/deployment-overview/#1-nacos部署架构

3.Nacos高可用集群架构设计

主机名 IP地址 角色 备注
master231 10.0.0.231 Nacos,MySQL,
worker232 10.0.0.232 Nacos,haproxy,keepalived VIP地址: 10.0.0.66
worker233 10.0.0.233 Nacos,haproxy,keepalived VIP地址: 10.0.0.66
如上图所示,我设计了3个Nacos节点,2个haproxy和keepalived复用Nacos节点。

综上所述,本案例仅需要3个节点即可完成实验。

二.Nacos高可用集群部署实战案例

1.Nacos集群部署单机版Nacos环境

温馨提示,3个Nacos节点都先部署好单机版的Nacos环境。

单机版Nacos环境部署具体操作如下:
	1.安装JDK(Nacos基于Java开发,要求JDK1.8+)
[root@master231 ~]# apt update && apt -y install openjdk-11-jdk


	2.下载二进制软件版
[root@master231 ~]# wget https://github.com/alibaba/nacos/releases/download/2.5.0/nacos-server-2.5.0.tar.gz


	3.解压软件包
[root@master231 ~]# tar xf nacos-server-2.5.0.tar.gz -C /yinzhengjie/softwares/


	4.指定standalone单机版模式启动Nacos服务,默认监听8848端口
[root@master231 ~]# /yinzhengjie/softwares/nacos/bin/startup.sh -m standalone
...
nacos is starting with standalone
nacos is starting. you can check the /yinzhengjie/softwares/nacos/logs/start.out
[root@master231 ~]# 
[root@master231 ~]# ss -ntl | grep 8848
LISTEN 0      100                      *:8848             *:*          
[root@master231 ~]# 


	5.如上图所示,访问Nacos的WebUI,3个节点各自为政,目前并不属于同一个集群。
http://10.0.0.231:8848/nacos
http://10.0.0.232:8848/nacos
http://10.0.0.233:8848/nacos

2.部署MySQL并导入Nacos表结构

	1.部署MySQL服务
[root@master231 ~]# apt update && apt -y install mysql-server
[root@master231 ~]# ss -ntl | grep 3306
LISTEN 0      151              127.0.0.1:3306       0.0.0.0:*          
LISTEN 0      70               127.0.0.1:33060      0.0.0.0:*
[root@master231 ~]# sed -i '/127.0.0.1/s/^/#/' /etc/mysql/mysql.conf.d/mysqld.cnf
[root@master231 ~]# systemctl restart mysql.service 
[root@master231 ~]# ss -ntl | grep 3306
LISTEN 0      151                      *:3306             *:*          
LISTEN 0      70                       *:33060            *:*          
[root@master231 ~]# 


	2.创建授权用户
[root@master231 ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.41-0ubuntu0.22.04.1 (Ubuntu)

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE nacos;
Query OK, 1 row affected (0.01 sec)

mysql> CREATE USER nacos IDENTIFIED  WITH  mysql_native_password by 'yinzhengjie';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL ON nacos.* TO nacos;
Query OK, 0 rows affected (0.00 sec)

mysql> 


	3.导入Nacos的表结构
[root@master231 ~]# mysql -unacos -pyinzhengjie nacos < /yinzhengjie/softwares/nacos/conf/mysql-schema.sql

3.修改Nacos的配置文件

	1.生成toke的值,自定义密钥时,推荐将配置项设置为Base64编码的字符串,且原始密钥长度不得低于32字符。
[root@master231 ~]# openssl rand -base64 33
SuYALHsuVE4XyjQelTMhFbzeHAgDptayAKa8d5pmkQ7K
[root@master231 ~]# 

	
	
	2.在集群任意节点修改Nacos配置
[root@master231 ~]# vim /yinzhengjie/softwares/nacos/conf/application.properties
...
# 修改MySQL作为数据源
spring.sql.init.platform=mysql
db.num=1
db.url.0=jdbc:mysql://10.0.0.231:3306/nacos?
characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=yinzhengjie
# 开启Nacos认证的相关配置
nacos.core.auth.system.type=nacos
nacos.core.auth.enabled=true
nacos.core.auth.server.identity.key=yinzhengjie
nacos.core.auth.server.identity.value=yinzhengjie
nacos.core.auth.plugin.nacos.token.secret.key=SuYALHsuVE4XyjQelTMhFbzeHAgDptayAKa8d5pmkQ7K


	3.修改Nacos集群列表
[root@master231 ~]# cat /yinzhengjie/softwares/nacos/conf/cluster.conf
10.0.0.231:8848
10.0.0.232:8848
10.0.0.233:8848
[root@master231 ~]# 


	4.将修改好的配置文件拷贝到其他2个Nacos节点
[root@master231 ~]# cd /yinzhengjie/softwares/nacos/conf/
[root@master231 conf]# 
[root@master231 conf]# scp cluster.conf application.properties 10.0.0.232:`pwd`
root@10.0.0.232's password: 
cluster.conf                                                                                                            100%   48    66.3KB/s   00:00    
application.properties                                                                                                  100%   13KB  10.4MB/s   00:00    
[root@master231 conf]# 
[root@master231 conf]# scp cluster.conf application.properties 10.0.0.233:`pwd`
root@10.0.0.233's password: 
cluster.conf                                                                                                            100%   48    20.8KB/s   00:00    
application.properties                                                                                                  100%   13KB   5.1MB/s   00:00    
[root@master231 conf]# 

4.启动Nacos集群

	1.所有节点都需要停止单机版的Nacos服务
[root@master231 ~]# /yinzhengjie/softwares/nacos/bin/shutdown.sh

[root@worker232 ~]# /yinzhengjie/softwares/nacos/bin/shutdown.sh

[root@worker233 ~]# /yinzhengjie/softwares/nacos/bin/shutdown.sh


	2.以集群模式启动,不要使用单机版的模式启动(注意启动命令的参数变化)
[root@master231 ~]# /yinzhengjie/softwares/nacos/bin/startup.sh 
[root@worker232 ~]# /yinzhengjie/softwares/nacos/bin/startup.sh 
[root@worker233 ~]# /yinzhengjie/softwares/nacos/bin/startup.sh 


	3.观察启动日志信息
[root@master231 ~]# tail  -100f /yinzhengjie/softwares/nacos/logs/start.out 
...
2025-02-08 19:17:56,117 INFO The server IP list of Nacos is [10.0.0.231:8848, 10.0.0.232:8848, 10.0.0.233:8848]


	4.访问Nacos的WebUI(注意哈,安全认证一点在任意一个节点配置好了,后续节点就共享该用户名和密码进行登录哟~)
http://10.0.0.231:8848/nacos
http://10.0.0.232:8848/nacos
http://10.0.0.233:8848/nacos


	5.查看集群节点
如上图所示,我们在任意Nacos的WebUI都能看到整个集群列表哟~

5.配置haproxy实现负载均衡

	1.修改内核参数
[root@worker232 ~]# echo net.ipv4.ip_nonlocal_bind = 1 >> /etc/sysctl.d/nacos.conf
[root@worker232 ~]# sysctl -f /etc/sysctl.d/nacos.conf
net.ipv4.ip_nonlocal_bind = 1
[root@worker232 ~]# 
[root@worker232 ~]# sysctl -q net.ipv4.ip_nonlocal_bind
net.ipv4.ip_nonlocal_bind = 1
[root@worker232 ~]# 

[root@worker233 ~]# echo net.ipv4.ip_nonlocal_bind = 1 >> /etc/sysctl.d/nacos.conf
[root@worker233 ~]# sysctl -f /etc/sysctl.d/nacos.conf
net.ipv4.ip_nonlocal_bind = 1
[root@worker233 ~]# 
[root@worker233 ~]# sysctl -q net.ipv4.ip_nonlocal_bind
net.ipv4.ip_nonlocal_bind = 1
[root@worker233 ~]# 


	2.在两台服务器上安装配置haproxy实现负载均衡反向代理
[root@worker232 ~]# apt update && apt -y install haproxy

[root@worker233 ~]# apt update && apt -y install haproxy


	3.修改haproxy的配置文件
[root@worker232 ~]# tail -13 /etc/haproxy/haproxy.cfg 
listen stats
    mode http
    bind 0.0.0.0:9999
    stats enable
    log global
    stats uri    /ruok
    stats auth    admin:yinzhengjie

listen nacos
    bind 10.0.0.66:18848
    server master231 10.0.0.231:8848 check
    server worker232 10.0.0.232:8848 check
    server worker233 10.0.0.233:8848 check
[root@worker232 ~]# 

[root@worker233 ~]# tail -13 /etc/haproxy/haproxy.cfg 
listen stats
    mode http
    bind 0.0.0.0:9999
    stats enable
    log global
    stats uri  /ruok
    stats auth  admin:yinzhengjie

listen nacos
    bind 10.0.0.66:18848
    server master231 10.0.0.231:8848 check
    server worker232 10.0.0.232:8848 check
    server worker233 10.0.0.233:8848 check
[root@worker233 ~]# 

6.配置抢占式keepalived实现高可用

	1.在两台服务器上安装配置keepalived实现高可用
[root@worker232 ~]# apt update && apt -y install keepalived
[root@worker233 ~]# apt update && apt -y install keepalived


	2.修改keepalived的配置文件
[root@worker232 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   router_id 10.0.0.232
}
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 251
    priority 100
    advert_int 1
    mcast_src_ip 10.0.0.232
    nopreempt
    authentication {
        auth_type PASS
        auth_pass yinzhengjie
    }
    track_script {
         chk_haproxy
    }
    virtual_ipaddress {
        10.0.0.66
    }
}
[root@worker232 ~]# 


[root@worker233 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
   router_id 10.0.0.233
}
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 251
    priority 80
    advert_int 1
    mcast_src_ip 10.0.0.233
    nopreempt
    authentication {
        auth_type PASS
        auth_pass yinzhengjie
    }
    track_script {
         chk_haproxy
    }
    virtual_ipaddress {
        10.0.0.66
    }
}
[root@worker233 ~]# 




	3.重启keepalived服务使得配置生效
[root@worker232 ~]# systemctl restart keepalived

[root@worker233 ~]# systemctl restart keepalived



	4.查看VIP所在节点
[root@worker232 ~]# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:57:58:34 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    altname ens33
    inet 10.0.0.232/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.66/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe57:5834/64 scope link 
       valid_lft forever preferred_lft forever
...


[root@worker233 ~]# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:ff:22:e5 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    altname ens33
    inet 10.0.0.233/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feff:22e5/64 scope link 
       valid_lft forever preferred_lft forever
...




	5.停止VIP节点的keepalived服务
[root@worker232 ~]#  systemctl stop keepalived.service 
[root@worker232 ~]# 


	6.观察VIP飘逸成功
[root@worker232 ~]# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:57:58:34 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    altname ens33
    inet 10.0.0.232/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe57:5834/64 scope link 
       valid_lft forever preferred_lft forever


[root@worker233 ~]# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:ff:22:e5 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    altname ens33
    inet 10.0.0.233/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.66/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feff:22e5/64 scope link 
       valid_lft forever preferred_lft forever


	7.再次启动keepalived
[root@worker232 ~]# systemctl start keepalived.service 


	8.观察VIP飘逸成功,抢占式配置成功
[root@worker232 ~]# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:57:58:34 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    altname ens33
    inet 10.0.0.232/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.66/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe57:5834/64 scope link 
       valid_lft forever preferred_lft forever


[root@worker233 ~]# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:ff:22:e5 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    altname ens33
    inet 10.0.0.233/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feff:22e5/64 scope link 
       valid_lft forever preferred_lft forever

7.访问haproxy的状态页

	1.启动haproxy服务
[root@worker232 ~]# systemctl restart haproxy.service 
[root@worker232 ~]# ss -ntl| egrep "9999|18848"
LISTEN 0      16384              0.0.0.0:9999       0.0.0.0:*          
LISTEN 0      16384            10.0.0.66:18848      0.0.0.0:*          
[root@worker232 ~]# 

[root@worker233 ~]# systemctl restart haproxy.service 
[root@worker233 ~]# ss -ntl| egrep "9999|18848"
LISTEN 0      16384            10.0.0.66:18848      0.0.0.0:*          
LISTEN 0      16384              0.0.0.0:9999       0.0.0.0:*          
[root@worker233 ~]# 

	
	2.验证haproxy的状态页
http://10.0.0.66:9999/ruok

如上图所示,首次登录需要输入密码,登录成功后就可以看到如下图所示的haproxy的状态码信息啦~

8.访问haproxy实现Nacos的访问

	1.访问Nacos的WebUI(如上图所示)
http://10.0.0.66:18848/nacos
	
	
	2.查看集群数量
如下图所示,我们可以明显看到当前模式是集群模式哟~

9.验证Nacos服务是否正常访问

	1.登录Nacos获取token
[root@master231 ~]# curl -s -X POST 'http://10.0.0.66:18848/nacos/v1/auth/login' -d 'username=nacos&password=yinzhengjie' | more 
{"accessToken":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTczOTAzNTM5Nn0.lIzuLShfG82pr9cq6Py8q74nSncA4jBzSSJFvlIXbtQ","tokenTtl":18000,"glob
alAdmin":true,"username":"nacos"}
[root@master231 ~]# 

	2.使用accessToken进行登录验证写入数据成功
[root@master231 ~]# curl -s -X POST "http://10.0.0.66:18848/nacos/v1/cs/configs?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTczOTAzNTM5Nn0.lIzuLShfG82pr9cq6Py8q74nSncA4jBzSSJFvlIXbtQ&dataId=myblog&group=k8s&content=https://www.cnblogs.com/yinzhengjie" | more
true
[root@master231 ~]# 
[root@master231 ~]# 

	3.命令行方式获取配置(如上图所示,我们也可以在直接在WebUI访问查看哟)
[root@master231 ~]# curl -s -X GET "http://10.0.0.231:8848/nacos/v1/cs/configs?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTczOTAzNTM5Nn0.lIzuLShfG82pr9cq6Py8q74nSncA4jBzSSJFvlIXbtQ&dataId=myblog&group=k8s" | more
https://www.cnblogs.com/yinzhengjie
[root@master231 ~]# 

posted @ 2025-02-09 02:29  尹正杰  阅读(859)  评论(1)    收藏  举报