近期,在机器上部署了三个节点的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代理 | nginx: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
Nacos 2.2.4支持pg数据库适配改造
创建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 << EOF > /root/nacos-deploy/nacos1.yaml
对应内容写入
EOF
cat << EOF > /root/nacos-deploy/nacos2.yaml
对应内容写入
EOF
cat << EOF > /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 <<EOF > /root/nacos-proxy-deploy/nginx.conf
对应内容写入
EOF
- 代理容器yaml
cat > /root/nacos-proxy-deploy/nacos-nginx-proxy.yaml << EOF
对应内容写入
EOF
cd /root/nacos-proxy-deploy
# 容器运行
docker-compose -f nacos-proxy.yaml up -d
搭建完毕检查容器运行是否正常,需要测试实例服务注册是否正常
环境检查
mkdir /root/nacos-check-healthy -p
cat > /root/nacos-check-healthy/nacos_check_status.py << EOF
对应内容写入
EOF
研发云配
- 配置
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.error.include-message=ON_PARAM
server.port=${NACOS_APPLICATION_PORT:8848}
# k8s集群时候使用域名进行固定
nacos.inetutils.ip-address=${NACOS_INETUTILS_IP_ADDRESS:}
# 使用pg数据库配置
spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:postgresql}
db.num=${PG_DATABASE_NUM:1}
db.jdbcDriverName=${PG_SERVICE_DRIVER:org.postgresql.Driver}
db.url.0=jdbc:${SPRING_DATASOURCE_PLATFORM:postgresql}://${PG_SERVICE_HOST:localhost}:${PG_SERVICE_PORT:5432}/${PG_SERVICE_DB_NAME:strong_db}?currentSchema=${PG_CURRENT_SCHEMA:public}&tcpKeepAlive=true&reWriteBatchedInserts=true
db.user.0=${PG_SERVICE_USER:postgres}
db.password.0=${PG_SERVICE_PASSWORD:123456}
- 环境配置
这里是根据不同研发云环境进行不同配置
KeyValue.JVM_XMS=1g
KeyValue.JVM_XMX=1g
KeyValue.JVM_XMN=512m
KeyValue.JVM_MS=128m
KeyValue.JVM_MMS=320m
KeyValue.PREFER_HOST_MODE=ip
# 这里是针对pg如果使用mysql可以自行添加调整${PARAM_NAME:PARAM_DEF_VALUE}
KeyValue.SPRING_DATASOURCE_PLATFORM=postgresql
KeyValue.PG_SERVICE_HOST=192.168.xx.208
KeyValue.PG_SERVICE_PORT=5432
KeyValue.PG_SERVICE_USER=postgres
KeyValue.PG_SERVICE_PASSWORD=123456
KeyValue.PG_SERVICE_DB_NAME=strong_db
KeyValue.PG_CURRENT_SCHEMA=public
# 如果想使用单击MODE=standalone
KeyValue.MODE=cluster
# 集群配置
KeyValue.NACOS_SERVERS=nacos-node1.pigcloud.svc.cluster.local:8858 nacos-node2.pigcloud.svc.cluster.local:8858 nacos-node3.pigcloud.svc.cluster.local:8858
# 多网卡IP选择
KeyValue.NACOS_INETUTILS_IP_ADDRESS=nacos-node1.pigcloud.svc.cluster.local
常见问题
- 正常情况在某个节点注册了服务后会同步到其他节点。
- 各节点无法选举一个leader时
查看日志:/data/nacos2.2.4_1/logs/alipay-jraft.log
实例服务相关日志: /data/nacos2.2.4_1/naming-raft.log - 设置了代理转发务必将其暴露
通过日志发现,暴露8848端口是为了nacos客户端登陆获取Token,后续操作都会携带Token进行资源操作;然后暴露9848端口是客户端用于gRPC的请求,所以如果是设置了代理转发,务必将其暴露,否则连接失败掉线。
参考地址
-
Nacos部署环境
-
集群模式部署
-
github.com/alibaba/nacos/releases
-
Nacos 2.2.4支持pg数据库适配改造
-
pig技术指南v3