Istio路由基礎教程

ServiceMesher2018-12-07 00:29:56

作者:Mete Atamel 譯者:Jianjun 原文:https://medium.com/google-cloud/istio-routing-basics-14feab3c040e

當學習像Istio這樣的新技術時,我推薦看一看項目自帶的示例。Istio包含了一些示例程序,但都有各種各樣的不足。比如說BookInfo就是很好的一個應用。但是對我來說,它太冗長,服務太多,而且文檔似乎專注於管理BookInfo,而不是從頭構建。另外還有一個小一點的示例-helleworld,但是它僅關注於自動伸縮。

在這篇文章中,我想從基礎講起,並向您展示如何從頭開始構建支持Istio的“HelloWorld”應用程序。要記住的一點是,Istio只管理您應用的流量,應用程序生命週期由底層平臺Kubernetes管理。因此,您需要了解容器和Kubernetes基礎知識,並且需要了解Istio 路由原語,例如Gateway,VirtualService,DestinationRule。我假設大多數人都知道容器和Kubernetes基礎知識。我將在本文中專注於介紹Istio 路由。

基本步驟

這些大致是創建Istio“HelloWorld”應用程序的步驟:

  1. Kubernetes集群並安裝帶有自動sidecar注入的Istio。

  2. 使用您選擇的語言創建一個HelloWorld應用程序,基於這個程序創建一個Docker鏡像並將其推送到公共圖像存儲庫。

  3. 為容器創建Kubernetes Deployment和Service。

  4. 創建Gateway以啟用到群集的HTTP(S)流量。

  5. 創建VirtualService以通過Gateway公開Kubernetes服務。

  6. (可選)如果要創建應用程序的多個版本,請創建DestinationRule以定義可從VirtualService引用的子集。

  7. (可選)如果要從服務網格調用外部服務,請創建ServiceEntry。

我不會在本文中介紹步驟1和2,因為它們不是Istio特有的。 如果您需要有關這些步驟的幫助,可以查看我在本文末尾提到的codelabs。 第3步也不是Istio特定的,但它是其他一切的先決條件,所以我們從那開始。

Deployment和Service

正如我所提到的,應用程序生命週期由Kubernetes管理。 因此,您需要從創建Kubernetes Deployment和Service開始。我有一個容器化的ASP.NET核心應用程序,容器鏡像我已經推送到谷歌容器註冊表。 讓我們從創建一個aspnetcore.yaml文件開始:

  1. apiVersion: v1

  2. kind: Service

  3. metadata:

  4.  name: aspnetcore-service

  5.  labels:

  6.    app: aspnetcore

  7. spec:

  8.  ports:

  9.  - port: 8080

  10.    name: http

  11.  selector:

  12.    app: aspnetcore

  13. ---

  14. apiVersion: extensions/v1beta1

  15. kind: Deployment

  16. metadata:

  17.  name: aspnetcore-v1

  18. spec:

  19.  replicas: 1

  20.  template:

  21.    metadata:

  22.      labels:

  23.        app: aspnetcore

  24.        version: v1

  25.    spec:

  26.      containers:

  27.      - name: aspnetcore

  28.        image: gcr.io/istio-project-212517/hello-dotnet:v1

  29.        imagePullPolicy: Always #IfNotPresent

  30.        ports:

  31.        - containerPort: 8080

創建deployment和service:

  1. $ kubectl apply -f aspnetcore.yaml

  2. service "aspnetcore-service" created

  3. deployment.extensions "aspnetcore-v1" created

到現在為止還沒有專門講到Istio。

Gateway

我們現在可以回到Istio路由了。首先,我們需要為服務網格啟用HTTP / HTTPS流量。 為此,我們需要創建一個Gateway。 Gateway描述了在網絡邊緣運行的負載均衡器,用於接收傳入或傳出的HTTP / TCP連接。

讓我們創建一個aspnetcore-gateway.yaml文件:

  1. apiVersion: networking.istio.io/v1alpha3

  2. kind: Gateway

  3. metadata:

  4.  name: aspnetcore-gateway

  5. spec:

  6.  selector:

  7.    istio: ingressgateway # use istio default controller

  8.  servers:

  9.  - port:

  10.      number: 80

  11.      name: http

  12.      protocol: HTTP

  13.    hosts:

  14.    - "*"

