1、概覽
Nacos 是阿里巴巴推出來的一個新開源項目,這是一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。html
Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。node
Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。 Nacos 是構建以「服務」爲中心的現代應用架構 (例如微服務範式、雲原生範式) 的服務基礎設施。mysql
中文官網:https://nacos.io/zh-cngit
什麼是 Nacos?
服務(Service)是 Nacos 世界的一等公民。Nacos 支持幾乎全部主流類型的「服務」的發現、配置和管理:github
Kubernetes Servicespring
gRPC & Dubbo RPC Servicesql
Spring Cloud RESTful Service數據庫
Nacos 的關鍵特性包括:apache
-
服務發現和服務健康監測centos
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 無縫支持一些主流的開源生態,例如
使用 Nacos 簡化服務發現、配置管理、服務治理及管理的解決方案,讓微服務的發現、管理、共享、組合更加容易。
2、快速開始
本項目包含一個可構建的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 <none> <none> mysql-slave-d68ls 1/1 Running 0 2m6s 10.244.85.196 k8s-node01 <none> <none> nacos-0 1/1 Running 0 2m6s 10.244.85.197 k8s-node01 <none> <none> nacos-1 1/1 Running 0 15s 10.244.85.198 k8s-node01 <none> <none> nacos-2 1/1 Running 0 7s 10.244.85.199 k8s-node01 <none> <none>
注意:默認會啓動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
3、高級使用
在高級使用中,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個副本。
4、訪問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 <none> 443/TCP 28d mysql-master ClusterIP 10.1.100.185 <none> 3306/TCP 60m mysql-slave ClusterIP 10.1.39.252 <none> 3306/TCP 60m nacos-headless NodePort 10.1.118.226 <none> 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/21d916643560
http://www.javashuo.com/article/p-yrxpycjp-m.html
http://d0o0bz.cn/2018/10/k8s-nfs-client-provisioner/