zoukankan      html  css  js  c++  java
  • Istio Routing极简教程

    官网文档:

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

    在学习像Istio这样的新技术时,看一下示例应用程序总是一个好主意。 Istio repo有一些示例应用程序,但它们似乎有各种不足。 文档中的BookInfo是一个很好的示例。 但是,对于我而言,它太冗长,服务太多,而且文档似乎专注于管理BookInfo应用程序,而不是从头开始构建。 有一个较小的helloworld例子,但它更多的是关于自动伸缩而不是其他。 在这篇文章中,我想介绍一下基础知识,并展示如何从头开始构建支持Istio的“HelloWorld”应用程序。 要记住的一点是,Istio只管理你应用的流量。 在这种情况下,应用程序生命周期由底层平台Kubernetes管理。 因此,你需要了解容器和Kubernetes基础知识,并且需要了解Istio Routing原语,例如Gateway,VirtualService,DestinationRule。 我假设大多数人都知道容器和Kubernetes基础知识。 我将在本文中专注于Istio Routing。 # 基础步骤 以下这些大致就是你需要遵循的,以获得Istio的“HelloWorld”应用程序的步骤:
    创建一个Kubernetes集群并安装带有sidecare自动注入的Istio。
    使用你选择的语言创建Hello World应用程序,创建Docker镜像并将其推送到公共镜像仓库。
    为你的容器创建Kubernetes Deployment和Service。
    创建Gateway以启用到群集的HTTP(S)流量。
    创建VirtualService,通过Gateway公开Kubernetes服务。
    (可选)如果要创建多个版本应用程序,请创建DestinationRule以定义可从VirtualService引用的subsets。
    (可选)如果要在服务网格外部调用其他外部服务,请创建ServiceEntry。
    我不会在本文中介绍步骤1和2,因为它们不是特定于Istio的。 如果您需要有关这些步骤的帮助,可以查看我在本文末尾提到的文章。 第3步也不是Istio特定的,但它是其他一切的先决条件,所以让我们从那开始。 # Deployment和Service 正如我所提到的,应用程序生命周期由Kubernetes管理。 因此,您需要从创建Kubernetes Deployment和Service开始。 我的情况如下,我有一个容器化的ASP.NET核心应用程序,其镜像我已经推送到谷歌镜像仓库。 让我们从创建一个aspnetcore.yaml文件开始:
    apiVersion: v1
    kind: Service
    metadata:
    name: aspnetcore-service
    labels:
    app: aspnetcore
    spec:
    ports:

    • port: 8080
      name: http
      selector:
      app: aspnetcore

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
    name: aspnetcore-v1
    spec:
    replicas: 1
    template:
    metadata:
    labels:
    app: aspnetcore
    version: v1
    spec:
    containers:
    - name: aspnetcore
    image: gcr.io/istio-project-212517/hello-dotnet:v1
    imagePullPolicy: Always #IfNotPresent
    ports:
    - containerPort: 8080
    创建Deployment和Service:
    $ kubectl apply -f aspnetcore.yaml
    service "aspnetcore-service" created
    deployment.extensions "aspnetcore-v1" created
    到目前为止没有任何特定的针对Istio的内容。 # Gateway 我们现在可以开始研究Istio Routing。 首先,我们需要为服务网格启用HTTP/HTTPS流量。 为此,我们需要创建一个网关。 Gateway描述了在边缘运行的负载均衡,用于接收传入或传出的HTTP/TCP连接。 让我们创建一个aspnetcore-gateway.yaml文件:
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
    name: aspnetcore-gateway
    spec:
    selector:
    istio: ingressgateway # use istio default controller
    servers:

    • port:
      number: 80
      name: http
      protocol: HTTP
      hosts:
      • "*"
        创建Gateway:
        $ kubectl apply -f aspnetcore-gateway.yaml
        gateway.networking.istio.io "aspnetcore-gateway" created
        此时,我们为集群启用了HTTP流量。 我们需要将之前创建的Kubernetes服务映射到Gateway。 我们将使用VirtualService执行此操作。 # VirtualService VirtualService实际上将Kubernetes服务连接到Istio网关。 它还可以执行更多操作,例如定义一组流量路由规则,以便在主机被寻址时应用,但我们不会深入了解这些细节。 让我们创建一个aspnetcore-virtualservice.yaml文件:
        apiVersion: networking.istio.io/v1alpha3
        kind: VirtualService
        metadata:
        name: aspnetcore-virtualservice
        spec:
        hosts:
    • "*"
      gateways:
    • aspnetcore-gateway
      http:
    • route:
      • destination:
        host: aspnetcore-service
        请注意,VirtualService与特定网关绑定,并定义引用Kubernetes服务的主机。 创建VirtualService:
        $ kubectl apply -f aspnetcore-virtualservice.yaml
        virtualservice.networking.istio.io "aspnetcore-virtualservice" created

    测试V1版本APP 我们准备测试我们的应用程序了。 我们需要获取Istio Ingress Gateway的IP地址:

    $ kubectl get svc istio-ingressgateway -n istio-system
    NAME TYPE CLUSTER-IP EXTERNAL-IP
    istio-ingressgateway LoadBalancer 10.31.247.41 35.240.XX.XXX
    当我们在浏览器中打开EXTERNAL-IP时,我们应该看到HelloWorld ASP.NET Core应用程序:
    1.png

    DestinationRule 在某些时候,你希望将应用更新为新版本。 也许你想分割两个版本之间的流量。你需要创建一个DestinationRule来定义是哪些版本,在Istio中称为subset。 首先,更新aspnetcore.yaml文件以使用v2版本的容器定义v2的deployment:

    apiVersion: v1
    kind: Service
    metadata:
    name: aspnetcore-service
    labels:
    app: aspnetcore
    spec:
    ports:

    • port: 8080
      name: http
      selector:
      app: aspnetcore

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
    name: aspnetcore-v1
    spec:
    replicas: 1
    template:
    metadata:
    labels:
    app: aspnetcore
    version: v1
    spec:
    containers:
    - name: aspnetcore
    image: gcr.io/istio-project-212517/hello-dotnet:v1
    imagePullPolicy: Always #IfNotPresent
    ports:
    - containerPort: 8080

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
    name: aspnetcore-v2
    spec:
    replicas: 1
    template:
    metadata:
    labels:
    app: aspnetcore
    version: v2
    spec:
    containers:
    - name: aspnetcore
    image: gcr.io/istio-project-212517/hello-dotnet:v2
    imagePullPolicy: Always #IfNotPresent
    ports:
    - containerPort: 8080
    创建新的Deployment:
    $ kubectl apply -f aspnetcore.yaml
    service "aspnetcore-service" unchanged
    deployment.extensions "aspnetcore-v1" unchanged
    deployment.extensions "aspnetcore-v2" created
    如果使用EXTERNAL-IP刷新浏览器,您将看到应用程序的v1和v2版本交替出现:
    2.png
    3.png
    这是符合预期的,因为两个版本都暴露在相同的Kubernetes服务之后:aspnetcore-service。 如果您想将服务仅指向v2,该怎么办? 这可以通过在VirtualService中指定subset来完成,但我们需要首先在DestinationRules中定义这些subset。 DestinationRule本质上是将标签映射到Istio的subset。 创建一个aspnetcore-destinationrule.yaml文件:
    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
    name: aspnetcore-destinationrule
    spec:
    host: aspnetcore-service
    trafficPolicy:
    tls:
    mode: ISTIO_MUTUAL
    subsets:

    • name: v1
      labels:
      version: v1
    • name: v2
      labels:
      version: v2
      创建DestinationRule:
      $ kubectl apply -f aspnetcore-destinationrule.yaml
      destinationrule.networking.istio.io "aspnetcore-destinationrule" created
      现在你可以从VirtualService来引用v2 subset:
      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
      name: aspnetcore-virtualservice
      spec:
      hosts:
    • "*"
      gateways:
    • aspnetcore-gateway
      http:
    • route:
      • destination:
        host: aspnetcore-service
        subset: v2
        更新VirtualService:
        $ kubectl apply -f aspnetcore-virtualservice.yaml
        virtualservice.networking.istio.io "aspnetcore-virtualservice" configured
        如果你现在继续浏览EXTERNAL-IP,您现在应该只能看到应用程序的v2版本。 # ServiceEntry 我想在Istio Routing中提到的最后一件事是ServiceEntry。默认情况下,Istio中的所有外部流量都被阻止。如果要启用外部流量,则需要创建ServiceEntry以列出为外部流量启用的协议和主机。我不会在这篇文章中展示一个例子,但你可以在这里阅读更多相关内容。 希望这篇文章对你有用!如果您想了解更多信息,可以使用codelab系列以下两部分,其中所有这些概念和更多内容将在逐步的详细教程中进行说明:
        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 Routing Basics(翻译:kelvinji2009)
  • 相关阅读:
    [Jenkins] 批量删除构建历史
    [Android Tips] 32. 解决 Android Device Monitor 在 Mac OS X 卡住
    [Gradle] 查看项目依赖
    [Gradle] 获取 gradle 命令行参数
    [Android Tips] 31.如何将第三库引入的 Permission 删除掉
    [Gradle] 发布构件到本地仓库
    [Android Tips] 30.如何在 Android Studio 中一次性格式化所有代码
    下载安卓应用的历史版本
    设置int、float型数据的输出格式
    头文件limits—各个类型的数据的范围
  • 原文地址:https://www.cnblogs.com/Qing-840/p/11060706.html
Copyright © 2011-2022 走看看