官网文档:

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)

Istio Routing极简教程的更多相关文章

  1. Typora极简教程

    Typora极简教程 ” Markdown 是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber).它允许人们 “使用易读易写的纯文本格式编写文档,然后转换成有效的 HTML 文档.” ...

  2. CentOS安装使用.netcore极简教程(免费提供学习服务器)

    本文目标是指引从未使用过Linux的.Neter,如何在CentOS7上安装.Net Core环境,以及部署.Net Core应用. 仅针对CentOS,其它Linux系统类似,命令环节稍加调整: 需 ...

  3. Asky极简教程:零基础1小时学编程,已更新前8节

    Asky极简架构 开源Asky极简架构.超轻量级.高并发.水平扩展.微服务架构 <Asky极简教程:零基础1小时学编程>开源教程 零基础入门,从零开始全程演示,如何开发一个大型互联网系统, ...

  4. Python 极简教程(八)字符串 str

    由于字符串过于重要,请认真看完并保证所有代码都至少敲过一遍. 对于字符串,前面在数据类型中已经提到过.但是由于字符串类型太过于常用,Python 中提供了非常多的关于字符串的操作.而我们在实际编码过程 ...

  5. Nginx 极简教程(快速入门)

    作者:dunwu github.com/dunwu/nginx-tutorial 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3. 设计模式内容聚合 4.  ...

  6. 【转】Typora极简教程

    Typora极简教程 Typora download ” Markdown 是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber).它允许人们 “使用易读易写的纯文本格式编写文档,然后转 ...

  7. nginx极简教程

    Nginx 极简教程 本项目是一个 Nginx 极简教程,目的在于帮助新手快速入门 Nginx. examples 目录中的示例模拟了工作中的一些常用实战场景,并且都可以通过脚本一键式启动,让您可以快 ...

  8. NodeJS 极简教程 <1> NodeJS 特点 & 使用场景

    NodeJS 极简教程 <1> NodeJS 特点 & 使用场景 田浩 因为看开了所以才去较劲儿.   1. NodeJS是什么 1.1 Node.js is a JavaScri ...

  9. 自制 os 极简教程1:写一个操作系统有多难

    为什么叫极简教程呢?听我慢慢说 不知道正在阅读本文的你,是否是因为想自己动手写一个操作系统.我觉得可能每个程序员都有个操作系统梦,或许是想亲自动手写出来一个,或许是想彻底吃透操作系统的知识.不论是为了 ...

随机推荐

  1. centos--该虚拟机似乎正在使用中。 如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权。否则,请按“取消(C)”按钮以防损坏。

    centos非正常关机,导致无法正常启动的问题 该虚拟机似乎正在使用中. 如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权.否则,请按“取消(C)”按钮以防损坏. 解决方案: 1. 找 ...

  2. HTML连载48-清除浮动的其中两种方式

    一.清除浮动的方式一 给前面一个父元素设置高度,​注意:企业开发中能不写高度就不写高度 <!DOCTYPE html> <html lang="en"> & ...

  3. 简单node服务器demo,麻雀虽小,五脏俱全

    //本服务器要实现的功能如下: //1.静态资源服务器(能读取静态资源) //2.能接收get请求,并能处理参数 //3.能接收post请求,并能处理参数 const http = require(' ...

  4. vue 渐变 进度条 progress

    废话 不多少说 ,直接上代码 新建文件 gradual-progress.vue <!-- * @Author: gfc * @Date: 2019-11-07 14:00:11 * @Last ...

  5. Java8新特性——集合底层源码实现的改变

    ArrayList 源码分析: jdk7: ArrayList list = new ArrayList();//初始化一个长度为10的Object[] elementData sysout(list ...

  6. 转caffe scale layer

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u011681952/article/det ...

  7. Spring MVC HTTP406 Not Acceptable

    今天在搞前后端分离用springmvc传递json数据的时候,第一步就卡主了,本着完事开头难的做法(哈哈哈), 报了个406?什么鬼? 百度之后发现很多人也同我一样遇到过这个问题,记录下. 找到的处理 ...

  8. .Net与其他公司接口对接心得

    第一次搞这玩意,心里有点紧张,万事开头难,第一次搞过之后,以后就容易了,所以将这次经历记录下来. 这里我们暂且把对接的公司叫A吧,A公司会提供一个接口对接说明,下面是A公司提供的接口说明 请求内容说明 ...

  9. 你不知道的JS第一卷

    这两天,开始看你不知道的JavaScript,第一卷.

  10. UIImageView三种方式 和 位置分布

    typedef NS_ENUM(NSInteger, UIViewContentMode) { UIViewContentModeScaleToFill, //为将图片按照整个区域进行拉伸(会破坏图片 ...