近期,在机器上部署了三个节点的nacos集群服务用于几个小型微服务的注册配置中心,并使用了Nginx简单代理了一下,随即简单研究了下集群部署分布式部署稍微提高可用性。部署完后能够正常使用,但是发现一个问题,刷新Nacos集群节点列表,总会有一个或者两个节点时不时处于DOWNh或者SUSPICIOUS状态,于是开始了漫长的查找问题过程。集群能够正常使用,就是各服务应用总会爆出来一堆链接nacos服务异常,估计是发现不行马上又重定向到别的节点去了。最终,发现是某个节点的服务器的hostname不对(另外一个情况是cluster.conf
容器里面内容旧数据,ENV配置时候也加入里面原始内容),而在nacos集群配置的是对应服务器的IP地址NACOS_INETUTILS_IP_ADDRESS
,由此导致了集群节点间心跳检测失败,三次之后,节点自动下线或被置于不信任状态...
前情纪要
- 仅集群内访问
- 内网k8s环境外网端口开放条件
- nacos2.2.X版本常见问题
本地搭建集群环境轻轻松松,在服务器上面提供机器搭建也是正常,到了k8s环境内网的时候就有点偏差,没问题还好,一旦没有部署成功就会出现各种问题,部署成功后出现服务掉线等
遇到问题:
- 问题1:集群使用内网研发云k8s有部署成功之后,原本三个节点的冒出第四个节点
- 问题2:集群部署根据自定义的环境变量进行传入参数,但是出现多余一个动态节点
- 问题3:使用VIP地址把原本内部集群端口映射,服务注册出现大批量上线又掉线情况
不是经常性操作和部署,但是还是需要进行归纳总结梳理,后续查阅笔记记录,配置文件相关内容依据不同环境配置即可,不多加累赘,仅记录爬坑的问题
搭建架构
- 3+以上Nacos节点才能构成集群;
- Nacos Nginx Proxy用于代理转发;
准备排版
Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。来源:集群模式部署
端口 | 与主端口的偏移量 | 描述 |
---|---|---|
8848 | 0 | 主端口,客户端、控制台及OpenAPI所使用的HTTP端口 |
9848 | 1000 | 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 |
9849 | 1001 | 服务端gRPC请求服务端端口,用于服务间同步等 |
7848 | -1000 | Jraft请求服务端端口,用于处理服务端间的Raft相关请求 |
使用VIP/nginx请求时,需要配置成TCP转发,不能配置http2转发,否则连接会被nginx断开。9849和7848端口为服务端之间的通信端口,请勿暴露到外部网络环境和客户端测。
按照上述官方的端口分配要求,此处部署的使用三台服务器上面创建的Nacos集群端口分配如下:
节点 | IP | 端口(所需暴露) | 备注 | 版本 | 当前线下环境部署文件路径 |
---|---|---|---|---|---|
nacos-node1 | 192.168.xx.201 | 宿主机:8858,9858,9859,7858 容器:8858,9858,9859,7858 | Nacos 节点一 | nacos/nacos-server:2.2.4 | /root/nacos-deploy/ |
nacos-node2 | 192.168.xx.202 | 宿主机:8858,9858,9859,7858 容器:8858,9858,9859,7858 | Nacos 节点二 | nacos/nacos-server:2.2.4 | /root/nacos-deploy/ |
nacos-node3 | 192.168.xx.203 | 宿主机:8858,9858,9859,7858 容器:8858,9858,9859,7858 | Nacos 节点三 | nacos/nacos-server:2.2.4 | /root/nacos-deploy/ |
Nacos DB Mysql | 192.168.xx.206 | 宿主机:3306 容器:3306 | Nacos数据库 | mysql:5.7.34 | /root/nacos-db-deploy |
Nacos DB Postgres | 192.168.xx.206 | 宿主机:5432 容器:5432 | Nacos数据库 | postgres:12-alpine | /root/nacos-db-deploy |
Nacos Nginx Proxy | 192.168.xx.208 | 宿主机:80 容器:80 | Nacos代理 | 1.23.2 | /root/nacos-proxy-deploy |
Nacos Cheak Health | 192.168.xx.208 | 健康检查 | /root/nacos-check-health |
k8s互通域名
【nacos-node1】是指:负载名称
【pigcloud.svc.cluster.local】是指:固定服务名称
nacos-node1.pigcloud.svc.cluster.local:8858
nacos-node2.pigcloud.svc.cluster.local:8858
nacos-node3.pigcloud.svc.cluster.local:8858
域名nginx里面配置信息调整起到关键作用
创建Nacos数据库
使用的是容器化运行nacos,需要创建一个数据库,并从官方对应的版本中去导入基本数据库结构的数据文件
编译nacos2.2.4
创建mysql服务
- docker-mysql.yml
- 执行yml
docker-compose -f /root/nacos-db-deploy/docker-mysql.yaml up -d
# 导入官方表数据
docker cp /root/nacos/conf/nacos-mysql.sql nacos-mysql:/tmp
docker exec -it nacos-mysql sh
mysql -uroot -p123456
create database nacos;
use nacos;
source /tmp/nacos-mysql.sql;
创建postgres服务
-
docker-postgres.yml
-
执行yml
docker-compose -f /root/nacos-db-deploy/postgres.yaml up -d
Nacos服务
创编yaml文件
mkdir /data/nacos2.2.4_1/logs -p
mkdir /data/nacos2.2.4_2/logs -p
mkdir /data/nacos2.2.4_2/logs -p
mkdir /root/nacos-deploy/
cat /root/nacos-deploy/nacos1.yaml
对应内容写入
EOF
cat /root/nacos-deploy/nacos2.yaml
对应内容写入
EOF
cat /root/nacos-deploy/nacos3.yaml
对应内容写入
EOF
各配置中的端口非标准端口,需注意环境变量NACOS_APPLICATION_PORT
如果不指定为非特定端口,那么缺省在配置中的环境变量则为8848
,在同一台机器上运行三个节点会出现问题
运行Nacos
各节点运行即可
docker-compose -f /root/nacos-deploy/nacos1.yaml up -d
docker-compose -f /root/nacos-deploy/nacos2.yaml up -d
docker-compose -f /root/nacos-deploy/nacos3.yaml up -d
三个节点单独访问页面正常;通过代理访问正常;
注意:Web页面并没有使用到客户端,服务端gRPC调用服务,但是在程序中需要请求对应的端口,所以务必需要暴露出来,因为使用了非标准端口,那么在nginx做代理时就直接(伪装)映射成标准端口即可。
Nginx代理配置
此处仍然使用容器化方式运行。
配置nginx代理
mkdir /root/nacos-proxy-deploy
cat /root/nacos-proxy-deploy/nacos-nginx-proxy.yaml /root/nacos-check-healthy/nacos_check_status.py