Ceph+K8s 中间件实战 | 第 9 天:K8s 部署 Nacos 注册配置中心(集群架构 + 登录巡检)

第 9/15 天

引言

在微服务架构中,服务注册发现与配置管理是两大核心基础设施。Nacos(Naming and Configuration Service)是阿里巴巴开源的一站式服务发现与配置管理平台,融合了服务注册中心(如 Eureka)和配置中心(如 Spring Cloud Config)的能力。当我们将 Nacos 部署到 Kubernetes 集群,并使用 Ceph RBD 提供持久化存储时,便构建了一套高可用、可弹性扩展的微服务治理底座。

本篇是「Ceph+K8s 中间件实战」系列第 9 天,将完整讲解 Nacos 集群在 K8s 上的架构设计、Helm Chart 部署、Ceph RBD 持久化配置,以及登录验证与日常巡检命令。

K8s Logo

设计架构

组件拓扑

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) │

└─────────────────────────────────────┘

数据流向

  1. 服务注册:微服务客户端通过 nacos-clusterip Service 将自身注册到 Nacos 集群,请求被 Service 负载均衡到某一 Nacos Pod。
  2. 配置读取/写入:客户端通过 Nacos API 获取配置,Nacos 将配置数据持久化到外部 MySQL 集群。
  3. 集群同步:3 个 Nacos 节点通过 RAFT 协议进行配置数据同步,Leader 负责写入,Follower 同步数据。
  4. 本地持久化:每个 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 上的集群部署,核心要点回顾:

  1. 架构设计:3 节点 RAFT 集群 + 外部 MySQL + Ceph RBD 持久化,实现了服务发现与配置管理的高可用。
  2. Helm 部署:使用 nacos-group/nacos 社区 Chart,通过 values.yaml 配置集群模式、MySQL 连接、Ceph RBD StorageClass。
  3. 登录验证:通过 API 验证了集群节点状态、服务注册、配置发布等核心功能。
  4. 日常巡检:掌握了 Pod 状态、RAFT Leader、PVC 存储、日志查看、性能监控等巡检命令。

Nacos 作为微服务治理的核心组件,与 Ceph RBD 持久化存储和 MySQL 集群协同工作,为上层微服务应用提供了可靠的注册发现和配置管理能力。

下期预告

明天第 10 天,我们将部署 Zookeeper 集群——分布式协调服务的经典实现。Zookeeper 作为 Kafka、Nacos 等中间件的底层协调依赖,其集群部署和运维同样是 Ceph+K8s 中间件实战的重要一环。敬请期待!

系列目录

  1. 第 1 天:Ceph 分布式存储回顾与 K8s 存储体系概述 ✅ 已发布
  2. 第 2 天:K8s 接入 Ceph RBD 块存储(CSI Driver + StorageClass 配置实战) ✅ 已发布
  3. 第 3 天:K8s 接入 CephFS 共享文件存储(多读场景与性能调优) ✅ 已发布
  4. 第 4 天:K8s 部署 MySQL 高可用集群(Ceph RBD 持久化 + 架构设计 + 登录巡检) ✅ 已发布
  5. 第 5 天:K8s 部署 Redis Cluster 集群(Ceph RBD + 架构设计 + 巡检命令) ✅ 已发布
  6. 第 6 天:K8s 部署 Redis Sentinel 哨兵模式(高可用架构 + 登录验证) ✅ 已发布
  7. 第 7 天:K8s 部署 MinIO 对象存储集群(分布式架构 + 运维巡检) ✅ 已发布
  8. 第 8 天:K8s 部署 MongoDB 副本集集群(Ceph RBD + 架构设计 + 登录) ✅ 已发布
  9. 第 9 天:K8s 部署 Nacos 注册配置中心(集群架构 + 登录巡检) 📍 本文
  10. 第 10 天:K8s 部署 Zookeeper 集群(分布式协调架构 + 运维命令) 📅 即将发布
  11. 第 11 天:K8s 部署 Elasticsearch 集群(Ceph RBD + 架构设计 + 巡检) 📅 即将发布
  12. 第 12 天:K8s 部署 Kafka 集群(Ceph RBD + 消息队列架构 + 运维) 📅 即将发布
  13. 第 13 天:K8s 部署 GitLab 代码托管平台(Ceph RBD 持久化 + 架构 + 巡检) 📅 即将发布
  14. 第 14 天:K8s 部署 ClickHouse 列式数据库集群(Ceph RBD + 架构设计) 📅 即将发布
  15. 第 15 天:K8s 中间件统一监控与运维巡检总结(Prometheus + Grafana 全景) 📅 即将发布
微信二维码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像 - 恒星
欢迎您留下宝贵的见解!
提交
头像 - 恒星

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容