istio:2、流量成形微服務連接

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/配置外部服務

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章