微服務治理istio


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM