一、概览

Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

中文官网:https://nacos.io/zh-cn

 

什么是 Nacos?

服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:

Kubernetes Service

gRPC & Dubbo RPC Service

Spring Cloud RESTful Service

Nacos 的关键特性包括:

服务发现和服务健康监测

Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。

Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

动态配置服务

动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。

配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

动态 DNS 服务

动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。

Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.

服务及其元数据管理

Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

更多的特性列表 ...

 

Nacos 地图

特性大图:要从功能特性,非功能特性,全面介绍我们要解的问题域的特性诉求

架构大图:通过清晰架构,让您快速进入 Nacos 世界

业务大图:利用当前特性可以支持的业务场景,及其最佳实践

生态大图:系统梳理 Nacos 和主流技术生态的关系

优势大图:展示 Nacos 核心竞争力

战略大图:要从战略到战术层面讲 Nacos 的宏观优势

 

Nacos 生态图

如 Nacos 全景图所示,Nacos 无缝支持一些主流的开源生态,例如

Spring Cloud

Apache Dubbo and Dubbo Mesh TODO

Kubernetes and CNCF TODO。

使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。

 

二、快速开始

本项目包含一个可构建的Nacos Docker Image,旨在利用StatefulSets在Kubernetes上部署Nacos

 

环境说明

操作系统

ip

主机名

配置

备注

centos 7.6

192.168.31.150 

k8s-master

2核4G

Kubernetes1.16.3

centos 7.6

192.168.31.183 

k8s-node01

2核8G

Kubernetes1.16.3

centos 7.6

192.168.31.152

nfs-server

1核2G

NFS

 

 

 

 

 

说明

由于node01需要运行mysql主从以及nacos,因此可用内存必须要大于4G才行。

NFS作为一台独立服务器,非K8S集群节点。

 

Kubernetes1.16.3安装,请参考链接:

https://www.cnblogs.com/xiao987334176/p/11899321.html

 

Clone 项目

登录到master节点

yum install -y git

mkdir /data/

cd /data/

git clone https://github.com/nacos-group/nacos-k8s.git

 

简单例子

如果你使用简单方式快速启动,请注意这是没有使用持久化卷的,可能存在数据丢失风险:

cd nacos-k8s

chmod +x quick-startup.sh

./quick-startup.sh

 

测试

服务注册

查看cluster-ip,等待几分钟,保证每一个pod都处于Running状态。

[root@k8s-master nacos-k8s]# kubectl get pods -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

mysql-master-xptvv 1/1 Running 0 2m6s 10.244.85.195 k8s-node01

mysql-slave-d68ls 1/1 Running 0 2m6s 10.244.85.196 k8s-node01

nacos-0 1/1 Running 0 2m6s 10.244.85.197 k8s-node01

nacos-1 1/1 Running 0 15s 10.244.85.198 k8s-node01

nacos-2 1/1 Running 0 7s 10.244.85.199 k8s-node01

注意:默认会启动mysql主从和3个nacos。

其中,我们要的cluster-ip,就是指nacos的ip地址。

 

服务发现

使用第一个nacos的ip地址

# curl -X PUT 'http://10.244.85.197:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

ok

 

服务发现

# curl -X GET 'http://10.244.85.197:8848/nacos/v1/ns/instances?serviceName=nacos.naming.serviceName'

 

发布配置

# curl -X POST "http://10.244.85.197:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=helloWorld"

true

 

获取配置

# curl -X GET "http://10.244.85.197:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"

helloWorld

 

三、高级使用

在高级使用中,Nacos在K8S拥有自动扩容缩容和数据持久特性,请注意如果需要使用这部分功能请使用PVC持久卷,Nacos的自动扩容缩容需要依赖持久卷,以及数据持久化也是一样,本例中使用的是NFS来使用PVC.

安装NFS服务器

登录到nfs-server主机,使用Yum安装nfs

yum -y install nfs-utils rpcbind

mkdir -p /data/nfs-share

echo "/data/nfs-share *(rw,no_root_squash,sync)" >> /etc/exports

systemctl start nfs && systemctl enable nfs

 

注意:路径是/data/nfs-share,和deploy/nfs/deployment.yaml 中的路径是对应的。

* 表示允许任意ip访问,由于Pod ip是会变动的,因此改为*

 

安装NFS客户端

登录到k8s-node01,执行

