Nacos(全称为 **"Dynamic Naming and Configuration Service"**)是一个开源的动态服务发现、配置管理和服务管理平台。它由阿里巴巴开源,旨在为云原生应用提供灵活、高效、易用的服务发现、配置管理以及服务治理解决方案。
1Nacos 提供了以下几个核心功能:
1.1 服务发现与健康检查
Nacos 提供了服务发现和健康检查功能,支持服务的动态注册和发现。应用可以通过 Nacos 自动注册到服务目录,其他应用可以通过 Nacos 发现这些服务并进行通信。
- 服务注册:应用启动时会将自己注册到 Nacos,告知 Nacos 其服务名、实例信息(如 IP、端口、版本等)。
- 服务发现:其他服务通过 Nacos 查询服务实例的详细信息(如 IP 和端口)。
- 健康检查:Nacos 监控每个注册的服务实例的健康状态,支持自动检测和剔除不健康的实例。
1.2. 配置管理
Nacos 提供集中式的配置管理功能,可以帮助应用管理其配置项。应用在启动时可以从 Nacos 中获取最新的配置,并在运行时动态刷新配置。
- 动态配置管理:可以在 Nacos 中维护配置文件,应用启动时动态加载并实时同步配置,无需重启服务。
- 灰度发布:支持对不同的环境、版本进行不同的配置管理,方便进行灰度发布。
- 配置版本管理:Nacos 支持配置版本管理,可以记录配置的历史版本,方便进行回滚和恢复。
1.3. 服务治理
Nacos 提供了一些服务治理的功能,包括负载均衡、限流、熔断等,有助于提升系统的稳定性和可靠性。
- 动态负载均衡:Nacos 支持与负载均衡器配合,能够基于负载自动选择最优的服务实例。
- 服务路由:Nacos 可以对服务请求进行路由,支持基于不同条件进行路由决策。
- 服务健康检查与治理:通过健康检查机制,Nacos 能够动态识别不健康的服务实例,防止它们被访问。
1.4. Nacos 集群与高可用
Nacos 支持通过集群模式来保证高可用。多个 Nacos 节点组成一个集群,通过数据同步来实现集群间的高可用性。当一个节点出现故障时,其他节点仍然可以正常工作。
1.5. 支持多种协议
Nacos 支持多种协议,包括 HTTP、DNS 和 gRPC 等,允许用户根据实际需求选择合适的协议。
1.6. 灵活的扩展性
Nacos 提供了插件机制,可以通过编写插件扩展其功能,满足特定业务场景的需求。
2.Nacos 的主要组件
- Nacos Server:Nacos 的核心服务组件,负责处理服务注册、发现、配置管理、服务治理等。
- Nacos Console:Nacos 提供的 Web 控制台,允许用户方便地管理和查看服务注册情况、配置项、健康状态等。
- Nacos Client:客户端 SDK,支持 Java、Go、Node.js 等多种语言,帮助应用与 Nacos 进行交互,完成服务注册、发现和配置管理。
3.Nacos 的使用场景
- 微服务架构:在微服务架构中,服务间需要动态发现对方并进行通信。Nacos 提供了高效的服务发现功能,可以帮助不同微服务实例动态连接。
- 动态配置管理:当系统需要频繁更改配置而不想重启应用时,Nacos 提供的配置管理功能非常实用。
- 多环境管理:对于不同环境(如开发、测试、生产),Nacos 可以在同一平台上管理不同的配置文件,方便管理不同的配置版本。
- 容器化和 Kubernetes:Nacos 与容器编排平台如 Kubernetes 配合使用时,可以方便地管理容器中的服务注册和配置管理。
4.Nacos vs. 其他服务治理框架
- 与 Consul 和 Eureka 对比:Nacos 提供与 Consul 和 Eureka 类似的服务发现功能,但它还具备了动态配置管理的能力,这是 Eureka 和 Consul 本身不提供的。
- 与 Spring Cloud Config 对比:Spring Cloud Config 是一个配置管理工具,但它是针对 Spring 应用的配置管理。而 Nacos 不仅支持 Spring,还支持多种不同的应用架构,并且能够结合服务发现和治理进行全面的管理。
- 与 Zookeeper 对比:Zookeeper 可以用作服务协调和配置管理工具,但它不专注于服务发现和动态配置管理,而 Nacos 则在这些方面做了优化,并提供了更易用的 API 和 Web 控制台。
5.部署Nacos集群
环境准备k8s集群,我的实验环境只有三台机器,nacos集群至少需要运行3个,部署的时候切记允许master节点调度pod。
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready control-plane 89d v1.28.2
node-1 Ready <none> 89d v1.28.2
node-2 Ready <none> 89d v1.28.2
Nacos有内置的数据库用于存放配置数据,在生产环境中最好是使用外部数据库用于存放配置数据,可以和后端应用服务共用一个数据库,数据库采用mysql5.7版本,最好是主从架构,本文采用单节点。
5.1.部署mysql
1配置nfs制作持久化存储,所有节点均安装nfs与rpcbind,我使用master作为共享节点
[root@master ~]# yum install -y nfs-utils rpcbind
[root@master ~]# mkdir /mnt/nacos
[root@master ~]# vim /etc/exports
/mnt/application 192.168.209.0/24(rw,no_root_squash)
[root@master ~]# systemctl start rpcbind
[root@master ~]# systemctl start nfs
[root@master ~]# systemctl enable nfs rpcbind
2.先创建mysql数据库
[root@master ~]# mkdir nacos/{mysql,nacos} -p
[root@master ~]# cd nacos/mysql/
[root@master mysql]# cat create_mysql_ns.yml #创建用于部署nacos的名称空间
apiVersion: v1
kind: Namespace
metadata:
name: nacos
[root@master mysql]# kubectl apply -f create_mysql_ns.yml
namespace/nacos created
[root@master mysql]# kubectl get ns
NAME STATUS AGE
default Active 89d
kube-flannel Active 89d
kube-node-lease Active 89d
kube-public Active 89d
kube-system Active 89d
nacos Active 7s
[root@master mysql]# cat create_mysql_pv.yml #创建mysql使用的pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: nacos-mysql-pv
labels:
type: nfs
namespace: nacos
spec:
storageClassName: nfs
nfs:
server: 192.168.209.131
path: "/mnt/application"
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
[root@master mysql]# kubectl apply -f create_mysql_pv.yml
persistentvolume/nacos-mysql-pv created
[root@master mysql]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nacos-mysql-pv 10Gi RWX Retain Available nfs 4s
[root@master mysql]# cat create_pvc.yml #将pv与pvc进行绑定
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
namespace: nacos
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: nfs
[root@master mysql]# kubectl apply -f create_pvc.yml
persistentvolumeclaim/mysql-pvc created
[root@master mysql]# kubectl get pvc -n nacos
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pvc Bound nacos-mysql-pv 10Gi RWX nfs 7s
#创建mysql的密码,使用secret保存
[root@master mysql]# echo -n 'Mysql@1233!' | base64
TXlzcWxAMTIzMyE=
[root@master mysql]# cat mysql_secret.yml
apiVersion: v1
data:
pass: TXlzcWxAMTIzMyE=
kind: Secret
metadata:
annotations:
name: app-mysql
namespace: nacos
type: Opaque
[root@master mysql]# kubectl apply -f mysql_secret.yml
secret/app-mysql created
[root@master mysql]# kubectl get secret -n nacos
NAME TYPE DATA AGE
app-mysql Opaque 1 6s
[root@master mysql]# cat mysql-svc.yml #创建mysql的svc用于暴露服务
apiVersion: v1
kind: Service
metadata:
name: mysql-svc
namespace: nacos
spec:
type: NodePort
ports:
- port: 3306
nodePort: 30006
targetPort: 3306
selector:
app: app-mysql
[root@master mysql]# kubectl apply -f mysql-svc.yml
service/mysql-svc created
[root@master mysql]# kubectl get svc -n nacos
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-svc NodePort 10.101.46.161 <none> 3306:30006/TCP 5s
#通过statefulset管理mysql服务
[root@master mysql]# cat statefulset-mysql.yml
kind: StatefulSet
apiVersion: apps/v1
metadata:
name: app-mysql
labels:
app: mysql
namespace: nacos
spec:
replicas: 1
serviceName: mysql-svc
selector:
matchLabels:
app: app-mysql
template:
metadata:
labels:
app: app-mysql
spec:
volumes:
- name: data-time
hostPath:
path: /etc/localtime
type: ''
- name: data
persistentVolumeClaim:
claimName: mysql-pvc
containers:
- args:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --lower_case_table_names=1
name: mysql
image: registry.cn-hangzhou.aliyuncs.com/testpm-k8s/mysql:5.7
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: app-mysql
key: pass
resources:
limits:
cpu: '2'
memory: 4Gi
requests:
cpu: 100m
memory: 100Mi
volumeMounts:
- name: data-time
mountPath: /etc/localtime
- name: data
mountPath: /var/lib/mysql
[root@master mysql]# kubectl apply -f statefulset-mysql.yml
statefulset.apps/app-mysql created
[root@master mysql]# kubectl get pod -n nacos -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
app-mysql-0 1/1 Running 0 60s 10.244.1.15 node-2 <none> <none>
测试:
[root@master mysql]# kubectl exec -it app-mysql-0 -n nacos -- mysql -uroot -p'Mysql@1233!'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.34 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, 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>
通过nodeport访问
[root@master mysql]# mysql -uroot -h192.168.209.133 -P30006 -p'Mysql@1233!'
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.34 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>
5.2部署nacos集群
Nacos集群依赖外部数据库(如MySQL)存储配置数据。确保已部署MySQL集群或高可用数据库,并执行以下操作:
- 创建数据库
nacos_config
。 - 执行Nacos提供的初始化SQL脚本(nacos-mysql.sql)。https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql
- 记录数据库连接信息(地址、用户名、密码)。
[root@master mysql]# cd ../nacos/
[root@master nacos]# mysql -uroot -h192.168.209.133 -P30006 -p'Mysql@1233!'
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.34 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> create database nacos_config; #创建数据库
Query OK, 1 row affected (0.02 sec)
MySQL [(none)]> use nacos_config
Database changed
MySQL [nacos_config]> source /root/mysql-schema.sql; #执行sql脚本
Query OK, 0 rows affected (0.05 sec)
Query OK, 0 rows affected (0.10 sec)
Query OK, 0 rows affected (0.09 sec)
Query OK, 0 rows affected (0.05 sec)
Query OK, 0 rows affected (0.05 sec)
Query OK, 0 rows affected (0.03 sec)
Query OK, 0 rows affected (0.05 sec)
Query OK, 0 rows affected (0.03 sec)
Query OK, 0 rows affected (0.05 sec)
Query OK, 0 rows affected (0.07 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.04 sec)
MySQL [nacos_config]> show tables;
+------------------------+
| Tables_in_nacos_config |
+------------------------+
| config_info |
| config_info_beta |
| config_info_gray |
| 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 [nacos_config]>
创建nacos的pv
[root@nacos ~]# mkdir /mnt/nacos/{data01,data02,data03}
[root@nacos ~]# cat /etc/exports
/mnt/application 192.168.209.0/24(rw,no_root_squash)
/mnt/nacos/data01 192.168.209.0/24(rw,no_root_squash)
/mnt/nacos/data02 192.168.209.0/24(rw,no_root_squash)
/mnt/nacos/data03 192.168.209.0/24(rw,no_root_squash)
[root@nacos ~]# systemctl restart nfs rpcbind
[root@master nacos]# cat nacos-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nacos-pv-1
labels:
app: pv-1
namespace: nacos
spec:
nfs:
path: /mnt/nacos/data01
server: 192.168.209.131
accessModes:
- ReadWriteMany
capacity:
storage: 5Gi
storageClassName: nfs
persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nacos-pv-2
labels:
app: pv-2
namespace: nacos
spec:
nfs:
path: /mnt/nacos/data02
server: 192.168.209.131
accessModes:
- ReadWriteMany
capacity:
storage: 5Gi
storageClassName: nfs
persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nacos-pv-3
labels:
app: pv-3
namespace: nacos
spec:
nfs:
path: /mnt/nacos/data03
server: 192.168.209.131
accessModes:
- ReadWriteMany
capacity:
storage: 5Gi
storageClassName: nfs
persistentVolumeReclaimPolicy: Retain
[root@master nacos]# kubectl apply -f nacos-pv.yml
persistentvolume/nacos-pv-1 created
persistentvolume/nacos-pv-2 created
persistentvolume/nacos-pv-3 created
[root@master nacos]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nacos-mysql-pv 10Gi RWX Retain Bound nacos/mysql-pvc nfs 74m
nacos-pv-1 5Gi RWX Retain Available nfs 6s
nacos-pv-2 5Gi RWX Retain Available nfs 6s
nacos-pv-3 5Gi RWX Retain Available nfs 6s
5.3创建nacos的service
创建headless server用于集群内部节点通信,由于headless server不会给pod分配ip地址,节点之间相互指定链接地址的时候可以指定headless 为pod分配的DNS的名字,格式为:
$<Pod Name>.$<service name>.$<namespace name>.svc.cluster.local
创建headless server用户集群内部节点通信
[root@master nacos]# cat nacos-headless-svc.yml
apiVersion: v1
kind: Service
metadata:
name: nacos-headless
namespace: nacos
labels:
app: nacos
spec:
ports:
- port: 8848
clusterIP: None
type: ClusterIP
selector:
app: nacos
[root@master nacos]# kubectl apply -f nacos-headless-svc.yml
service/nacos-headless created
[root@master nacos]# kubectl get svc -n nacos
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-svc NodePort 10.101.46.161 <none> 3306:30006/TCP 66m
nacos-headless ClusterIP None <none> 8848/TCP 6s
Nacos服务端暴露的主要端口及其用途包括:
主端口 (默认8848): 这是Nacos客户端、控制台以及OpenAPI所使用的HTTP端口,用于配置管理、服务发现的HTTP请求。
gRPC客户端请求服务端端口 (默认9848): 即主端口+1000偏移量,用于客户端通过gRPC协议向Nacos服务端发起连接和请求。
服务端gRPC请求服务端端口 (默认9849): 即主端口+1001偏移量,用于服务间的同步和其他内部通信。
Jraft请求服务端端口 (默认7848): 即主端口-1000偏移量,用于处理服务端间的Raft一致性算法相关的请求。
如何指定与调整端口
服务端端口指定: 通过配置server.port来设定Nacos服务端的主端口,其他端口会依据上述偏移量自动计算得出。
客户端gRPC端口偏移量调整: 客户端可以通过JVM参数-D nacos.server.grpc.port.offset来自定义gRPC端口相对于主端口的偏移量。例如,若设置偏移量为5000,则客户端gRPC端口会在主端口基础上增加5000。需要注意的是,如果客户端偏移量非默认值,服务端需通过VIP/SLB正确映射端口,以确保客户端能成功访问。
创建nacos对外暴露的端口通过nodeport的方式实现
[root@master nacos]# cat nacos-nodeport.yml
apiVersion: v1
kind: Service
metadata:
name: nacos-nodeport
namespace: nacos
labels:
app: nacos-svc-nodeport
spec:
ports:
- port: 8848
targetPort: 8848
nodePort: 30048
type: NodePort
selector:
app: nacos
[root@master nacos]# kubectl apply -f nacos-nodeport.yml
service/nacos-nodeport created
[root@master nacos]# kubectl get svc -n nacos
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-svc NodePort 10.101.46.161 <none> 3306:30006/TCP 3h16m
nacos-headless ClusterIP None <none> 8848/TCP 129m
nacos-nodeport NodePort 10.111.254.34 <none> 8848:30048/TCP 6s
5.4.创建ConfigMap用于保存配置文件
创建Nacos需要的配置文件,将配置文件定义为ConfigMap,也可以使用变量的方式进行映射到pod里面
例子: 我采用的时configmap的方式
nacos官方配置文件系统参数:https://nacos.io/docs/latest/manual/admin/system-configurations/
[root@master nacos]# cat nacos-cm.yml
apiVersion: v1
data:
jvm-xmn: 128m
jvm-xms: 256m
jvm-xmx: 256m
mode: cluster
mysql-database-num: "1"
mysql-service-db-name: nacos_config
mysql-service-db-param: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
mysql-service-host: app-mysql-0.mysql-svc.nacos.svc.cluster.local
mysql-service-port: "3306"
mysql-service-user: root
nacos-servers: 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
spring-datasource-platform: mysql
kind: ConfigMap
metadata:
name: nacos-config
namespace: nacos
[root@master nacos]# kubectl apply -f nacos-cm.yml
configmap/nacos-config created
[root@master nacos]# kubectl get cm -n nacos
NAME DATA AGE
kube-root-ca.crt 1 4h
nacos-config 12 7s
镜像环境变量
属性配置列表
属性名称 | 描述 | 选项 |
---|---|---|
MODE | 系统启动方式: 集群/单机,对应nacos.standalone | cluster/standalone 默认 cluster |
NACOS_SERVERS | 集群地址,对应nacos.member.list | p1空格ip2空格ip3 |
PREFER_HOST_MODE | 支持IP还是域名模式,对应nacos.inetutils.prefer-hostname-over-ip | hostname/ip 默认IP |
NACOS_SERVER_PORT | Nacos 运行端口,对应server.port | 默认8848 |
NACOS_SERVER_IP | 多网卡模式下可以指定IP,对应nacos.server.ip | |
SPRING_DATASOURCE_PLATFORM | 单机模式下支持MYSQL数据库,对应spring.sql.init.platform | mysql / 空 默认:空 |
MYSQL_SERVICE_HOST | 数据库 连接地址 | |
MYSQL_SERVICE_PORT | 数据库端口 | 默认 : 3306 |
MYSQL_SERVICE_DB_NAME | 数据库库名 | |
MYSQL_SERVICE_USER | 数据库用户名 | |
MYSQL_SERVICE_PASSWORD | 数据库用户密码 | |
MYSQL_SERVICE_DB_PARAM | 数据库连接参数 | 默认:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false |
MYSQL_DATABASE_NUM | 数据库个数 | 默认:1 |
JVM_XMS | -Xms | 默认 :1g |
JVM_XMX | -Xmx | 默认 :1g |
JVM_XMN | -Xmn | 512m |
JVM_MS | - XX | 默认 :128m |
JVM_MMS | -XX | 默认 :320m |
NACOS_DEBUG | 是否开启远程DEBUG | y/n 默认 |
TOMCAT_ACCESSLOG_ENABLED | server.tomcat.accesslog.enabled | 默认 |
NACOS_AUTH_SYSTEM_TYPE | 权限系统类型选择,目前只支持nacos类型 | 默认 |
NACOS_AUTH_ENABLE | 是否开启权限系统,对应nacos.core.auth.enabled | 默认 |
NACOS_AUTH_TOKEN_EXPIRE_SECONDS | token 失效时间 | 默认 :18000 |
NACOS_AUTH_TOKEN | token | 注意:该环境变量的默认值在Nacos 2.2.1版本中已移除,开启鉴权时需要指定 |
NACOS_AUTH_CACHE_ENABLE | 权限缓存开关 ,开启后权限缓存的更新默认有15秒的延迟 | 默认 : false |
MEMBER_LIST | 通过环境变量的方式设置集群地址 | 例子:192.168.16.101:8847?raft_port=8807,192.168.16.101?raft_port=8808,192.168.16.101:8849?raft_port=8809 |
EMBEDDED_STORAGE | 是否开启集群嵌入式存储模式 | embedded 默认 : none |
NACOS_AUTH_CACHE_ENABLE | nacos.core.auth.caching.enabled | default : false |
NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE | nacos.core.auth.enable.userAgentAuthWhite | default : false |
NACOS_AUTH_IDENTITY_KEY | nacos.core.auth.server.identity.key | 注意:该环境变量的默认值在Nacos 2.2.1版本中已移除,开启鉴权时需要指定 |
NACOS_AUTH_IDENTITY_VALUE | nacos.core.auth.server.identity.value | 注意:该环境变量的默认值在Nacos 2.2.1版本中已移除,开启鉴权时需要指定 |
NACOS_SECURITY_IGNORE_URLS | nacos.security.ignore.urls | default : /,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/** |
DB_POOL_CONNECTION_TIMEOUT | 数据库连接池超时时间,单位为毫秒 | 默认 : 30000 |
NACOS_CONSOLE_UI_ENABLED | nacos.console.ui.enabled | default : true |
NACOS_CORE_PARAM_CHECK_ENABLED |
5.5.创建statefulset资源用于管理nacos服务
[root@master nacos]# cat state-nacos.yml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
namespace: nacos
spec:
serviceName: nacos-headless #指定headless server的名字
replicas: 3 #指定pod的个数
selector:
matchLabels:
app: nacos
template:
metadata:
labels:
app: nacos
spec:
tolerations: #容忍master节点的污点,允许pod调度到master节点
- key: node-role.kubernetes.io/master
effect: NoSchedule
volumes:
- name: logdir
hostPath:
path: /var/log/nacos
containers:
- name: nacos
image: nacos/nacos-server:latest
imagePullPolicy: IfNotPresent
env:
- name: JVM_XMS
valueFrom:
configMapKeyRef:
key: jvm-xms
name: nacos-config
- name: JVM_XMN
valueFrom:
configMapKeyRef:
key: jvm-xmn
name: nacos-config
- name: JVM_XMX
valueFrom:
configMapKeyRef:
key: jvm-xmx
name: nacos-config
- name: SPRING_DATASOURCE_PLATFORM
valueFrom:
configMapKeyRef:
key: spring-datasource-platform
name: nacos-config
- name: MYSQL_DATABASE_NUM
valueFrom:
configMapKeyRef:
key: mysql-database-num
name: nacos-config
- name: MODE
valueFrom:
configMapKeyRef:
key: mode
name: nacos-config
- name: PREFER_HOST_MODE
value: hostname #使用主机名标识节点
- name: NACOS_SERVERS
valueFrom:
configMapKeyRef:
key: nacos-servers
name: nacos-config
- name: MYSQL_SERVICE_HOST
valueFrom:
configMapKeyRef:
key: mysql-service-host
name: nacos-config
- name: MYSQL_SERVICE_PORT
valueFrom:
configMapKeyRef:
key: mysql-service-port
name: nacos-config
- name: MYSQL_SERVICE_DB_NAME
valueFrom:
configMapKeyRef:
key: mysql-service-db-name
name: nacos-config
- name: MYSQL_SERVICE_USER
valueFrom:
configMapKeyRef:
key: mysql-service-user
name: nacos-config
- name: MYSQL_SERVICE_DB_PARAM
valueFrom:
configMapKeyRef:
key: mysql-service-db-param
name: nacos-config
- name: MYSQL_SERVICE_PASSWORD
valueFrom:
secretKeyRef:
name: app-mysql
key: pass
- name: NACOS_AUTH_ENABLE #以下参数是配置开启鉴权,否则没有登陆页面提示输入用户密码
value: "true"
- name: NACOS_AUTH_TOKEN
value: "SecretKeyM1Z2WDc4dnVyZkQ3NmZMZjZ3RHRwZnJjNFROdkJOemEK"
- name: NACOS_AUTH_IDENTITY_KEY
value: "mpYGXyu7"
ports:
- containerPort: 8848
name: server
- containerPort: 7848
name: raft
volumeMounts:
- name: nacos-data
mountPath: /home/nacos/data
- name: logdir
mountPath: /home/nacos/logs
volumeClaimTemplates: #定义持久化存储模板,自动于创建好的pv绑定
- metadata:
name: nacos-data
spec:
accessModes: [ "ReadWriteMany" ]
storageClassName: "nfs"
resources:
requests:
storage: 5Gi
[root@master nacos]# kubectl apply -f state-nacos.yml
statefulset.apps/nacos created
[root@master nacos]# kubectl get pod -n nacos -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
app-mysql-0 1/1 Running 0 4h41m 10.244.1.16 node-2 <none> <none>
nacos-0 1/1 Running 0 20s 10.244.1.21 node-2 <none> <none>
nacos-1 1/1 Running 0 16s 10.244.2.26 node-1 <none> <none>
nacos-2 1/1 Running 0 10s 10.244.1.22 node-2 <none> <none>
配置开启鉴权
https://nacos.io/docs/latest/guide/user/auth/
除此之外,还可以添加其他鉴权相关的环境变量信息:
name | description | option |
---|---|---|
NACOS_AUTH_ENABLE | 是否开启权限系统 | 默认 |
NACOS_AUTH_TOKEN_EXPIRE_SECONDS | token 失效时间 | 默认:18000 |
NACOS_AUTH_TOKEN | token | 默认 |
NACOS_AUTH_CACHE_ENABLE | 权限缓存开关 ,开启后权限缓存的更新默认有15秒的延迟 | 默认 : false |
5.6访问测试:
默认用户名是nacos,密码需要初始化
使用刚刚初始的密码登陆
API接口测试
使用用户名和密码登陆nacos集群,若用户名和密码正确会返回Token信息
[root@master ~]# curl -X POST 'http://192.168.209.133:30048/nacos/v1/auth/login' -d 'username=nacos&password=nacos'
{"accessToken":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTc0MDE3NTA0MX0.QRZy47JtBY_Z0LoSh5gRikfLPaFEnjzynrHPiSk1upc","tokenTtl":18000,"globalAdmin":true,"username":"nacos"}
Nacos 是一个轻量级的服务发现和配置管理平台,非常适用于微服务架构,能够帮助开发者更加高效地管理服务的注册、发现、配置和健康检查等。它支持集群、高可用,并提供丰富的管理功能和易用的 Web 控制台,非常适合云原生环境和 Kubernetes 等容器化平台。
如果你在搭建微服务、分布式系统时,需要集中管理服务、配置,或希望轻松实现服务发现和治理,Nacos 会是一个非常不错的选择。