創建Gateway:

  1. $ kubectl apply -f aspnetcore-gateway.yaml

  2. gateway.networking.istio.io "aspnetcore-gateway" created

我們已經為集群啟用了HTTP流量。 我們需要將之前創建的Kubernetes服務映射到Gateway。 我們將使用VirtualService執行此操作。

VirtualService

VirtualService實際上將Kubernetes服務連接到Istio網關。 它還可以執行更多操作,例如定義一組流量路由規則,以便在主機被尋址時應用,但我們不會深入介紹這些細節。

讓我們創建一個aspnetcore-virtualservice.yaml文件:

  1. apiVersion: networking.istio.io/v1alpha3

  2. kind: VirtualService

  3. metadata:

  4.  name: aspnetcore-virtualservice

  5. spec:

  6.  hosts:

  7.  - "*"

  8.  gateways:

  9.  - aspnetcore-gateway

  10.  http:

  11.  - route:

  12.    - destination:

  13.        host: aspnetcore-service

請注意,VirtualService與特定網關綁定,並定義引用Kubernetes服務的主機。

創建VirtualService:

  1. $ kubectl apply -f aspnetcore-virtualservice.yaml

  2. virtualservice.networking.istio.io "aspnetcore-virtualservice" created

測試app v1版本

現在可以開始測試我們的應用了,首先需要拿到Istio Ingress Gateway的外部IP地址。

  1. $ kubectl get svc istio-ingressgateway -n istio-system

  2. NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP                                                                                                        

  3. istio-ingressgateway   LoadBalancer   10.31.247.41   35.240.XX.XXX

當我們用瀏覽器訪問外部地址時,我們應該看到HelloWorld ASP.NET Core程序。

DestinationRule

在某些時候,您希望將應用更新為新版本。 也許你想分割兩個版本之間的流量。 您需要創建一個DestinationRule來定義那些版本,在Istio中稱為子集。

首先,更新aspnetcore.yaml文件,用v2版本的容器來定義v2的部署(Deployment):

  1. apiVersion: v1

  2. kind: Service

  3. metadata:

  4.  name: aspnetcore-service

  5.  labels:

  6.    app: aspnetcore

  7. spec:

  8.  ports:

  9.  - port: 8080

  10.    name: http

  11.  selector:

  12.    app: aspnetcore

  13. ---

  14. apiVersion: extensions/v1beta1

  15. kind: Deployment

  16. metadata:

  17.  name: aspnetcore-v1

  18. spec:

  19.  replicas: 1

  20.  template:

  21.    metadata:

  22.      labels:

  23.        app: aspnetcore

  24.        version: v1

  25.    spec:

  26.      containers:

  27.      - name: aspnetcore

  28.        image: gcr.io/istio-project-212517/hello-dotnet:v1

  29.        imagePullPolicy: Always #IfNotPresent

  30.        ports:

  31.        - containerPort: 8080

  32. ---

  33. apiVersion: extensions/v1beta1

  34. kind: Deployment

  35. metadata:

  36.  name: aspnetcore-v2

  37. spec:

  38.  replicas: 1

  39.  template:

  40.    metadata:

  41.      labels:

  42.        app: aspnetcore

  43.        version: v2

  44.    spec:

  45.      containers:

  46.      - name: aspnetcore

  47.        image: gcr.io/istio-project-212517/hello-dotnet:v2

  48.        imagePullPolicy: Always #IfNotPresent

  49.        ports:

  50.        - containerPort: 8080

創建一個新的部署(Deployment):

  1. $ kubectl apply -f aspnetcore.yaml

  2. service "aspnetcore-service" unchanged

  3. deployment.extensions "aspnetcore-v1" unchanged

  4. deployment.extensions "aspnetcore-v2" created

如果刷新瀏覽器,你可以看到VirtualService 在v1 和v2 版本之間切換:

