istio: 二、流量成形微服務連接
原文地址:Traffic Shaping Microservices Connections
在這個場景中,您將學習如何使用istio來控制和管理基礎設施中的流量。
您將學習如何使用以下istio對象:
入口和網關
虛擬服務
目標規則
ingress和engress
步驟1-BookInfo示例應用程序
在這個場景中,我們將使用istio bookinfo示例應用程序。應用程序由四個微服務組成:
- [ ] ProductPage微服務是主頁,使用詳細信息填充,並查看微服務。
- [ ] 包含bookinfo的詳細微服務信息。
- [ ] 點評微服務包含書評。它使用評級微服務進行星級評級。
Ratings Microservice包含書評的書評。 -
[ ] 部署包括Reviews微服務的三個版本,以展示不同的行爲和路由:
- 版本v1不調用分級服務。
- 版本2調用評級服務並將每個評級顯示爲1到5個黑星。
- 版本v3調用評級服務,並將每個評級顯示爲1到5個紅星。
服務使用DNS通過HTTP進行通信以進行服務發現。架構概述如下所示。
BookInfo架構
應用程序不瞭解任何有關istio、Kubernetes、metrics的信息。它可以部署到任何系統上。
部署bookinfo
Isito已經在Kubernetes集羣上運行。在繼續之前部署示例bookinfo應用程序。
kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
應用程序定義在GitHub上可用
部署之後,所有的pods都應該在運行。
kubectl get pods
當pods啓動時,您可能會看到在創建容器時發生的啓動步驟。這將配置sidecar,以便能在istio服務網格中處理應用程序的流量管理和身份驗證。
步驟2-istio基礎設施
部署應用程序後,我們的kubernetes集羣已經安裝了istio。部署的組件包括:
-
[ ] Pilot-負責在運行時配置Envoy和Mixer。
-
[ ] Proxy/Envory-每個微服務的SideCar代理,用於處理集羣中服務之間以及從服務到外部服務之間的進出流量。代理構成了一個安全的微服務網格,提供了一組豐富的功能,比如:發現、豐富的第7層路由、斷路器、策略實施和遙測記錄/報告功能。
-
[ ] Mixer-在基礎設施後端創建一個可移植層。在基礎結構級別實施諸如ACL、速率限制、配額、身份驗證、請求跟蹤和遙測收集等策略。
-
[ ] citadel/istio ca-通過TLS保護服務到服務的通信。提供一個密鑰管理系統來自動生成密鑰和證書、分發、旋轉和撤銷。
-
[ ] ingress/Egress-爲入站和出站外部流量配置基於路徑的路由。
- [ ] 控制平面API-基礎編排器,如Kubernetes或Hashicorp Nomad。
istio架構如下圖所示。
通過組合上述組件,istio可以處理我們的微服務流量,並控制我們的服務通信方式。
步驟3-ingress
要使應用程序對外部世界可用,需要部署網關。在kubernetes中,這是使用ingress管理的,該ingress指定應該在集羣外部公開的服務。
在istio中,istio入口網關通過配置來定義這一點。網關允許將諸如監視和路由規則等istio功能應用於進入集羣的流量。
kubectl get svc --all-namespaces | grep istio-ingressgateway
一個擴展網關的的例子:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
因爲我們對主機使用通配符(*)並且只使用一個路由規則,所以從該網關到前端服務的所有流量(如virtualservice中定義的那樣)
cat samples/bookinfo/networking/bookinfo-gateway.yaml
此文件包含兩個對象。第一個對象是一個網關,它允許我們綁定到集羣中存在的“istio entressgateway”。下一步將討論第二個對象virtualservice。
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
要查看系統上的所有網關,請運行
kubectl get gateway
步驟4-虛擬服務
virtualservice定義了一組在主機尋址時要應用的流量路由規則。
https://istio.io/docs/reference/config/istio.networking.v1alpha3/#VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
然後,destinationrule將處理virtualservice流量,destinationrule將基於最小連接進行負載平衡。
對於我們的BookInfo應用程序,因爲我們對主機使用通配符(*)並且只使用一個路由規則,所以從該網關到前端服務的所有流量。這是通過網關和虛擬服務的組合來定義的。
cat samples/bookinfo/networking/bookinfo-gateway.yaml
當您訪問應用程序時,流量將首先由我們的網關處理,並由虛擬服務定義規則來解釋哪個kubernetes pod應該處理請求。
可在http://environments.katacoda.com:31380/productpage訪問該應用程序。
步驟5-目標規則
當virtualservice配置流量時,destinationrule定義應用於路由發生後服務的流量的策略。
下面的規則定義負載均衡器應該使用最少的連接,即通過最少的活動連接來路由POD。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: LEAST_CONN
下面的規則表明應該根據pod標籤v1、v2和v3在三個不同的版本之間實現負載平衡。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
可以使用TLS加密:
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
應用默認目標規則
在使用istio控制BookInfo版本路由之前,需要在目標規則中定義可用的版本,稱爲子集。
cat samples/bookinfo/networking/destination-rule-all-mtls.yaml
kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml
kubectl get destinationrules
現在,當您訪問產品頁面時,將顯示評論。因爲在我們的目標規則中定義了三個版本
默認情況下,它將在所有可用的評審服務之間進行負載平衡。
步驟6-部署虛擬服務
對於BookInfo應用程序,我們提供了三個不同版本的Reviews服務。評論服務提供了一個簡短的評論,以及在較新版本中的星級評定。
默認情況下,isito和kubernetes將在所有可用服務之間負載平衡請求。我們可以使用虛擬服務來控制我們的流量,並強制它只能由v1處理。
cat samples/bookinfo/networking/virtual-service-all-v1.yaml
該文件爲所有應用程序定義虛擬服務。對於每個應用程序,都定義了一個主機(如productpage),它是其他應用程序如何與服務通信的DNS條目。根據對該主機的請求,路由定義了目標,以及哪些pods應該處理請求。
kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
當您訪問產品頁面時,您將只看到來自我們v1服務的評論。
列出所有路由
kubectl get virtualservices and kubectl get virtualservices reviews -o yaml
步驟7-更新虛擬服務
與所有Kubernetes對象一樣,可以更新虛擬服務,這將改變我們在系統中處理流量的方式。
此虛擬服務將所有流量發送到v2分級服務,這意味着我們的應用程序將返回星級
cat samples/bookinfo/networking/virtual-service-reviews-v2.yaml
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-v2.yaml
當您訪問產品頁面時,現在將看到v2的結果。
這些虛擬服務成爲控制和塑造系統內流量的核心。
第8步-Egress
雖然BookInfo應用程序不需要調用外部應用程序,但某些應用程序需要調用外部應用程序。
istio以安全爲中心,這意味着應用程序在默認情況下無法訪問外部服務。相反,需要配置出口(出站)流量。
部署一個簡單的pod,它將嘗試訪問外部服務。
kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml)
啓動後,連接到容器:
export SOURCE_POD=$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})
kubectl exec -it $SOURCE_POD -c sleep bash
當您嘗試訪問外部服務時,它將返回404。
curl http://httpbin.org/headers -i
我們需要配置出口。退出容器,因爲我們需要部署其他組件。
通過ServiceEntry配置出口。ServiceEntry定義如何訪問外部。
kubectl apply -f /root/istio-1.0.0/serviceEntry.yaml
cat /root/istio-1.0.0/serviceEntry.yaml
重複連接到容器的過程:
kubectl exec -it $SOURCE_POD -c sleep bash
當您嘗試訪問外部服務時,它現在將返回預期的響應。
curl http://httpbin.org/headers -i
在響應中,您還可以識別所有額外的元數據,包括幫助構建度量、可跟蹤性和洞察網絡內部工作。這些將在觀察微服務的istio課程中進行探討。
更多信息,請訪問https://istio.io/docs/tasks/traffic management/egiss/配置外部服務