Istio Routing极简教程

《Istio Routing极简教程》

在学习像Istio这样的新技术时,看一下示例应用程序总是一个好主意。 Istio repo有一些示例[1]应用程序,但它们似乎有各种不足。 文档中的BookInfo是一个很好的示例。 但是,对于我而言,它太冗长,服务太多,而且文档似乎专注于管理BookInfo应用程序,而不是从头开始构建。 有一个较小的helloworld例子,但它更多的是关于自动伸缩而不是其他。
在这篇文章中,我想介绍一下基础知识,并展示如何从头开始构建支持Istio的“HelloWorld”应用程序。 要记住的一点是,Istio只管理你应用的流量。 在这种情况下,应用程序生命周期由底层平台Kubernetes管理。 因此,你需要了解容器和Kubernetes基础知识,并且需要了解Istio Routing原语,例如Gateway,VirtualService,DestinationRule。 我假设大多数人都知道容器和Kubernetes基础知识。 我将在本文中专注于Istio Routing。
基础步骤

《Istio Routing极简教程》

以下这些大致就是你需要遵循的,以获得Istio的“HelloWorld”应用程序的步骤:
  1. 创建一个Kubernetes集群并安装带有sidecare自动注入的Istio。

  2. 使用你选择的语言创建Hello World应用程序,创建Docker镜像并将其推送到公共镜像仓库。

  3. 为你的容器创建Kubernetes Deployment和Service。

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

  5. 创建VirtualService[2],通过Gateway公开Kubernetes服务。

  6. (可选)如果要创建多个版本应用程序,请创建DestinationRule[3]以定义可从VirtualService引用的subsets。

  7. (可选)如果要在服务网格外部调用其他外部服务,请创建ServiceEntry[4]。

我不会在本文中介绍步骤1和2,因为它们不是特定于Istio的。 如果您需要有关这些步骤的帮助,可以查看我在本文末尾提到的文章。 第3步也不是Istio特定的,但它是其他一切的先决条件,所以让我们从那开始。
Deployment和Service

《Istio Routing极简教程》

正如我所提到的,应用程序生命周期由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 Routing极简教程》

我们现在可以开始研究Istio Routing。 首先,我们需要为服务网格启用HTTP/HTTPS流量。 为此,我们需要创建一个网关。 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

《Istio Routing极简教程》

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

测试V1版本APP

《Istio Routing极简教程》

我们准备测试我们的应用程序了。 我们需要获取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

当我们在浏览器中打开 EXTERNAL-IP时,我们应该看到HelloWorld ASP.NET Core应用程序: 
《Istio Routing极简教程》
DestinationRule

《Istio Routing极简教程》

在某些时候,你希望将应用更新为新版本。 也许你想分割两个版本之间的流量。你需要创建一个DestinationRule来定义是哪些版本,在Istio中称为subset。
首先,更新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

如果使用EXTERNAL-IP刷新浏览器,您将看到应用程序的v1和v2版本交替出现:
 
《Istio Routing极简教程》
《Istio Routing极简教程》
这是符合预期的,因为两个版本都暴露在相同的Kubernetes服务之后:aspnetcore-service。
如果您想将服务仅指向v2,该怎么办? 这可以通过在VirtualService中指定subset来完成,但我们需要首先在DestinationRules中定义这些subset。DestinationRule本质上是将标签映射到Istio的subset。
创建一个 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

创建DestinationRule:

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

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

现在你可以从VirtualService来引用v2 subset:

  
  
  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

如果你现在继续浏览EXTERNAL-IP,您现在应该只能看到应用程序的v2版本。
ServiceEntry

《Istio Routing极简教程》

我想在Istio Routing中提到的最后一件事是ServiceEntry。默认情况下,Istio中的所有外部流量都被阻止。如果要启用外部流量,则需要创建ServiceEntry以列出为外部流量启用的协议和主机。我不会在这篇文章中展示一个例子,但你可以在这里[4]阅读更多相关内容。
希望这篇文章对你有用!如果您想了解更多信息,可以使用codelab系列以下两部分,其中所有这些概念和更多内容将在逐步的详细教程中进行说明:
  • https://codelabs.developers.google.com/codelabs/cloud-istio-aspnetcore-part1

  • https://codelabs.developers.google.com/codelabs/cloud-istio-aspnetcore-part2

相关链接:
  1. https://github.com/istio/istio/tree/master/samples

  2. https://istio.io/docs/reference/config/istio.networking.v1alpha3/#VirtualService

  3. https://istio.io/docs/reference/config/istio.networking.v1alpha3/#DestinationRule

  4. https://istio.io/docs/reference/config/istio.networking.v1alpha3/#ServiceEntry

原文链接:https://medium.com/google-cloud/istio-routing-basics-14feab3c040e
    原文作者:小蜜蜂
    原文地址: https://juejin.im/entry/5bed4ed65188252c7e27bc09
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