微服務交付至kubernetes流程
阿新 • • 發佈:2020-04-02
[TOC]
#1、微服務簡介
**微服務優點**
* 服務元件化
每個服務獨立開發、部署,有效避免一個服務的修改引起整個系統重新部署
* 技術棧靈活
約定通訊方式,是得服務本身功能實現對技術要求不再那麼銘感
* 獨立部署
每個微服務獨立部署,加快部署速度,方便擴充套件
* 擴充套件性強
每個微服務可以部署多個,並且有負載均衡能力
* 獨立資料
每個微服務有獨立的基本元件,例如資料庫、快取等
**微服務缺點**
* 溝通成本
* 資料一致性
* 運維成本
* 內部架構複雜性
**微服務和單體應用**
單體應用,易於部署、測試,但是會使得程式碼膨脹,難以維護,構建和部署成本大,新人上手難
適用於微服務的框架:Spring Boots、Spring Cloud、Dubbo、Go-micro .....
#2、K8s部署微服務考慮的問題
**微服務架構圖**
![](https://img2020.cnblogs.com/blog/1679739/202004/1679739-20200402070638566-968510048.png)
[微服務流程圖](https://www.processon.com/view/5b179d12e4b06350d454c168?fromnew=1)
**微服務間如何通訊?**
REST API、RPC、MQ(後兩者主流)。
**微服務如何發現彼此?**
通過註冊中心進行服務的註冊與發現。
**元件之間怎麼個呼叫關係?**
微服務內部處理邏輯。
**那個服務作為整個網站入口?**
閘道器,即gateway(也是單獨的一個微服務)。
**那些微服務需要對外訪問?**
只需要閘道器gateway入口對外即可,
一般都是先為gateway建立svc,然後由Ingress指定到該svc。
**微服務怎麼部署?更新?擴容?**
基於Kubernetes就可以輕易實現,
Kubernetes生來就是為了這些。
**如何區分有狀態應用和無狀態應用?**
無狀態應用:不考慮儲存,不維護有狀態資訊,也不考慮和其它服務副本是否有關係。
有狀態應用:有固定儲存,維護叢集狀態資訊,例如:mysql、mongodb,有狀態應用不建議部署到kubernetes。
**為什麼要用註冊中心?**
微服務太多面臨的問題:
* 怎麼記錄一個微服務多個副本介面地址?
* 怎麼實現一個微服務多個副本負載均衡?
* 怎麼判斷一個微服務副本是否可用?
主流注冊中心:Eureka,Nacos,Etcd;
註冊中心可基於statefulset部署到k8s叢集中,也可以部署在叢集外。
**不同環境如何區分配置檔案?**
* configmap:通過不同的環境去掛載不同的配置檔案
* entrypoint.sh:通過啟動指令碼區分
* java -jar --spring.profiles.active=dev xxx.jar:基於啟動命令區分
* 統一配置中心,例如:Apollo,Disconf
#3、專案遷移到k8s流程
1. 製作映象(應用程式、執行環境、檔案系統)
基礎映象:Debian 或 應用程式的執行環境映象
應用程式:Go,Java,Python ....
執行環境:不同的語言都需要有特定的執行環境(例如java需要jdk)
檔案系統:忽略
2. 控制器管理Pod
Deployment:無狀態部署
StatefulSet:有狀態部署(MySQL、Mongodb、Redis ...)
DaemonSet:守護程序部署
Job & CronJob:批處理
3. 暴露應用
Service定義了Pod的邏輯集合和訪問這個集合的策略,
Service引入為了解決Pod的動態變化,提供服務發現和負載均衡,
支援Cluster IP,NodePort以及LocalBalancer三種類型,
Service的底層實現主要實現有iptables和ipvs兩種網路模式,推薦ipvs,
使用CoreDNS解析Service名稱,
通過Label關聯Pod。
4. 對外發布應用(ingress)
通過Service關聯Pod,
基於域名訪問,
通過Ingress Controller實現Pod的負載均衡(支援TCP/UDP 4層和HTTP 7層)。
最後在Ingress前面部署外網使用者統一入口實現七層代理/四層轉發(Nginx、HaProxy...)
5. 日誌採集
Pod在執行的時候會產生應用日誌,需要將其日誌檔案資訊採集到統一的資料庫中儲存,然後從一個平臺中展示
易給開發查閱日誌資訊和錯誤日誌資訊,易於排查問題
主流方案:FileBeat + ELK(高效能和解耦:+kafka)
6. 監控
不管是k8s叢集Master還是Node,以及Pod,我們需要知道它們執行的具體狀況,
佔用多少資源,剩餘多少資源,就得通過監控的方式去實現。
主流方案:Prometheus + Grafana + ..