开发者
鲲鹏K8s系统下部署Nacos集群实践
鲲鹏K8s系统下部署Nacos集群实践
原创
发表于03/10
2650

随着国产化进程的加速,鲲鹏(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

kubectl get nodes -o wide

或者登录节点查看:

bash

uname -m
# 预期输出:aarch64

2.2 准备持久化存储

Nacos 需要存储数据。这里我们假设集群中已配置了 NFS 作为默认的 StorageClass。

如果还没有,可以参考官方文档先部署 NFS Provisioner。

2.3 初始化 MySQL 数据库

Nacos 集群模式需要 MySQL 作为数据中心(替代内置的 Derby),以保证数据一致性。

  1. 创建数据库:登录 MySQL,创建 nacos 数据库。
  2. sql
CREATE DATABASE IF NOT EXISTS `nacos` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8i_bin;
  1. 导入 SQL 脚本:获取 Nacos 官方提供的 MySQL 初始化脚本 。
  2. bash
wget https://raw.githubusercontent.com/alibaba/nacos/master/distribution/conf/mysql-schema.sql
  1. 然后将脚本导入数据库:
  2. bash
mysql -h你的数据库地址 -u用户名 -p nacos < mysql-schema.sql

3. 在鲲鹏 K8s 集群部署 Nacos

3.1 创建命名空间

为了方便管理,我们创建一个独立的命名空间。

yaml

# nacos-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: nacos

bash

kubectl apply -f nacos-namespace.yaml

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: nacos

3.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: nacos

4. 部署与验证

4.1 应用配置

依次应用上述 YAML 文件。

bash

kubectl apply -f nacos-headless.yaml
kubectl apply -f nacos-statefulset.yaml
kubectl apply -f nacos-service.yaml

4.2 查看部署状态

监控 Pod 启动过程:

bash

kubectl get pods -n nacos -w

当三个 Pod 都处于 Running 状态且就绪后,查看日志确认启动成功:

bash

kubectl logs -f nacos-0 -n nacos

日志中出现 Nacos started successfully 即表示启动成功。

4.3 访问 Nacos 控制台

获取节点 IP 和映射的端口:

bash

kubectl get svc -n nacos

在浏览器中访问 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 的写性能。

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