第 9/15 天
引言
在微服务架构中,服务注册发现与配置管理是两大核心基础设施。Nacos(Naming and Configuration Service)是阿里巴巴开源的一站式服务发现与配置管理平台,融合了服务注册中心(如 Eureka)和配置中心(如 Spring Cloud Config)的能力。当我们将 Nacos 部署到 Kubernetes 集群,并使用 Ceph RBD 提供持久化存储时,便构建了一套高可用、可弹性扩展的微服务治理底座。
本篇是「Ceph+K8s 中间件实战」系列第 9 天,将完整讲解 Nacos 集群在 K8s 上的架构设计、Helm Chart 部署、Ceph RBD 持久化配置,以及登录验证与日常巡检命令。

设计架构
组件拓扑
Nacos 集群在 K8s 上的部署架构涉及以下组件:
| 组件 | 说明 | 数量 |
|---|---|---|
| Nacos Server | 服务注册发现 + 配置管理核心节点 | 3(集群模式) |
| Headless Service | 为 StatefulSet 提供稳定的 Pod DNS 解析 | 1 |
| ClusterIP Service | 为客户端提供负载均衡的访问入口 | 1 |
| MySQL(外部) | 存储配置数据,使用第 4 天部署的 MySQL 集群 | 复用 |
| Ceph RBD PVC | 每个 Nacos Pod 的本地数据与日志持久化 | 3 |
架构拓扑图(文字描述)
┌─────────────────────────────────────┐
│ Kubernetes Cluster │
│ │
微服务客户端 ──────▶ nacos-clusterip (ClusterIP:8848) │
│ │ │
│ ┌──────┼──────┐ │
│ ▼ ▼ ▼ │
│ nacos-0 nacos-1 nacos-2 │
│ (StatefulSet, RAFT Consensus) │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ PVC-0 PVC-1 PVC-2 ◀── Ceph RBD │
│ │ │
│ └──────────┬──────────┘ │
│ ▼ │
│ mysql-primary (复用Day 4) │
└─────────────────────────────────────┘
数据流向
- 服务注册:微服务客户端通过 nacos-clusterip Service 将自身注册到 Nacos 集群,请求被 Service 负载均衡到某一 Nacos Pod。
- 配置读取/写入:客户端通过 Nacos API 获取配置,Nacos 将配置数据持久化到外部 MySQL 集群。
- 集群同步:3 个 Nacos 节点通过 RAFT 协议进行配置数据同步,Leader 负责写入,Follower 同步数据。
- 本地持久化:每个 Nacos Pod 的日志、 derby 嵌入式数据库(集群模式下不使用)等本地数据通过 Ceph RBD PVC 持久化。
高可用机制
- RAFT 共识:3 节点 Nacos 集群,容忍 1 个节点故障。Leader 选举自动完成,无需人工干预。
- 存储高可用:Ceph RBD 提供多副本块存储,PVC 绑定到 Pod 后即使 Pod 重建,数据仍持久存在。
- MySQL 高可用:配置数据存储在第 4 天部署的 MySQL 集群中,具备副本集高可用能力。
- Pod 反亲和性:通过
podAntiAffinity将 3 个 Nacos Pod 调度到不同 K8s 节点,避免单节点故障导致集群不可用。 - StatefulSet 稳定网络:Headless Service 为每个 Pod 提供稳定的 DNS 名称(如
nacos-0.nacos-headless),RAFT 节点间通信依赖此稳定标识。
存储规划
| 存储用途 | 类型 | StorageClass | 大小 | 访问模式 |
|---|---|---|---|---|
| Nacos 日志/数据 | Ceph RBD | ceph-rbd-sc | 20Gi | ReadWriteOnce |
| MySQL(配置存储) | Ceph RBD | ceph-rbd-sc | 50Gi | ReadWriteOnce |
部署实战
前置准备
Nacos 集群模式依赖外部 MySQL 存储配置数据。我们复用第 4 天部署的 MySQL 集群,先创建 Nacos 专用数据库并初始化表结构。
# 1. 添加 Nacos 社区 Helm Chart 仓库
helm repo add nacos https://nacos-group.github.io/nacos-helm/
helm repo update
# 2. 确认 Ceph RBD StorageClass 可用
kubectl get storageclass
# 预期输出包含:ceph-rbd-sc (default)
MySQL 数据库初始化
在 MySQL 中创建 Nacos 数据库并导入官方初始化 SQL:
— 连接 MySQL 集群
— kubectl exec -it mysql-primary-0 — mysql -uroot -p
CREATE DATABASE IF NOT EXISTS nacos DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER IF NOT EXISTS 'nacos'@'%' IDENTIFIED BY 'Nacos@2026';
GRANT ALL PRIVILEGES ON nacos.* TO 'nacos'@'%';
FLUSH PRIVILEGES;
— 导入 Nacos 官方建表 SQL(从 nacos-group/nacos-docker 仓库获取)
— SOURCE /path/to/nacos-mysql.sql;
— 核心表:config_info, config_info_beta, config_info_tag, his_config_info 等
编写 values.yaml
创建 nacos-values.yaml,重点配置集群模式、外部 MySQL、Ceph RBD 持久化:
# nacos-values.yaml — Nacos 集群部署配置
# 基于社区 Chart: nacos-group/nacos
# 集群模式:3 节点
replicaCount: 3
# 环境变量配置
env:
– name: MODE
value: "cluster"
– name: PREFER_HOST_MODE
value: "hostname"
– name: SPRING_DATASOURCE_PLATFORM
value: "mysql"
# 外部 MySQL 连接(复用第4天部署的 MySQL 集群)
– name: MYSQL_SERVICE_HOST
value: "mysql-primary.default.svc.cluster.local"
– name: MYSQL_SERVICE_PORT
value: "3306"
– name: MYSQL_SERVICE_DB_NAME
value: "nacos"
– name: MYSQL_SERVICE_USER
value: "nacos"
– name: MYSQL_SERVICE_PASSWORD
value: "Nacos@2026"
# 集群节点列表(依赖 Headless Service 稳定 DNS)
– name: NACOS_SERVERS
value: >-
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
# 持久化存储 — Ceph RBD
persistence:
enabled: true
storageClass: ceph-rbd-sc
accessModes:
– ReadWriteOnce
size: 20Gi
# 资源限制
resources:
limits:
cpu: "2000m"
memory: "4Gi"
requests:
cpu: "1000m"
memory: "2Gi"
# Pod 反亲和性 — 确保 3 节点分布在不同 K8s 节点
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
– labelSelector:
matchLabels:
app: nacos
topologyKey: kubernetes.io/hostname
# Service 配置
service:
type: ClusterIP
port: 8848
# 健康检查
healthProbe:
enabled: true
livenessProbe:
httpGet:
path: /nacos/v1/console/health/liveness
port: 8848
initialDelaySeconds: 60
periodSeconds: 10
readinessProbe:
httpGet:
path: /nacos/v1/console/health/readiness
port: 8848
initialDelaySeconds: 30
periodSeconds: 10
Helm 部署
# 创建命名空间
kubectl create namespace middleware
# 使用社区 Helm Chart 部署 Nacos 集群
helm install nacos nacos/nacos
–namespace middleware
-f nacos-values.yaml
–version 1.0.0
# 查看部署状态
kubectl get pods -n middleware -l app=nacos -o wide
验证 Pod / Service / PVC 状态
# 查看 Pod 状态(等待全部 Running)
kubectl get pods -n middleware -o wide
# 预期输出:
# NAME READY STATUS RESTARTS AGE
# nacos-0 1/1 Running 0 2m
# nacos-1 1/1 Running 0 2m
# nacos-2 1/1 Running 0 2m
# 查看 Service
kubectl get svc -n middleware
# 查看 PVC(确认已绑定 Ceph RBD)
kubectl get pvc -n middleware
# 预期输出:
# NAME STATUS VOLUME CAPACITY STORAGECLASS
# data-nacos-0 Bound pvc-xxxx-xxxx 20Gi ceph-rbd-sc
# data-nacos-1 Bound pvc-yyyy-yyyy 20Gi ceph-rbd-sc
# data-nacos-2 Bound pvc-zzzz-zzzz 20Gi ceph-rbd-sc
# 查看 StatefulSet
kubectl get statefulset -n middleware
# 查看 Pod 详细事件(排查启动问题)
kubectl describe pod nacos-0 -n middleware
登录验证
访问 Nacos 控制台
# 端口转发到本地访问控制台
kubectl port-forward svc/nacos-headless -n middleware 8848:8848 &
# 浏览器访问:http://localhost:8848/nacos
# 默认账号:nacos / 默认密码:nacos
# 首次登录后请立即修改密码
# 路径:权限控制 → 用户管理 → 编辑 → 修改密码
API 验证集群状态
# 1. 检查集群节点状态(RAFT 成员列表)
curl -s "http://localhost:8848/nacos/v1/ns/operator/servers" | python3 -m json.tool
# 预期返回:包含 3 个节点的信息,其中 1 个为 LEADER,2 个为 FOLLOWER
# 2. 检查集群健康指标
curl -s "http://localhost:8848/nacos/v1/ns/operator/metrics" | python3 -m json.tool
# 3. 注册一个测试服务
curl -X POST "http://localhost:8848/nacos/v1/ns/instance?serviceName=test-service&ip=10.0.0.1&port=8080"
# 4. 查询已注册服务列表
curl -s "http://localhost:8848/nacos/v1/ns/catalog/services?pageNo=1&pageSize=10" | python3 -m json.tool
# 5. 发布一条测试配置
curl -X POST "http://localhost:8848/nacos/v1/cs/configs"
-d "dataId=test-config.yaml&group=DEFAULT_GROUP&content=app:n name: test-servicen port: 8080"
# 6. 获取配置内容
curl -s "http://localhost:8848/nacos/v1/cs/configs?dataId=test-config.yaml&group=DEFAULT_GROUP"
日常巡检
健康检查
# 1. Pod 运行状态巡检
kubectl get pods -n middleware -l app=nacos
# 2. 检查 RAFT Leader 是否正常
kubectl exec -n middleware nacos-0 —
curl -s http://localhost:8848/nacos/v1/ns/operator/servers | grep -o '"state":"[^"]*"'
# 3. 数据库连接检查
kubectl exec -n middleware nacos-0 —
curl -s "http://localhost:8848/nacos/v1/cs/configs?dataId=test-config.yaml&group=DEFAULT_GROUP" | head -c 100
# 4. PVC 存储状态巡检
kubectl get pvc -n middleware -o custom-columns=NAME:.metadata.name,STATUS:.status.phase,CAPACITY:.status.capacity.storage,STORAGECLASS:.spec.storageClassName
# 5. 查看事件(关注 Warning)
kubectl get events -n middleware –sort-by='.lastTimestamp' | tail -20
日志查看
# 查看 Nacos Pod 日志
kubectl logs -n middleware nacos-0 –tail=100
# 实时跟随日志
kubectl logs -n middleware nacos-0 -f
# 搜索错误日志
kubectl logs -n middleware nacos-0 | grep -i "error|exception|fail" | tail -20
# 查看所有 Nacos Pod 的关键日志
for i in 0 1 2; do
echo "=== nacos-$i ==="
kubectl logs -n middleware nacos-$i –tail=20
done
性能与容量监控
# 查看 Pod 资源使用情况(需 metrics-server)
kubectl top pods -n middleware
# 查看 PVC 使用容量
kubectl exec -n middleware nacos-0 — df -h /home/nacos/data
# Nacos 自带监控指标(可接入 Prometheus)
curl -s "http://localhost:8848/nacos/v1/ns/operator/metrics" | python3 -m json.tool
# 检查配置数量
curl -s "http://localhost:8848/nacos/v1/cs/configs?search=accurate&pageNo=1&pageSize=1" | python3 -m json.tool | grep -i count
常见问题
Q1: Nacos Pod 启动后一直处于 CrashLoopBackOff,日志报数据库连接失败怎么办?
A: 首先检查 MySQL Service 是否可从 Nacos Pod 内访问:kubectl exec -n middleware nacos-0 -- ping mysql-primary.default.svc.cluster.local。其次确认数据库 nacos 已创建且表结构已初始化。最后检查 MYSQL_SERVICE_PASSWORD 环境变量是否正确,注意密码中的特殊字符可能需要转义。
Q2: 3 个节点启动后集群一直无法选出 Leader 怎么办?
A: Nacos 集群模式依赖 Headless Service 提供的稳定 DNS 名称进行节点间通信。确认 NACOS_SERVERS 环境变量中的地址与 Headless Service 名称一致。使用 kubectl exec -n middleware nacos-0 -- nslookup nacos-1.nacos-headless 验证 DNS 解析正常。另外检查 PREFER_HOST_MODE 是否设置为 hostname。
Q3: 重启 Pod 后配置数据会丢失吗?
A: 不会。集群模式下,配置数据持久化在外部 MySQL 中(Ceph RBD 持久化),Nacos Pod 的 Ceph RBD PVC 仅保存日志等本地数据。即使 PVC 被删除,配置数据仍安全存储在 MySQL 中。不过建议 PVC 不要随意删除,保留日志有助于故障排查。
总结
本篇我们完成了 Nacos 注册配置中心在 K8s 上的集群部署,核心要点回顾:
- 架构设计:3 节点 RAFT 集群 + 外部 MySQL + Ceph RBD 持久化,实现了服务发现与配置管理的高可用。
- Helm 部署:使用
nacos-group/nacos社区 Chart,通过values.yaml配置集群模式、MySQL 连接、Ceph RBD StorageClass。 - 登录验证:通过 API 验证了集群节点状态、服务注册、配置发布等核心功能。
- 日常巡检:掌握了 Pod 状态、RAFT Leader、PVC 存储、日志查看、性能监控等巡检命令。
Nacos 作为微服务治理的核心组件,与 Ceph RBD 持久化存储和 MySQL 集群协同工作,为上层微服务应用提供了可靠的注册发现和配置管理能力。
下期预告
明天第 10 天,我们将部署 Zookeeper 集群——分布式协调服务的经典实现。Zookeeper 作为 Kafka、Nacos 等中间件的底层协调依赖,其集群部署和运维同样是 Ceph+K8s 中间件实战的重要一环。敬请期待!
系列目录
- 第 1 天:Ceph 分布式存储回顾与 K8s 存储体系概述 ✅ 已发布
- 第 2 天:K8s 接入 Ceph RBD 块存储(CSI Driver + StorageClass 配置实战) ✅ 已发布
- 第 3 天:K8s 接入 CephFS 共享文件存储(多读场景与性能调优) ✅ 已发布
- 第 4 天:K8s 部署 MySQL 高可用集群(Ceph RBD 持久化 + 架构设计 + 登录巡检) ✅ 已发布
- 第 5 天:K8s 部署 Redis Cluster 集群(Ceph RBD + 架构设计 + 巡检命令) ✅ 已发布
- 第 6 天:K8s 部署 Redis Sentinel 哨兵模式(高可用架构 + 登录验证) ✅ 已发布
- 第 7 天:K8s 部署 MinIO 对象存储集群(分布式架构 + 运维巡检) ✅ 已发布
- 第 8 天:K8s 部署 MongoDB 副本集集群(Ceph RBD + 架构设计 + 登录) ✅ 已发布
- 第 9 天:K8s 部署 Nacos 注册配置中心(集群架构 + 登录巡检) 📍 本文
- 第 10 天:K8s 部署 Zookeeper 集群(分布式协调架构 + 运维命令) 📅 即将发布
- 第 11 天:K8s 部署 Elasticsearch 集群(Ceph RBD + 架构设计 + 巡检) 📅 即将发布
- 第 12 天:K8s 部署 Kafka 集群(Ceph RBD + 消息队列架构 + 运维) 📅 即将发布
- 第 13 天:K8s 部署 GitLab 代码托管平台(Ceph RBD 持久化 + 架构 + 巡检) 📅 即将发布
- 第 14 天:K8s 部署 ClickHouse 列式数据库集群(Ceph RBD + 架构设计) 📅 即将发布
- 第 15 天:K8s 中间件统一监控与运维巡检总结(Prometheus + Grafana 全景) 📅 即将发布

















暂无评论内容