【Nacos】基于k8s容器化部署Nacos集群

news2024/11/27 22:30:48

近期,在机器上部署了三个节点的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的请求,所以如果是设置了代理转发,务必将其暴露,否则连接失败掉线。

参考地址

  • Nacos部署环境

  • 集群模式部署

  • github.com/alibaba/nacos/releases

  • Nacos 2.2.4支持pg数据库适配改造

  • pig技术指南v3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

制作文件间链接

制作文件间链接 管理文件间链接 硬/软链接 创建指向同一个文件的多个名称。 创建硬链接 从初始名称到文件系统的数据&#xff0c;每个文件都以一个硬链接开始。当创建指向文件的新硬链接时,也会创建另一个指向同一数据的名称。新硬链接与原始文件名作用相同。一经创建&…

Maya适合哪个工作站?

Autodesk Maya 提供多种功能&#xff0c;可以适应电影、游戏和建筑等不同行业的需求。定制的 Autodesk Maya 工作站可以帮助您提高行业领先的 3D 计算机动画、建模、模拟和渲染软件的工作效率和用户体验。 根据您的特定需求定制的快速、强大的工作站可以帮助您充分利用 Maya 工…

高薪Offer收割机之Redis分布式锁

锁在应用开发中使用非常广泛,哪些场景需要使用锁呢? 我们先来看抢购优惠卷的场景,代码如下: public void rushToPurchase() throws InterruptedException {//获取优惠券数量Integer num = (Integer) redisTemplate.opsForValue().get(“num”);//判断是否抢完if (null == n…

[Ipsc2009]Let there be rainbows!

Description HY Star是一个处处充满和谐&#xff0c;人民安居乐业的星球&#xff0c;但是HY Star却没有被评上宇宙文明星球&#xff0c;很大程度上是因为 星球的形象问题。HY Star由N个国家组成,并且在一些国家之间修建了道路以方便交流。由于HY Star是一个和谐的 星球&#x…

【运维】第04课:入口网关服务注册发现-Openrety 动态 uptream

本课时,我将带你一起了解入口网关服务的注册发现,并使用 OpenResty 实现一套动态 Upstream。 课前学习提示 基于本课时我们将要学习的内容,我建议你课前先了解一下 Nginx 的基础,同时熟悉基础的 Lua 语言语法,另外再回顾一下 HTTP 的请求过程,对于 Nginx 的负载均衡基本…

按键控制流水灯方向——FPGA

文章目录 前言一、按键二、系统设计1、模块框图2、RTL视图 三、源码四、效果五、总结六、参考资料 前言 环境&#xff1a; 1、Quartus18.0 2、vscode 3、板子型号&#xff1a;EP4CE6F17C8 要求&#xff1a; 按键1按下&#xff0c;流水灯从右开始向左开始流动&#xff0c;按键2按…

习题-Java网络编程

目录 1.TCP-对象 2.UDP​​​​​​​​​​​​​​ 1.TCP-对象 利用TCP传输对象信息&#xff0c;需要对对象进行实例化 User类&#xff1a; package dh09.demo02;import java.io.Serializable;public class User implements Serializable {private String name;private St…

高并发的哲学原理(九)-- 细数四代分布式数据库并拆解

高并发的哲学原理&#xff08;九&#xff09;-- 细数四代分布式数据库并拆解 TiDB 和 OceanBase&#xff08;主从、中间件、KV、计算与存储分离、列存储、CAP定理&#xff09; 本文大约 15000 字&#xff0c;阅读需要 50 分钟。 上一篇文章啃硬骨头差点把我牙给崩了&#xff0c…

提升C++操作Json的开发效率

一、背景 在C项目开发中&#xff0c;不同的服务之间会定义通讯接口&#xff0c;接口格式定义中的通讯数据往往是json格式的。为了快速开发&#xff0c;我的需求如下&#xff1a; 1.定义好通讯接口后&#xff0c;就定义好了交互的json内容格式。我希望有工具可以一键将json内容…

x86架构ubuntu18下运行PS模拟器ePSXe

0. 环境 i7 虚拟机ubuntu18&#xff08;ubuntu22不行&#xff0c;会提示CURL_OPENSSL_3 not found&#xff09; 1. 安装依赖 sudo apt-get install libsdl-ttf2.0-0 sudo apt-get install libcurl3 2. 获取可执行文件 mkdir ePSXe cd ePSXe wget http://www.epsxe.com/files/…

MAYA精灵粒子一

group1.rotateYframe*10; particleShape1.spriteTwistPPrand(-90,90); 少 一个

Debug工具Trace32的ARM内存访问类型详解

关于Trace32的访问类型的基本概念可以参考博文&#xff1a; Trace32使用教程-访问类型&#xff08;Access Class&#xff09;_SOC罗三炮的博客-CSDN博客 本文将以ARMv8为基础&#xff0c;详解Trace32的内存访问类型。 内存访问类型描述A绝对寻址(物理地址)&#xff0c;即绕过…

实现复杂的按钮动画

今天主要是实现一个复杂的按钮提交动画效果&#xff0c;具体的关键变形环节如下&#xff1a; 初始环节 加载环节 展示结果环节 代码实现过程 1、html 页面机构 <button class"btn" data-btn>Submit</button> <div class"check_box">&…

初级与高级软件测试工程师的差距体现在哪些方面?如何成为高级测试工程师?

目录 初级测试工程师和高级测试工程师有什么区别或者差距呢&#xff1f; 一、不断的钻研 二、向同行或者他人学习 三、团队合作是更宽广的提升途径 四、了解你的客户和团队成员 软件测试工程师发展规划路线 我们都在努力追求卓越&#xff1a;希望在我们选择的职业中出类拔…

html2canvas将document DOM节点转换为图片,并下载到本地

html2canvas - Screenshots with JavaScripthttps://html2canvas.hertzen.com/了解一下&#xff0c;安装先 npm install --save html2canvas 用到的知识包括 前端用原生js编辑文件内容→创建生成文件(格式可以自定义)→下载文件_你挚爱的强哥的博客-CSDN博客会自动创建一个h…

服务器使用UDP通讯127.0.0.1测试成功连接服务器却通讯失败

首先看看本人情况 解释一下&#xff1a; 1&#xff1a;左边窗口是模拟服务程序&#xff0c;功能是收到消息后把消息打印出来&#xff0c;并把收到的消息再发回给发送消息的主机 2&#xff1a;右边窗口是模拟客户程序&#xff0c;功能是将输入的消息发送给服务程序的主机&…

【多线程例题】顺序打印abc线程

顺序打印-进阶版 方法一&#xff1a;三个线程竞争同一个锁&#xff0c;通过count判断是否打印 方法二&#xff1a;三个线程同时start&#xff0c;分别上锁&#xff0c;从a开始&#xff0c;打印后唤醒b 三个线程分别打印A&#xff0c;B&#xff0c;C 方法一&#xff1a;通过co…

前端笔记_OAuth规则机制下实现个人站点接入qq三方登录

文章目录 ⭐前言⭐qq三方登录流程&#x1f496;qq互联中心创建网页应用&#x1f496;配置回调地址redirect_uri&#x1f496;流程分析 ⭐思路分解⭐技术选型实现&#x1f496;技术选型&#xff1a;&#x1f496;实现 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本…

4.3.tensorRT基础(1)-实现模型的推理过程

目录 前言1. inference案例总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 基础-实现模型的推理过程 课程大纲可…

深度学习——LSTM解决分类问题

RNN基本介绍 概述 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种深度学习模型&#xff0c;主要用于处理序列数据&#xff0c;如文本、语音、时间序列等具有时序关系的数据。 核心思想 RNN的关键思想是引入了循环结构&#xff0c;允许…