這個結果是預料之中的,因為這兩個版本都暴露在相同的Kubernetes服務之後:aspnetcore-service。

如果您想將服務僅限於v2該怎麼辦? 可以通過在VirtualService中指定子集來完成,但我們需要首先在DestinationRules中定義這些子集。 DestinationRule本質上將標籤映射到Istio子集。

創建一個aspnetcore-destinationrule.yaml文件:

  1. apiVersion: networking.istio.io/v1alpha3

  2. kind: DestinationRule

  3. metadata:

  4.  name: aspnetcore-destinationrule

  5. spec:

  6.  host: aspnetcore-service

  7.  trafficPolicy:

  8.    tls:

  9.      mode: ISTIO_MUTUAL

  10.  subsets:

  11.  - name: v1

  12.    labels:

  13.      version: v1

  14.  - name: v2

  15.    labels:

  16.      version: v2

創建DestinnationRule:

  1. $ kubectl apply -f aspnetcore-destinationrule.yaml

  2. destinationrule.networking.istio.io "aspnetcore-destinationrule" created

現在,你可以在VirtualService指向v2子集:

  1. apiVersion: networking.istio.io/v1alpha3

  2. kind: VirtualService

  3. metadata:

  4.  name: aspnetcore-virtualservice

  5. spec:

  6.  hosts:

  7.  - "*"

  8.  gateways:

  9.  - aspnetcore-gateway

  10.  http:

  11.  - route:

  12.    - destination:

  13.        host: aspnetcore-service

  14.         subset: v2

更新VirtualService:

  1. $ kubectl apply -f aspnetcore-virtualservice.yaml

  2. virtualservice.networking.istio.io "aspnetcore-virtualservice" configured

現在再刷新瀏覽器,你應該只會看到v2版本的內容了。

ServiceEntry

最後我大概提一下ServiceEntry. 所有外部流量在Istio中都是默認被阻斷了的,如果你需要就需要創建一個ServiceEntry來列出所有的已經啟用外部流量的協議和主機。你可以從這裡瞭解更多信息,我在這篇文章中就不多做闡述了。

希望這篇文章對你有所助益!如果你還想了解更多,這裡有一個系列更詳細的闡述了這篇文章提到的所有概念和解釋:

  • Deploy ASP.NET Core app to Google Kubernetes Engine with Istio (Part 1)

  • Deploy ASP.NET Core app to Google Kubernetes Engine with Istio (Part 2)

相關閱讀推

教程|使用Istio實現一個Service Mesh以簡化微服務間的通信模式

推薦|目前最完整的Istio Service Mesh示例教程彙總

VMWare 開源團隊講述服務網格的未來Part 2:Istio 1.0之後何去何從?

雲端設計平臺Coohom在生產環境中使用istio的經驗與實踐

Istio微服務平臺集成實踐

Istio

IBM Istio

  • 111 Istio

  • 118 Istio上手

  • 1115 Istio

  • 11月22日 Envoy

  • 1129 使Istio

  • 126 Istio mixer -

  • 1213 Istio

  • 1220 Istio使Serverless knative

  • IBMIstio

點擊【閱讀原文】跳轉到ServiceMesher網站上瀏覽可以查看文中的鏈接。

  • SOFAMesh(https://github.com/alipay/sofa-mesh)基於Istio的大規模服務網格解決方案

  • SOFAMosn(https://github.com/alipay/sofa-mosn)使用Go語言開發的高性能Sidecar代理

合作社區

參與社區

以下是參與ServiceMesher社區的方式,最簡單的方式是聯繫我!

  • 加入微信交流群:關注本微信公眾號後訪問主頁右下角有獲取聯繫方式按鈕,添加好友時請註明姓名-公司

  • 社區網址:http://www.servicemesher.com

  • Slack:https://servicemesher.slack.com (需要邀請才能加入)

  • GitHub:https://github.com/servicemesher

  • Istio中文文檔進度追蹤:https://github.com/servicemesher/istio-official-translation

  • Twitter: https://twitter.com/servicemesher

  • 提供文章線索與投稿:https://github.com/servicemesher/trans


閱讀原文

TAGS: