Service Mesh
Service Mesh 的中文譯為“服務網格”,是一個用於處理服務和服務之間通信的基礎設施層,它負責為構建復雜的雲原生應用傳遞可靠的網絡請求,並為服務通信實現了微服務所需的基本組件功能,例如服務發現、負載均衡、監控、流量管理、訪問控制等。在實踐中,服務網格通常實現為一組和應用程序部署在一起的輕量級的網絡代理,但對應用程序來說是透明的。
Service Mesh 部署網絡結構圖
•治理能力獨立(Sidecar)
•應用程序無感知
•服務通信的基礎設施層
•解耦應用程序的重試/超時、監控、追蹤和服務發現
Istio 概述
Isito是Service Mesh的產品化落地,是目前最受歡迎的服務網格,功能豐富、成熟度高。
Linkerd是世界上第一個服務網格類的產品。
•連接(Connect)
-流量管理
-負載均衡
-灰度發布
•安全(Secure)
-認證
-鑒權
•控制(Control)
-限流
-ACL
•觀察(Observe)
-監控
-調用鏈
istio與kubernetes結合
istio架構與組件
•數據平面:由一組代理組成,這些代理微服務所有網絡通信,並接收和實施來自Mixer的策略。
•Proxy:負責高效轉發與策略實現。
•控制平面:管理和配置代理來路由流量。此外,通過mixer實施策略與收集來自邊車代理的數據。
•Mixer:適配組件,數據平面與控制平面通過它交互,為Proxy提供策略和數據上報。
•Pilot:策略配置組件,為Proxy提供服務發現、智能路由、錯誤處理等。
•Citadel:安全組件,提供證書生成下發、加密通信、訪問控制。
•Galley:配置管理、驗證、分發。
istio基本概念
Istio有4個配置資源,落地所有流量管理需求:
•VirtualService:實現服務請求路由規則的功能。
•DestinationRule:實現目標服務的負載均衡、服務發現、故障處理和故障注入的功能。
•Gateway:讓服務網格內的服務,可以被全世界看到。
•ServiceEntry:讓服務網格內的服務,可以看到外面的世界。
在Kubernetes 部署Istio
wget https://github.com/istio/istio/releases/download/1.4.2/istio-1.4.2-linux.tar.gz tar zxvf istio-1.4.2-linux.tar.gz cd istio-1.4.2 mv bin/istioctl /usr/bin istioctl profile list istioctl manifest apply --set profile=demo
istioctl manifest generate --set profile=demo #獲取yaml
istioctl manifest generate --set profile=demo | kubectl delete -f - #卸載
查看運行成功
# kubectl get pod -n istio-system NAME READY STATUS RESTARTS AGE grafana-6b65874977-crbm9 1/1 Running 0 4m13s istio-citadel-86dcf4c6b-6qg8f 1/1 Running 0 4m17s istio-egressgateway-68f754ccdd-vgnnt 1/1 Running 0 4m20s istio-galley-5fc6d6c45b-ckqhs 1/1 Running 0 4m13s istio-ingressgateway-6d759478d8-w29kh 1/1 Running 0 4m17s istio-pilot-5c4995d687-phbtd 1/1 Running 0 4m21s istio-policy-57b99968f-mbxjg 1/1 Running 5 4m24s istio-sidecar-injector-746f7c7bbb-f4jmv 1/1 Running 0 4m13s istio-telemetry-854d8556d5-s5948 1/1 Running 4 4m18s istio-tracing-c66d67cd9-2btc9 1/1 Running 0 4m18s kiali-8559969566-npcrl 1/1 Running 0 4m22s prometheus-66c5887c86-wbftc 1/1 Running 0 4m17s
Sidercar 注入
部署httpbin Web示例:
# 手動注入 kubectl apply -f <(istioctl kube-inject -f httpbin-nodeport.yaml) 或者 istioctl kube-inject -f httpbin-nodeport.yaml|kubectl apply -f - # 自動注入 kubectl label namespace default istio-injection=enabled kubectl apply -f httpbin-gateway.yaml
# kubectl get pod NAME READY STATUS RESTARTS AGE httpbin-5c8ff7878b-jtp8d 2/2 Running 0 4m44s # kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE httpbin NodePort 10.0.0.8 <none> 8000:31378/TCP 23m
NodePort訪問地址:http://192.168.0.134:31378
[root@k8s-master httpbin]# kubectl apply -f httpbin-gateway.yaml gateway.networking.istio.io/httpbin-gateway created virtualservice.networking.istio.io/httpbin created [root@k8s-master httpbin]# kubectl get gateway NAME AGE httpbin-gateway 46s [root@k8s-master httpbin]# kubectl get virtualservice NAME GATEWAYS HOSTS AGE httpbin [httpbin-gateway] [*] 73s [root@k8s-master httpbin]# kubectl get svc -n istio-system |grep ingress istio-ingressgateway LoadBalancer 10.0.0.159 <pending> 15020:30192/TCP,80:31025/TCP,443:30335/TCP,15029:31780/TCP,15030:30496/TCP,15031:30126/TCP,15032:32066/TCP,15443:32306/TCP 142m
ingressgateway訪問地址:http://192.168.0.134:31025/
服務網關:Gateway
Gateway為網格內服務提供負載均衡器,提供以下功能:
•L4-L7的負載均衡
•對外的mTLS
Gateway根據流入流出方向分為:
•IngressGateway:接收外部訪問,並將流量轉發到網格內的服務。
•EgressGateway:網格內服務訪問外部應用。
部署bookinfo 微服務示例
Bookinfo 應用分為四個單獨的微服務:
•productpage :productpage 微服務會調用details 和reviews 兩個微服務,用來生成頁面。
•details :這個微服務包含了書籍的信息。
•reviews :這個微服務包含了書籍相關的評論。它還會調用ratings 微服務。
•ratings :ratings 微服務中包含了由書籍評價組成的評級信息。
reviews 微服務有3 個版本:
•v1 版本不會調用ratings 服務。
•v2 版本會調用ratings 服務,並使用5個黑色五角星來顯示評分信息。
•v3 版本會調用ratings 服務,並使用5個紅色五角星來顯示評分信息。
kubectl create ns bookinfo kubectl label namespace bookinfo istio-injection=enabled cd istio-1.4.2/samples/bookinfo kubectl apply -f platform/kube/bookinfo.yaml -n bookinfo kubectl get pod -n bookinfo kubectl apply -f networking/bookinfo-gateway.yaml -n bookinfo
訪問地址:http://192.168.0.134:31025/productpage
istio實現灰度發布
主流發布方案:
•藍綠發布
•滾動發布
•灰度發布(金絲雀發布)
•A/B Test
藍綠發布
項目邏輯上分為AB組,在項目升級時,首先把A組從負載均衡中摘除,進行新版本的部署。B組仍然繼續提供服務。A組升級完成上線,B組從負載均衡中摘除。
特點:
•策略簡單
•升級/回滾速度快
•用戶無感知,平滑過渡
缺點:
•需要兩倍以上服務器資源
•短時間內浪費一定資源成本
•有問題影響范圍大
滾動發布
每次只升級一個或多個服務,升級完成后加入生產環境,不斷執行這個過程,直到集群中的全部舊版升級新版本。Kubernetes的默認發布策略。
特點:
•用戶無感知,平滑過渡
缺點:
•部署周期長
•發布策略較復雜
•不易回滾
•有影響范圍較大
灰度發布(金絲雀發布)
只升級部分服務,即讓一部分用戶繼續用老版本,一部分用戶開始用新版本,如果用戶對新版本沒有什么意見,那么逐步擴大范圍,把所有用戶都遷移到新版本上面來。
特點:
•保證整體系統穩定性
•用戶無感知,平滑過渡
缺點:
•自動化要求高
A/B Test
灰度發布的一種方式,主要對特定用戶采樣后,對收集到的反饋數據做相關對比,然后根據比對結果作出決策。用來測試應用功能表現的方法,側重應用的可用性,受歡迎程度等,最后決定是否升級。
基於權重的路由(金絲雀發布)
任務:
1.流量全部發送到reviews v1版本(不帶五角星)
2.將90%的流量發送到reviews v1版本,另外10%的流量發送到reviews v2版本(5個黑色五角星),最后完全切換到v2版本
3.將50%的流量發送到v2版本,另外50%的流量發送到v3版本(5個紅色五角星)
service名稱 端口
1、全部到v1
virtualservice -> subset -> destinationrule定義的subset名稱 -> 根據標簽匹配pod
kubectl apply -f networking/virtual-service-all-v1.yaml -n bookinfo
kubectl apply -f networking/destination-rule-all.yaml -n bookinfo
2、90%v1 10%v2 增加兩個版本權重 virtualservice -> subset
kubectl apply -f networking/virtual-service-reviews-90-10.yaml -n bookinfo
3、50%v2 50%v3 調整權重值
kubectl apply -f networking/virtual-service-reviews-v2-v3.yaml -n bookinfo
基於請求內容的路由(A/B Test)
任務:
1.將特定用戶的請求發送到reviews v2版本(5個黑色五角星),其他用戶則不受影響(v3)
kubectl apply -f networking/virtual-service-reviews-jason-v2-v3.yaml -n bookinfo
一個項目使用istio做灰度發布:
1、使用deployment部署這項目,並增加一個獨立用於區分版本的標簽:version: v1
2、添加istio灰度發布規則(virtualservice、destinationrule)
3、灰度發布准備先將新的版本部署k8s中
可視化監控
•監控指標(Grafana)
•網格可視化(Kiali)
•調用鏈跟蹤(Jaeger)
通過ingressgateway暴露服務
# cat monitor-gateway.yaml --- # 監控指標 apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: grafana-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: grafana spec: hosts: - "grafana.cnntp.cn" gateways: - grafana-gateway http: - route: - destination: host: grafana port: number: 3000 --- # 網格可視化 Kiali apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: kiali-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: kiali spec: hosts: - "kiali.cnntp.cn" gateways: - kiali-gateway http: - route: - destination: host: kiali port: number: 20001 --- # 調用鏈 apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: tracing-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: tracing spec: hosts: - "tracing.cnntp.cn" gateways: - tracing-gateway http: - route: - destination: host: tracing port: number: 80 # kubectl apply -f monitor-gateway.yaml -n istio-system # kubectl get gateway -n istio-system NAME AGE grafana-gateway 18m ingressgateway 7h33m istio-multicluster-egressgateway 7h33m kiali-gateway 18m tracing-gateway 18m
istio解決的問題
1、故障排查
2、應用容錯性
3、應用升級發布
4、系統安全性
我的博客即將搬運同步至騰訊雲+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan