尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

kubeasz 部署 Nacos 2.4.x 集群:基于 MySQL 持久化与 Peer-Finder 插件的完整指南

kubeasz 部署 Nacos 2.4.x 集群:基于 MySQL 持久化与 Peer-Finder 插件的完整指南 kubeasz 部署 Nacos 2.4.x 集群基于 MySQL 持久化与 Peer-Finder 插件的完整指南【免费下载链接】kubeasz使用Ansible脚本安装K8S集群介绍组件交互原理方便直接不受国内网络环境影响项目地址: https://gitcode.com/GitHub_Trending/ku/kubeasz本篇指南基于 kubeasz 仓库中 roles/cluster-addon/templates/nacos/ 目录下的部署资源讲解如何在 kubeasz 搭建的 Kubernetes 集群中以 Helm Chart 方式部署 Nacos 配置中心/注册中心覆盖前置依赖准备、单机与集群两种拓扑、MySQL 初始化机制、集群成员发现原理、控制台访问与常见验证方法。读完本文你将能够基于 kubeasz 的 addon 模板独立完成一套基于 MySQL 持久化存储的 Nacos 集群的部署与巡检。一、部署总览与前置准备在 kubeasz 中Nacos 作为集群 addon 被收录在 roles/cluster-addon/templates/nacos/ 目录下其主体是一个名为nacos的 Helm Chart详见 Chart.yamlappVersion: 2.4.3同时 roles/cluster-addon/tasks/nacos.yml 提供了基于kubectl apply的部署任务封装。Nacos 官方推荐在生产环境使用 MySQL 存储配置数据因此本模板的部署路径遵循外部 MySQL StatefulSet 无头服务Headless Service的模式整个部署依赖如下两个前置条件创建 OpenEBS 提供动态 PVC 存储Nacos 本身将状态存于 MySQL不直接依赖本地磁盘但本文所述的 MySQL 初始化与集群编排依赖 Kubernetes 动态存储能力。kubeasz 中 OpenEBS 的部署入口为 roles/cluster-addon/tasks/openebs.yml安装参数由openebs_install yes控制。安装 MySQL 数据库并准备初始化建表语句Nacos 2.x 的元数据配置、用户、权限、租户容量等全部落在 MySQL 中初始化 SQL 由模板内置详见下文MySQL 初始化机制一节。说明在 roles/cluster-addon/tasks/main.yml 中nacos.yml的导入目前处于注释状态#- import_tasks: nacos.yml即 Nacos 未默认随集群 addon 一起安装。若需启用可参考该文件中其他 addon 的写法取消注释并通过变量nacos_install yes控制安装时机。本文后续内容以 Chart 模板本身为核心展开。二、Chart 结构与关键参数解析Chart 的目录结构如下roles/cluster-addon/templates/nacos/chart/ ├── Chart.yaml ├── values.yaml └── templates/ ├── cluster.yaml # 集群版 StatefulSetapp.topology cluster ├── standalone.yaml # 单机版 StatefulSetapp.topology standalone ├── svc.yaml # Headless Service NodePort 控制台 Service ├── configmap.yaml # MySQL 初始化脚本 init.sql └── ingress.yaml # 可选 Ingress默认关闭values.yaml 是整个部署的总开关参数分为四组参数默认值说明global.mysql.hostsemisync-mysql-cluster-mysql.db.svcMySQL 服务地址模板内置值指向 kubeasz 示例中的 MySQL 集群 Headless Serviceglobal.mysql.port3306MySQL 端口global.mysql.user/global.mysql.passwordxxx/X8xxxxxxMySQL 账号密码占位符部署前必须替换mysql.databasenacosconfigNacos 使用的数据库名init 容器会自动创建app.topologystandalone拓扑模式standalone单机版或cluster集群版app.replicas3仅集群版有效Nacos 节点副本数app.repositorynacos/nacos-serverNacos 镜像仓库名app.tagv2.4.3Nacos 镜像版本标签app.resources.limitscpu: 1,memory: 4Gi容器资源上限app.resources.requestscpu: 500m,memory: 2Gi容器资源申请ingress.enablefalse是否启用 Ingress 暴露控制台ingress.hostIngress 域名从模板实际渲染逻辑cluster.yaml 与 standalone.yaml 分别以eq .Values.app.topology cluster/standalone为条件可以看出两种拓扑共用同一套渲染骨架区别仅在于副本数、是否注入集群成员变量以及MODE环境变量。三、核心机制一init 容器自动完成 MySQL 初始化这是本模板最有价值的自动化设计不需要人工手工导入官方建表 SQL而是由一个 init 容器在 Pod 启动前自动完成等待数据库 → 创建库 → 幂等初始化三步。以 cluster.yaml 中的init-mysql容器为例其执行逻辑为set -o errexit echo 等待数据库就绪 until mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -e show databases /dev/null; do sleep 5; done echo 创建数据库 mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -e create database if not exists $DB_NAME echo 检查是否已初始化 mysql -h $DB_HOST -P $DB_PORT -u $DB_USER $DB_NAME -e select count(1) from permissions \ { echo 已初始化跳过.; exit 0; } echo 未初始化执行初始化脚本... mysql -h $DB_HOST -P $DB_PORT -u $DB_USER $DB_NAME /scripts/init.sql echo 初始化成功关键点拆解幂等性以permissions表是否存在为判据已初始化则直接跳过保证 StatefulSet 滚动重启或节点重建时不会重复建表报错健壮性until ... do sleep 5循环等待 MySQL 就绪解决 Pod 启动早于数据库就绪的时序问题数据来源初始化脚本由 configmap.yaml 生成的 ConfigMapmysql-nacos-script以 volume 形式挂载到/scripts/init.sql且该 ConfigMap 标记为immutable: true账号注入MySQL 密码通过环境变量MYSQL_PWD传入避免明文出现在命令行参数中。初始化脚本内容即为 Nacos 2.x 官方 MySQL Schema 的完整实现主要表结构包括表名用途config_info配置主表含data_id/group_id/tenant_id唯一键config_info_aggr聚合配置子数据表config_info_betaBeta 灰度配置表config_info_tag配置标签表config_tags_relation配置与标签关联表group_capacity/tenant_capacity分组/租户容量配额表his_config_info配置变更历史表tenant_info租户信息表users/roles/permissions用户、角色、权限表Nacos 2.x 鉴权体系脚本末尾预置了两个初始化账号INSERT INTO users (username, password, enabled) values (aaa, $2a$10$ibAJ0f1/PzuPBYQ36P4q9.nTmTSDxiy/DnDCpNph37r.moI/8TFde, 1); INSERT INTO users (username, password, enabled) VALUES (nacos, $2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu, TRUE); INSERT INTO roles (username, role) VALUES (nacos, ROLE_ADMIN);即内置了管理员用户nacosBCrypt 加密口令对应密码为Nacos1234!与角色ROLE_ADMIN这正是首次登录初始化设置的数据库层面来源。四、核心机制二集群版 Peer-Finder 成员发现集群版topology: cluster通过 Kubernetes Headless Service 主机名hostname模式实现 Nacos 节点间的相互发现原理如下无头服务提供稳定 DNS 记录svc.yaml 中定义了nacos-headlessServiceclusterIP: None并设置publishNotReadyAddresses: true——该选项保证 Pod 尚未 Ready 时 DNS 也能解析从而让所有成员在启动阶段就能互相发现StatefulSet 提供稳定序号主机名Pod 命名为nacos-0、nacos-1、nacos-2配合serviceName: nacos-headless每个 Pod 获得形如nacos-0.nacos-headless.namespace.svc.cluster.local的完整域名注入集群成员清单模板将三个成员地址硬编码注入环境变量NACOS_SERVERSnacos-0.nacos-headless.default.svc.cluster.local:8848 nacos-1.nacos-headless.default.svc.cluster.local:8848 nacos-2.nacos-headless.default.svc.cluster.local:8848同时设置PREFER_HOST_MODEhostname、SERVICE_NAMEnacos-headless、DOMAIN_NAMEcluster.local、POD_NAMESPACE取自metadata.namespace使 Nacos 以 hostname 而非 IP 进行节点间通信规避 Pod IP 漂移导致的集群失联问题。部署完成后可以用原文档提供的验证命令逐一检查三个副本的成员配置是否一致for i in 0 1 2; do echo nacos-$i; kubectl exec nacos-$i -- cat conf/cluster.conf; done预期输出对应 readme.md 中的实测结果nacos-0 Defaulted container nacos out of: nacos, peer-finder-plugin-install (init) #2025-07-22T17:12:41.878 nacos-0.nacos-headless.default.svc.cluster.local:8848 nacos-1.nacos-headless.default.svc.cluster.local:8848 nacos-2.nacos-headless.default.svc.cluster.local:8848 nacos-1 Defaulted container nacos out of: nacos, peer-finder-plugin-install (init) #2025-07-22T17:12:53.913 nacos-0.nacos-headless.default.svc.cluster.local:8848 nacos-1.nacos-headless.default.svc.cluster.local:8848 nacos-2.nacos-headless.default.svc.cluster.local:8848 nacos-2 Defaulted container nacos out of: nacos, peer-finder-plugin-install (init) #2025-07-22T17:12:57.963 nacos-0.nacos-headless.default.svc.cluster.local:8848 nacos-1.nacos-headless.default.svc.cluster.local:8848 nacos-2.nacos-headless.default.svc.cluster.local:8848从输出中可以看到每个 nacos Pod 都包含两个容器nacos主容器与peer-finder-plugin-installinit 容器。其中peer-finder是 nacos-group 提供的集群成员发现插件用于在 Pod 启动时根据NACOS_SERVERS环境变量动态生成conf/cluster.conf注意不同副本的cluster.conf生成时间戳不同如17:12:41、17:12:53、17:12:57说明各 Pod 是各自独立完成配置生成后加入集群的。该机制参考了 nacos-group/nacos-k8s 社区 Wiki 中使用 peer-finder 扩容插件的做法原始链接已列入 readme.md 参考章节本仓库仅作部署实现不引入外部依赖。五、核心机制三端口规划与服务暴露5.1 端口语义Nacos 2.x 引入了 gRPC 通信模板在 cluster.yaml 中暴露了四个端口语义如下端口名称用途8848client-port主端口HTTP 控制台与配置/注册 API9848client-rpc客户端 gRPC 长连接端口主端口10009849raft-rpc集群节点间 gRPC 通信端口主端口10017848old-raft-rpc兼容旧版本节点间的 Raft 通信端口主端口-1000单机版 standalone.yaml 暴露的端口与集群版完全一致便于在两种拓扑间平滑切换。5.2 服务类型svc.yaml 同时定义了两个 Servicenacos-headlessClusterIP: None供集群内部节点发现使用四端口全部映射nacos-consoleNodePort仅映射 8848供集群外部访问控制台即http://${nodeIp}:${nodePort}/nacos。5.3 可选 Ingress 暴露若希望以域名方式访问控制台可在 values 中设置ingress.enable: true与ingress.host。模板 ingress.yaml 会生成一条基于ingressClassName: nginx的 Ingress 规则路径/nacospathType: Prefix后端nacos-console服务 8848 端口注解ingress.kubernetes.io/proxy-body-size: 0取消请求体大小限制便于发布大体积配置使用 Ingress 方式时需确保集群已部署 ingress-nginxkubeasz 中由ingress_nginx_install变量控制见 roles/cluster-addon/tasks/ingress-nginx.yml。六、单机版与集群版的选择与差异两种拓扑由app.topology一个参数切换部署骨架高度一致差异集中在以下几点对比项standaloneclusterreplicas固定 1取app.replicas默认 3环境变量MODEstandalone不设置默认集群模式NACOS_REPLICAS1{{ replicas }}NACOS_SERVERS不注入注入三节点地址清单反亲和podAntiAffinity无requiredDuringSchedulingIgnoredDuringExecution按kubernetes.io/hostname强制打散到不同节点适用场景测试、低可用性要求生产、高可用集群版在 cluster.yaml 中配置了强制 Pod 反亲和requiredDuringSchedulingIgnoredDuringExecution配合topologyKey: kubernetes.io/hostname保证三个 Nacos 副本调度到不同的物理节点/主机避免单节点故障导致整个集群不可用。单机版则没有该约束。七、控制台访问与初始账号部署完成后通过 NodePort 方式访问控制台http://${nodeIp}:${nodePort}/nacos其中${nodeIp}为任一集群节点 IP${nodePort}为nacos-consoleService 自动分配的 NodePort可用kubectl get svc nacos-console查询。首次登录使用内置管理员账号用户名nacos密码Nacos1234!首次登录时初始化设置该账号及ROLE_ADMIN角色由 init.sql 预置见 configmap.yaml 末尾的INSERT INTO users/INSERT INTO roles语句因此只要数据库初始化成功即可使用该账号登录。八、部署验证 Checklist按以下顺序完成部署后的验收Pod 状态kubectl get pod -n default | grep nacos三个副本均应为Running且READY 1/1成员配置一致性执行上文for i in 0 1 2; do ... cat conf/cluster.conf; done确认三个副本的成员清单均为三节点完整地址数据库初始化登录 MySQL 检查nacosconfig库应存在config_info、users、roles、permissions等核心表控制台登录访问http://${nodeIp}:${nodePort}/nacos使用nacos/Nacos1234!登录成功服务注册验证在控制台服务管理中注册一个临时服务确认可在三个节点间正常同步。九、与 kubeasz 生态的集成方式作为 kubeasz 集群 addon 的一部分Nacos 与其他 addon如 kubeblocks 中托管的 MySQL 集群、ingress-nginx 网关、openebs 存储可以组合成完整的微服务基础设施存储层MySQL 可选用 kubeblocks 模板 中的semisync-mysql-cluster这也是 values.yaml 中global.mysql.host默认值semisync-mysql-cluster-mysql.db.svc的由来实现MySQL 半同步集群 Nacos 配置集群的高可用组合入口层控制台可叠加 ingress-nginx 或 higress 网关以域名方式对外提供/nacos路径调度集成参考 roles/cluster-addon/tasks/nacos.yml 的写法渲染模板 → 创建命名空间 →kubectl apply可将 Nacos 无缝纳入 kubeasz 的07.cluster-addon.ymlplaybook 执行流程。从源码结构看当前版本将 Nacos 部署任务在 roles/cluster-addon/tasks/main.yml 中注释掉推测是为避免默认安装带来的资源占用如需启用可参照注释中nacos_install yes的条件判断自行开启。这也意味着 Nacos 更多是作为按需启用的 addon存在部署前请务必先确认 MySQL 与存储类OpenEBS已就绪。【免费下载链接】kubeasz使用Ansible脚本安装K8S集群介绍组件交互原理方便直接不受国内网络环境影响项目地址: https://gitcode.com/GitHub_Trending/ku/kubeasz创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表