近期,在机器上部署了三个节点的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)基础上,进行一定偏移量自动生成。来源:集群模式部署

端口与主端口的偏移量描述
88480主端口,客户端、控制台及OpenAPI所使用的HTTP端口
98481000客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
98491001服务端gRPC请求服务端端口,用于服务间同步等
7848-1000Jraft请求服务端端口,用于处理服务端间的Raft相关请求

使用VIP/nginx请求时,需要配置成TCP转发,不能配置http2转发,否则连接会被nginx断开。9849和7848端口为服务端之间的通信端口,请勿暴露到外部网络环境和客户端测。
在这里插入图片描述

按照上述官方的端口分配要求,此处部署的使用三台服务器上面创建的Nacos集群端口分配如下:

节点IP端口(所需暴露)备注版本当前线下环境部署文件路径
nacos-node1192.168.xx.201宿主机:8858,9858,9859,7858
容器:8858,9858,9859,7858
Nacos 节点一nacos/nacos-server:2.2.4/root/nacos-deploy/
nacos-node2192.168.xx.202宿主机:8858,9858,9859,7858
容器:8858,9858,9859,7858
Nacos 节点二nacos/nacos-server:2.2.4/root/nacos-deploy/
nacos-node3192.168.xx.203宿主机:8858,9858,9859,7858
容器:8858,9858,9859,7858
Nacos 节点三nacos/nacos-server:2.2.4/root/nacos-deploy/
Nacos DB Mysql192.168.xx.206宿主机:3306 容器:3306Nacos数据库mysql:5.7.34/root/nacos-db-deploy
Nacos DB Postgres192.168.xx.206宿主机:5432 容器:5432Nacos数据库postgres:12-alpine/root/nacos-db-deploy
Nacos Nginx Proxy192.168.xx.208宿主机:80 容器:80Nacos代理nginx:1.23.2/root/nacos-proxy-deploy
Nacos Cheak Health192.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的请求,所以如果是设置了代理转发,务必将其暴露,否则连接失败掉线。

参考地址

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