1. 程式人生 > >微服務交付至kubernetes流程

微服務交付至kubernetes流程

[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 + ..