[root@k8s-node01 ~]# yum install nfs-utils -y

注意:由于node节点需要挂载NFS,因此必须要安装客户端才能挂载。

 

部署 NFS

创建角色

登录到k8s-master节点执行

[root@k8s-master nacos-k8s]# kubectl create -f deploy/nfs/rbac.yaml

 

创建 ServiceAccount 和部署 NFS-Client Provisioner

先修改deploy/nfs/deployment.yaml,红色部分是修改的,完整代码如下:

apiVersion: v1

kind: ServiceAccount

metadata:

name: nfs-client-provisioner

---

kind: Deployment

apiVersion: apps/v1

metadata:

name: nfs-client-provisioner

spec:

replicas: 1

selector:

matchLabels:

app: nfs-client-provisioner

strategy:

type: Recreate

template:

metadata:

labels:

app: nfs-client-provisioner

spec:

serviceAccount: nfs-client-provisioner

containers:

- name: nfs-client-provisioner

image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner:latest

volumeMounts:

- name: nfs-client-root

mountPath: /persistentvolumes

env:

- name: PROVISIONER_NAME

value: fuseim.pri/ifs

- name: NFS_SERVER

value: 192.168.31.152

- name: NFS_PATH

value: /data/nfs-share

volumes:

- name: nfs-client-root

nfs:

server: 192.168.31.152

path: /data/nfs-share

说明:

1. 由于是Kubernetes1.16.3版本,因此extensions/v1beta1是不支持的,必须要改成apps/v1

2. 使用apps/v1后,必须要指定selector字段,因此增加了selector相关代码。

3. 由于默认的quay.io/external_storage/nfs-client-provisioner:latest无法下载,需要改成阿里云镜像才行。

4. 指定NFS服务器的ip地址。

 

打label标签,这里指定k8s-node01节点

[root@k8s-master nacos-k8s]# kubectl label node k8s-node01 app=nfs-client-provisioner

 

执行yaml文件

[root@k8s-master nacos-k8s]# kubectl create -f deploy/nfs/deployment.yaml

 

创建 NFS StorageClass

[root@k8s-master nacos-k8s]# kubectl create -f deploy/nfs/class.yaml

 

验证NFS部署成功

[root@k8s-master nacos-k8s]# kubectl get pod -l app=nfs-client-provisioner

NAME READY STATUS RESTARTS AGE

nfs-client-provisioner-76d8f94ddc-h7dj6 1/1 Running 0 61s

 

部署数据库

由于在 quick-startup.sh 脚本中,已经部署了mysql主从,这里就不需要重复执行了。

 

部署Nacos

由于在 quick-startup.sh 脚本中,已经部署了 nacos,这里就不需要重复执行了。

默认创建了3个副本。

 

四、访问Nacos

这里以nodeport方式,发布 Nacos service

修改yaml文件

[root@k8s-master nacos-k8s]# vi ./deploy/nacos/nacos-quick-start.yaml

 

增加红色部分

---

apiVersion: v1

kind: Service

metadata:

name: nacos-headless

labels:

app: nacos-headless

spec:

type: NodePort

ports:

- port: 8848

name: server

targetPort: 8848

protocol: TCP

nodePort: 30848

selector:

app: nacos

---

 

重新发布

[root@k8s-master nacos-k8s]# kubectl apply -f ./deploy/nacos/nacos-quick-start.yaml

 

查看svc

[root@k8s-master nacos-k8s]# kubectl get svc

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

kubernetes ClusterIP 10.1.0.1 443/TCP 28d

mysql-master ClusterIP 10.1.100.185 3306/TCP 60m

mysql-slave ClusterIP 10.1.39.252 3306/TCP 60m

nacos-headless NodePort 10.1.118.226 8848:30848/TCP 60m

 

访问页面

使用 http://master ip:30848/nacos,比如:

http://192.168.31.150:30848/nacos

 

登录信息:

默认账号:nacos默认密码:nacos

 

 

登录之后,效果如下:

 

 

本文参考链接:

https://nacos.io/zh-cn/docs/use-nacos-with-kubernetes.html

https://www.jianshu.com/p/21d916643560https://www.cnblogs.com/mutong1228/p/11124590.htmlhttp://d0o0bz.cn/2018/10/k8s-nfs-client-provisioner/

 

相关文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。