随着国产化进程的加速,鲲鹏(ARM架构)服务器在企业级应用中越来越广泛。Nacos 作为动态服务发现和配置管理的核心组件,是构建云原生应用的基础设施。本文将带领大家在华为鲲鹏服务器上搭建的Kubernetes集群中,一步步部署一个高可用的 Nacos 集群。
1. 部署规划与环境准备
在开始部署之前,我们需要对本次实践做一个整体规划。
1.1 部署架构
本次部署采用 StatefulSet + Headless Service 的组合方式。这是因为 Nacos 属于有状态应用,需要稳定的网络标识符和持久化存储。StatefulSet 为每个 Pod 提供有序的、唯一的网络标识(如 nacos-0.nacos-headless),这是 Nacos 节点间进行集群发现的基楚 。
1.2 环境信息
- 服务器架构:鲲鹏 920 (ARM64)
- 操作系统:openEuler 22.03 LTS / KylinOS V10 (ARM版)
- Kubernetes 版本:v1.23+
- Nacos 版本:v2.4.2.1 (需选择支持 ARM64 的镜像)
- 数据库:MySQL 5.7 (独立部署或使用云服务)
- 存储:NFS 或 Ceph (提供持久化存储)
2. 前置条件准备
2.1 确认鲲鹏架构兼容性
首先,确保你的 K8s 节点均为鲲鹏服务器。通过以下命令确认节点 CPU 架构:
bash
或者登录节点查看:
bash
2.2 准备持久化存储
Nacos 需要存储数据。这里我们假设集群中已配置了 NFS 作为默认的 StorageClass。
如果还没有,可以参考官方文档先部署 NFS Provisioner。
2.3 初始化 MySQL 数据库
Nacos 集群模式需要 MySQL 作为数据中心(替代内置的 Derby),以保证数据一致性。
- 创建数据库:登录 MySQL,创建
nacos 数据库。 - sql
- 导入 SQL 脚本:获取 Nacos 官方提供的 MySQL 初始化脚本 。
- bash
- 然后将脚本导入数据库:
- bash
3. 在鲲鹏 K8s 集群部署 Nacos
3.1 创建命名空间
为了方便管理,我们创建一个独立的命名空间。
yaml
bash
3.2 配置 Headless Service
Headless Service 用于 Pod 的网络标识解析。
yaml
3.3 部署 Nacos StatefulSet
这是最核心的一步。需要注意环境变量中关于数据库的配置以及 Nacos 集群地址的填写 。
关键点:镜像选择 nacos/nacos-server:2.4.2.1,该版本官方已支持 linux/arm64。如果镜像拉取失败,可以提前拉取到本地或使用私有镜像仓库。
yaml
注意:NACOS_SERVERS 中的域名格式为 {podName}.{serviceName}.{namespace}.svc.cluster.local,这是 K8s 集群内部的 DNS 解析规则 。
3.4 创建访问 Service
为了方便集群内部访问,可以创建一个普通的 ClusterIP 服务。如果需要从集群外部访问,可以创建 NodePort 或 LoadBalancer 类型。
yaml
4. 部署与验证
4.1 应用配置
依次应用上述 YAML 文件。
bash
4.2 查看部署状态
监控 Pod 启动过程:
bash
当三个 Pod 都处于 Running 状态且就绪后,查看日志确认启动成功:
bash
日志中出现 Nacos started successfully 即表示启动成功。
4.3 访问 Nacos 控制台
获取节点 IP 和映射的端口:
bash
在浏览器中访问 http://任意节点IP:30048/nacos,默认账号密码均为 nacos 。
登录后进入“集群管理”,可以看到三个节点均以 UP 状态加入集群,至此部署完成。
5. 踩坑与优化
5.1 镜像架构问题
- 问题:早期版本的 Nacos 镜像(如 1.x)可能不支持 ARM64,会导致 Pod 启动时
exec format error。 - 解决:务必使用 v2.2.3 及以上版本 的镜像,官方从 2.2 版本左右开始提供多架构镜像。建议直接使用 v2.4+。
5.2 数据库连接
- 问题:Nacos 节点无法连接到外部的 MySQL。
- 解决:检查网络策略和防火墙。如果 MySQL 在 K8s 集群外,需要确保节点能访问 MySQL 端口;如果 MySQL 也在 K8s 集群内,确保
MYSQL_SERVICE_HOST 指向正确的 Service 名称。
5.3 存储性能
- 优化:对于生产环境,不建议使用本地盘或性能较差的 NFS。在鲲鹏服务器上,可以配合使用高性能的云硬盘或分布式存储(如 Ceph)来保证 Nacos 的写性能。
随着国产化进程的加速,鲲鹏(ARM架构)服务器在企业级应用中越来越广泛。Nacos 作为动态服务发现和配置管理的核心组件,是构建云原生应用的基础设施。本文将带领大家在华为鲲鹏服务器上搭建的Kubernetes集群中,一步步部署一个高可用的 Nacos 集群。
1. 部署规划与环境准备
在开始部署之前,我们需要对本次实践做一个整体规划。
1.1 部署架构
本次部署采用
StatefulSet + Headless Service的组合方式。这是因为 Nacos 属于有状态应用,需要稳定的网络标识符和持久化存储。StatefulSet 为每个 Pod 提供有序的、唯一的网络标识(如nacos-0.nacos-headless),这是 Nacos 节点间进行集群发现的基楚 。1.2 环境信息
2. 前置条件准备
2.1 确认鲲鹏架构兼容性
首先,确保你的 K8s 节点均为鲲鹏服务器。通过以下命令确认节点 CPU 架构:
bash
或者登录节点查看:
bash
2.2 准备持久化存储
Nacos 需要存储数据。这里我们假设集群中已配置了 NFS 作为默认的 StorageClass。
如果还没有,可以参考官方文档先部署 NFS Provisioner。
2.3 初始化 MySQL 数据库
Nacos 集群模式需要 MySQL 作为数据中心(替代内置的 Derby),以保证数据一致性。
nacos数据库。3. 在鲲鹏 K8s 集群部署 Nacos
3.1 创建命名空间
为了方便管理,我们创建一个独立的命名空间。
yaml
bash
3.2 配置 Headless Service
Headless Service 用于 Pod 的网络标识解析。
yaml
# nacos-headless.yaml apiVersion: v1 kind: Service metadata: name: nacos-headless namespace: nacos labels: app: nacos spec: ports: - port: 8848 name: server targetPort: 8848 - port: 9848 name: client-rpc targetPort: 9848 - port: 9849 name: raft-rpc targetPort: 9849 clusterIP: None selector: app: nacos3.3 部署 Nacos StatefulSet
这是最核心的一步。需要注意环境变量中关于数据库的配置以及 Nacos 集群地址的填写 。
关键点:镜像选择
nacos/nacos-server:2.4.2.1,该版本官方已支持linux/arm64。如果镜像拉取失败,可以提前拉取到本地或使用私有镜像仓库。yaml
# nacos-statefulset.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: nacos namespace: nacos spec: serviceName: nacos-headless replicas: 3 selector: matchLabels: app: nacos template: metadata: labels: app: nacos spec: containers: - name: nacos image: nacos/nacos-server:v2.4.2.1 resources: requests: memory: "2Gi" cpu: "1" limits: memory: "4Gi" cpu: "2" ports: - containerPort: 8848 name: server - containerPort: 9848 name: client-rpc - containerPort: 9849 name: raft-rpc env: - name: NACOS_MODE value: "cluster" # 集群节点地址配置 (关键) - name: NACOS_SERVERS value: "nacos-0.nacos-headless.nacos.svc.cluster.local:8848 nacos-1.nacos-headless.nacos.svc.cluster.local:8848 nacos-2.nacos-headless.nacos.svc.cluster.local:8848" # MySQL 配置 - name: MYSQL_SERVICE_HOST value: "你的MySQL服务地址" # 例如 mysql-service.default.svc.cluster.local - name: MYSQL_SERVICE_DB_NAME value: "nacos" - name: MYSQL_SERVICE_PORT value: "3306" - name: MYSQL_SERVICE_USER value: "nacos" - name: MYSQL_SERVICE_PASSWORD value: "你的密码" # 可选:开启鉴权 - name: NACOS_AUTH_ENABLE value: "true" - name: NACOS_AUTH_TOKEN value: "你的SecretKeyBase64编码" - name: NACOS_AUTH_IDENTITY_KEY value: "serverIdentity" - name: NACOS_AUTH_IDENTITY_VALUE value: "security" volumeMounts: - name: nacos-data mountPath: /home/nacos/data - name: nacos-logs mountPath: /home/nacos/logs volumeClaimTemplates: - metadata: name: nacos-data spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "你的存储类名称" # 例如 nfs-storageclass resources: requests: storage: 10Gi - metadata: name: nacos-logs spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "你的存储类名称" resources: requests: storage: 5Gi注意:
NACOS_SERVERS中的域名格式为{podName}.{serviceName}.{namespace}.svc.cluster.local,这是 K8s 集群内部的 DNS 解析规则 。3.4 创建访问 Service
为了方便集群内部访问,可以创建一个普通的 ClusterIP 服务。如果需要从集群外部访问,可以创建 NodePort 或 LoadBalancer 类型。
yaml
# nacos-service.yaml apiVersion: v1 kind: Service metadata: name: nacos-service namespace: nacos spec: type: NodePort # 或 ClusterIP ports: - port: 8848 targetPort: 8848 nodePort: 30048 # NodePort 端口范围 30000-32767 name: http selector: app: nacos4. 部署与验证
4.1 应用配置
依次应用上述 YAML 文件。
bash
4.2 查看部署状态
监控 Pod 启动过程:
bash
当三个 Pod 都处于
Running状态且就绪后,查看日志确认启动成功:bash
日志中出现
Nacos started successfully即表示启动成功。4.3 访问 Nacos 控制台
获取节点 IP 和映射的端口:
bash
在浏览器中访问
http://任意节点IP:30048/nacos,默认账号密码均为nacos。登录后进入“集群管理”,可以看到三个节点均以
UP状态加入集群,至此部署完成。5. 踩坑与优化
5.1 镜像架构问题
exec format error。5.2 数据库连接
MYSQL_SERVICE_HOST指向正确的 Service 名称。5.3 存储性能