Nacos 是 Dynamic Naming and Configuration Service 的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 是构建以服务为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
在本文中,我将为您提供一份全面的实战指南,详细地指导您如何在 Kubernetes 集群中部署以集群模式运行的 Nacos 服务。
实战服务器配置(架构1:1复刻小规模生产环境,配置略有不同)
实战环境涉及软件版本信息
-
操作系统:openEuler 22.03 LTS SP3 x86_64
-
KubeSphere:v3.4.1
-
Kubernetes:v1.28.8
-
KubeKey: v3.1.1
-
MySQL:v5.7.44
-
Nacos: v2.4.2.1
1. 部署方案规划
1.1 部署架构图
1.2 准备 Nacos 部署资源
-
创建部署资源根目录
mkdir /srv/nacos
cd /srv/nacos
-
获取官方资源配置清单
# wget 方式(推荐)
wget https://codeload.github.com/nacos-group/nacos-k8s/zip/refs/heads/master -O nacos-k8s-master.zip# git 方式
git clone https://github.com/nacos-group/nacos-k8s.git
-
获取初始化数据库文件
wget https://raw.githubusercontent.com/alibaba/nacos/refs/heads/master/distribution/conf/mysql-schema.sql
1.3 准备 MySQL
Nacos 需要使用 MySQL,本文使用更加贴近生产的 MySQL 主从复制方案部署 MySQL
提示: 也可以使用官方提供的资源清单
deploy/mysql/mysql-nfs.yaml
,部署单机版的 MySQL 服务。
Step 1:导入 MySQL 初始化数据
1、进入 MySQL 主节点容器内部。
$ kubectl exec -it mysql-source-0 -- mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44-log MySQL Community Server (GPL)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
2、创建数据库及 Nacos 用户。
-- 创建数据库
mysql> CREATE DATABASE IF NOT EXISTS `nacos` DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;-- 创建用户
mysql> CREATE USER 'nacos'@'%' IDENTIFIED BY 'ChangeMe';-- 赋予权限
mysql> GRANT ALL PRIVILEGES ON `nacos`.* TO 'nacos'@'%';-- 刷新权限
mysql> FLUSH PRIVILEGES;
3、导入数据(无需登录容器内部)。
# 进入数据库初始化 sql 文件目录
$ cd /srv/nacos/# 导入数据
kubectl exec -i mysql-source-0 -- mysql -S /var/lib/mysql/mysql.sock -u nacos -pChangeMe nacos < mysql-schema.sql
Step 2:查看导入的数据
1、登陆 MySQL 主节点容器内部。
$ kubectl exec -it mysql-source-0 -- mysql -u nacos -p
Enter password:
2、查看数据库。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| nacos |
+--------------------+
2 rows in set (0.01 sec)
3、查看表。
# 切换数据库
mysql> use nacos;
Database changed# 查看表
mysql> show tables;
+----------------------+
| Tables_in_nacos |
+----------------------+
| config_info |
| config_info_aggr |
| config_info_beta |
| config_info_tag |
| config_tags_relation |
| group_capacity |
| his_config_info |
| permissions |
| roles |
| tenant_capacity |
| tenant_info |
| users |
+----------------------+
12 rows in set (0.00 sec)
从结果中可以看到执行 mysql-schema.sql
后,自动创建了 Nacos 服务的相关表和数据。
1.4 准备持久化存储
本实战环境使用 NFS 作为 K8s 集群的持久化存储,如果是新集群可以参考《探索 Kubernetes 持久化存储之 NFS 终极实战指南》 部署 NFS 存储。
提示: 也可以使用官方提供的 deploy/nfs/
目录下的资源清单,部署单机版的 NFS 服务。
2. 集群模式 Nacos 部署
2.1 修改配置文件
1、解压部署代码。
$ cd /srv/nacos
$ unzip nacos-k8s-master.zip
$ cd nacos-k8s-master/deploy/nacos
2、编辑 nacos-pvc-nfs.yaml,修改数据库配置。
data:mysql.host: "mysql-source-headless.default.svc.cluster.local" # 数据库地址,本文使用 MySQL 服务在 k8s 集群内的 DNS 域名mysql.db.name: "nacos"mysql.port: "3306"mysql.user: "nacos"mysql.password: "ChangeMe"
3、修改 StoreClass 名称(可选,自建 NFS 存储时使用)。
默认的配置文件使用的 StoreClass 名称为 managed-nfs-storage,使用下面的命令修改为实际的值。
$ sed -i 's/managed-nfs-storage/nfs-sc/g' nacos-pvc-nfs.yaml
4、删除 serviceAccountName(可选,自建 NFS 存储时使用)。
sed -i '/serviceAccountName/d' nacos-pvc-nfs.yaml
5、修改镜像地址(可选,镜像下载受限或是离线部署时可用)。
sed -i 's#nacos/nacos-peer-finder-plugin:1.1#registry.opsxlab.cn:8443/nacos/nacos-peer-finder-plugin:1.1#g' nacos-pvc-nfs.yaml
sed -i 's#nacos/nacos-server:latest#registry.opsxlab.cn:8443/nacos/nacos-server:v2.4.2.1#g' nacos-pvc-nfs.yaml
6、开启鉴权配置(建议)。
Nacos 默认配置没有开启鉴权,生产环境建议开启。在 containers.env
部分增加下面的内容:
- name: NACOS_AUTH_ENABLEvalue: "true"
- name: NACOS_AUTH_TOKENvalue: "SecretKeyYzJlMTMxOTU5ZTljZTkxZGQ2MDcwZGIxMzU1YTFkMjg="
- name: NACOS_AUTH_IDENTITY_KEYvalue: "serverIdentity"
- name: NACOS_AUTH_IDENTITY_VALUEvalue: "ChangeMe"
注意: 自定义 NACOS_AUTH_TOKEN
密钥时,推荐将配置项设置为Base64 编码的字符串,且原始密钥长度不得低于32字符。
可以执行下面的命令生成TOKEN 密钥:
echo -n $(openssl rand -hex 16) | base64 -w0
2.2 部署 Nacos 集群
1、执行下面的命令,创建 Nacos。
$ kubectl create -f nacos-pvc-nfs.yaml
正确执行后,输出结果如下 :
$ kubectl create -f nacos-pvc-nfs.yaml
service/nacos-headless created
configmap/nacos-cm created
statefulset.apps/nacos created
2、验证 Nacos 节点状态。
$ kubectl get pod -l app=nacos -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nacos-0 1/1 Running 0 25s 10.233.96.233 ksp-worker-3 <none> <none>
nacos-1 1/1 Running 0 25s 10.233.94.125 ksp-worker-1 <none> <none>
nacos-2 1/1 Running 0 25s 10.233.68.221 ksp-worker-2 <none> <none>
2.3 配置 K8s 集群外部访问
我们采用 NodePort 方式在 Kubernetes 集群中对外发布 Nacos 服务,以便管理员能够访问图形化控制台,同时也为集群外的应用提供服务,指定的端口为 31848。
使用 vi
编辑器,新建 NodePort 服务资源清单文件 nacos-external.yaml
,并输入以下内容:
kind: Service
apiVersion: v1
metadata:name: nacos-externallabels:app: nacos-external
spec:ports:- protocol: TCPport: 8848targetPort: 8848nodePort: 31848selector:app: nacostype: NodePort
2.4 设置管理员密码
自 2.4.0 版本开始,Nacos构建时不再提供管理员用户nacos
的默认密码,需要在首次开启鉴权后,通过 API 或 Nacos 控制台进行管理员用户nacos
的密码初始化。
本文选择 Nacos 控制台的方式初始化密码,当 Nacos 集群开启鉴权后,访问 Nacos 控制台时,会校验管理员用户nacos
的密码是否已经初始化,若发现未初始化密码时,则会跳转至初始化密码的页面进行初始化。
在该页面密码文本框内输入自定义密码,然后点击提交即可。
注意: 若密码文本框内未输入自定义密码或输入空白密码,Nacos 将会生成随机密码,请保存好生成的随机密码。
初始化成功后会弹窗提示初始化成功,并明文展示指定的密码或随机生成的密码,请保存好此密码。
点击「确定」后,会跳转到登录页面,并弹出权限认证失败的提示框。
点击「确定」后,输入 nacos 用户名和对应的密码。
登录成功后,进入「配置管理」页面。
3. 验证测试 Nacos 服务是否正确配置
使用 curl 命令,在 K8s 集群外的机器上调用 Nacos API 接口,通过 Nacos 对外服务对应的 NodePort 端口,验证测试 Nacos 服务是否正常。
3.1 获取 Token
首先,使用用户名和密码登陆 nacos,若用户名和密码正确,会返回 Token 信息。
curl -X POST 'http://192.168.9.91:31848/nacos/v1/auth/login' -d 'username=nacos&password=ChangeMe'
正确执行后,返回的结果如下:
{"accessToken":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcyNzcwOTk0Mn0.Ki2kgZyh_dj_Zfb9HKPCkKr1cgWfi3szQS4hlZPIwkI","tokenTtl":18000,"globalAdmin":true,"username":"nacos"}
3.2 服务注册
curl -X POST 'http://192.168.9.91:31848/nacos/v1/ns/instance?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcyNzcwOTk0Mn0.Ki2kgZyh_dj_Zfb9HKPCkKr1cgWfi3szQS4hlZPIwkI&serviceName=nacos.naming.serviceName&ip=192.168.9.81&port=8080'
3.3 服务发现
curl -X GET 'http://192.168.9.91:31848/nacos/v1/ns/instance/list?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcyNzcwOTk0Mn0.Ki2kgZyh_dj_Zfb9HKPCkKr1cgWfi3szQS4hlZPIwkI&serviceName=nacos.naming.serviceName'
正确执行后,返回的结果如下:
{"name":"DEFAULT_GROUP@@nacos.naming.serviceName","groupName":"DEFAULT_GROUP","clusters":"","cacheMillis":10000,"hosts":[],"lastRefTime":1727692102280,"checksum":"","allIPs":false,"reachProtectionThreshold":false,"valid":true}[
3.4 发布配置
curl -X POST "http://192.168.9.91:31848/nacos/v1/cs/configs?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcyNzcwOTk0Mn0.Ki2kgZyh_dj_Zfb9HKPCkKr1cgWfi3szQS4hlZPIwkI&dataId=nacos.cfg.dataId&group=test&content=helloWorld"
3.5 获取配置
curl -X GET "http://192.168.9.91:31848/nacos/v1/cs/configs?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcyNzcwOTk0Mn0.Ki2kgZyh_dj_Zfb9HKPCkKr1cgWfi3szQS4hlZPIwkI&dataId=nacos.cfg.dataId&group=test"
正确执行后,返回的结果如下:
helloWorld
3.6 Nacos 控制台查看
-
配置管理列表
-
配置详情
至此,我们完成了在 KubeSphere 管理的 Kubernetes 集群上手动部署 Nacos 集群的全过程,后续的配置管理请根据实际应用的需求进行配置。
文章转载自:kubesphere
原文链接:https://www.cnblogs.com/kubesphere/p/18493050
体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构