返回顶部
首页 > 资讯 > 精选 >kubernetes中如何实现Istio流量管理
  • 221
分享到

kubernetes中如何实现Istio流量管理

2023-06-04 16:06:33 221人浏览 泡泡鱼
摘要

这篇文章主要为大家展示了“kubernetes中如何实现Istio流量管理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“kubernetes中如何实现Istio流量管理”这篇文章吧。一:简介Is

这篇文章主要为大家展示了“kubernetes中如何实现Istio流量管理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“kubernetes中如何实现Istio流量管理”这篇文章吧。

一:简介

Istio 提供了一个简单的配置模型,用来控制 api 调用以及应用部署内多个服务之间的四层通信。运维人员可以使用这个模型来配置服务级别的属性,这些属性可以是断路器、超时、重试,以及一些普通的持续发布任务,例如金丝雀发布、A/B 测试、使用百分比对流量进行控制,从而完成应用的逐步发布等。

例如,将 reviews 服务 100% 的传入流量发送到 v1 版本,这一需求可以用下面的规则来实现:

apiVersion: networking.istio.io/v1alpha3    kind: VirtualServicemetadata:  name: reviewsspec:  hosts:  - reviews  Http:  - route:    - destination:        host: reviews                subset: v1

这个配置的用意是,发送到 reviews 服务(在 host 字段中标识)的流量应该被路由到 reviews 服务实例的 v1 子集中。路由中的 subset 制定了一个预定义的子集名称,子集的定义来自于目标规则配置

apiVersion: networking.istio.io/v1alpha3      kind: DestinationRulemetadata:      name: reviewsspec:      host: reviews        subsets:      - name: v1          labels:      version: v1        - name: v2          labels:      version: v2

子集中会指定一或多个标签,用这些标签来区分不同版本的实例。假设在 Kubernetes 上的 Istio 服务网格之中有一个服务,version: v1 代表只有标签中包含 “version:v1” 的 Pod 才会收到流量。

规则可以使用 istioctl 客户端工具 进行配置,如果是 Kubernetes 部署,还可以使用 kubectl 命令完成同样任务,但是只有 istioctl 会在这个过程中对模型进行检查,所以我们推荐使用 istioctl。在配置请求路由任务中包含有配置示例。

Istio 中包含有四种流量管理配置资源,分别是 VirtualService、DestinationRule、ServiceEntry、以及 Gateway。下面会讲一下这几个资源的一些重点。在网络参考中可以获得更多这方面的信息。

二:Virtual Services

Virtual Services在Istio服务网格中定义了对服务的请求如何进行路由控制。例如一个 Virtual Service 可以把请求路由到不同版本,甚至是可以路由到一个完全不同于请求要求的服务上去。路由可以用很多条件进行判断,例如请求的源和目的、HTTP 路径和 Header 以及各个服务版本的权重等。

  1. 路由规则定义

    路由规则对应着一或多个用 VirtualService 配置指定的请求目的主机。这些主机可以是、也可以不是实际的目标负载,甚至可以不是一个网格内可路由的服务。例如要给到 reviews 服务的请求定义路由规则,可以使用内部的名称 reviews,也可以用域名 bookinfo.com,VirtualService 可以这样使用 host 字段:

    hosts:

     - reviews

      - bookinfo.com

    host 字段用显示或者隐式的方式定义了一或多个完全限定名(FQDN)。上面的 reviews,会隐式的扩展成为特定的 FQDN,例如在 Kubernetes 环境中,全名会从 VirtualService 所在的集群和命名空间中继承而来(比如说 reviews.default.svc.cluster.local)

 2.根据来源或 Header 制定规则

a.根据特定用户进行限定。例如,可以制定一个规则,只对来自 reviews 服务的 Pod 生效

apiVersion: networking.istio.io/v1alpha3  kind: VirtualServicemetadata:  name: ratingsspec:  hosts:  - ratings    http:  - match:      sourceLabels:        app: reviews    ...

sourceLabels 的值依赖于服务的实现。比如说在 Kubernetes 中,跟服务的 Pod 选择标签一致。

b.根据调用方的特定版本进行限定。例如下面的规则对前一个例子进行修改,reviews 服务的 v2 版本发出的请求才会生效:

apiVersion: networking.istio.io/v1alpha3  kind: VirtualServicemetadata:  name: ratingsspec:  hosts:  - ratings    http:  - match:    - sourceLabels:        app: reviews                version: v2    ...

c.根据 HTTP Header 选择规则。下面的规则只会对包含了 end-user 头,且值为 jason 的请求生效:

apiVersion: networking.istio.io/v1alpha3  kind: VirtualServicemetadata:  name: reviewsspec:  hosts:    - reviews    http:  - match:    - headers:        end-user:          exact: jason    ...

3.在服务之间分拆流量

每个路由规则都需要对一或多个有权重的后端进行甄别并调用合适的后端。每个后端都对应一个特定版本的目标服务,服务的版本是依靠标签来区分的。如果一个服务版本包含多个注册实例,那么会根据为该服务定义的负载均衡策略进行路由,缺省策略是 round-robin。

例如下面的规则会把 25% 的 reviews 服务流量分配给 v2 标签;其余的 75% 流量分配给 v1:

apiVersion: networking.istio.io/v1alpha3  kind: VirtualServicemetadata:  name: reviewsspec:  hosts:    - reviews    http:  - route:    - destination:        host: reviews                subset: v1              weight: 75    - destination:        host: reviews                subset: v2              weight: 25

4.超时和重试

缺省情况下,HTTP 请求的超时设置为 15 秒,可以使用路由规则来覆盖这个限制:

apiVersion: networking.istio.io/v1alpha3  kind: VirtualServicemetadata:  name: ratingsspec:  hosts:    - ratings    http:  - route:    - destination:        host: ratings                subset: v1            timeout: 10s

5.在请求中进行错误注入

在根据路由规则向选中目标转发 http 请求的时候,可以向其中注入一或多个错误。错误可以是延迟,也可以是退出。

下面的例子在目标为 ratings:v1 服务的流量中,对其中的 10% 注入 5 秒钟的延迟。

apiVersion: networking.istio.io/v1alpha3  kind: VirtualServicemetadata:  name: ratingsspec:  hosts:  - ratings    http:  - fault:      delay:        percent: 10        fixedDelay: 5s      route:    - destination:        host: ratings                subset: v1

三:DestinationRule

1.目标规则

在请求被 VirtualService 路由之后,DestinationRule 配置的一系列策略就生效了。这些策略包含断路器、负载均衡以及 TLS 等的配置内容。DestinationRule 还定义了对应目标主机的可路由 subset(例如有命名的版本)。VirtualService 在向特定服务版本发送请求时会用到这些子集。

apiVersion: networking.istio.io/v1alpha3  kind: DestinationRulemetadata:  name: reviewsspec:  host: reviews  trafficPolicy:    loadBalancer:      simple: RANDOM        subsets:  - name: v1          labels:      version: v1        - name: v2          labels:      version: v2          trafficPolicy:      loadBalancer:        simple: ROUND_ROBIN          - name: v3            labels:        version: v3

2.断路器

可以用一系列的标准,例如连接数和请求数限制来定义简单的断路器。

例如下面的 DestinationRule 给 reviews 服务的 v1 版本设置了 100 连接的限制:

apiVersion: networking.istio.io/v1alpha3  kind: DestinationRulemetadata:  name: reviewsspec:  host: reviews    subsets:  - name: v1      labels:      version: v1      trafficPolicy:      connectionPool:        tcp:          maxConnections: 100

3.目标规则的评估

和路由规则类似,这些策略也是和特定的 host 相关联的,如果指定了 subset,那么具体生效的 subset 的决策是由路由规则来决定的。

规则评估的第一步,是确认 VirtualService 中所请求的主机相对应的路由规则(如果有的话),这一步骤决定了将请求发往目标服务的哪一个 subset(就是特定版本)。下一步,被选中的 subset 如果定义了策略,就会开始是否生效的评估。

这一算法需要留心是,为特定 subset 定义的策略,只有在该 subset 被显式的路由时候才能生效。例如下面的配置,只为 review 服务定义了规则(没有对应的 VirtualService 路由规则)。

apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:  name: reviewsspec:  host: reviews  subsets:  - name: v1    labels:      version: v1    trafficPolicy:      connectionPool:        tcp:         maxConnections: 100

既然没有为 reviews 服务定义路由规则,那么就会使用缺省的 round-robin 策略,偶尔会请求到 v1 实例,如果只有一个 v1 实例,那么所有请求都会发送给它。然而上面的策略是永远不会生效的,这是因为,缺省路由是在更底层完成的任务,策略引擎无法获知最终目的,也无法为请求选择匹配的 subset 策略。

有两种方法来解决这个问题。可以把路由策略提高一级,要求他对所有版本生效:

apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:  name: reviewsspec:  host: reviews  trafficPolicy:    connectionPool:      tcp:        maxConnections: 100  subsets:  - name: v1      labels:      version: v1

还有一个更好的方法,就是为服务定义路由规则,例如给 reviews:v1 加入一个简单的路由规则:

apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: reviewsspec:  hosts:  - reviews  http:  - route:    - destination:        host: reviews                subset: v1

虽然 Istio 在没有定义任何规则的情况下,能将所有来源的流量发送给所有版本的目标服务。然而一旦需要对版本有所区别,就需要制定规则了。从一开始就给每个服务设置缺省规则,是 Istio 世界里推荐的最佳实践。

四:Service Entries

Istio 内部会维护一个服务注册表,可以用 ServiceEntry 向其中加入额外的条目。通常这个对象用来启用对 Istio 服务网格之外的服务发出请求。例如下面的 ServiceEntry 可以用来允许外部对 *.foo.com 域名上的服务主机的调用。

apiVersion: networking.istio.io/v1alpha3  kind: ServiceEntrymetadata:  name: foo-ext-svcspec:  hosts:  - *.foo.com      ports:  - number: 80    name: http        protocol: HTTP      - number: 443    name: https        protocol: HTTPS

五:Gateway

Gateway 为 HTTP/TCP 流量配置了一个负载均衡,多数情况下在网格边缘进行操作,用于启用一个服务的 Ingress 流量。

和 Kubernetes Ingress 不同,Istio Gateway 只配置四层到六层的功能(例如开放端口或者 TLS 配置)。绑定一个 VirtualService 到 Gateway 上,用户就可以使用标准的 Istio 规则来控制进入的 HTTP 和 TCP 流量。

例如下面提供一个简单的 Gateway 代码,配合一个负载均衡,允许外部针对主机 bookinfo.com 的 https 流量:

apiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata:  name: bookinfo-gatewayspec:  servers:  - port:      number: 443      name: https      protocol: HTTPS    hosts:    - bookinfo.com    tls:      mode: SIMPLE      serverCertificate: /tmp/tls.crt      privateKey: /tmp/tls.key

要为 Gateway 配置对应的路由,必须为定义一个同样 host 定义的 VirtualService,其中用 gateways 字段来绑定到定义好的 Gateway 上:

apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: bookinfospec:  hosts:    - bookinfo.com  gateways:  - bookinfo-gateway # <---- 绑定到 Gateway  http:  - match:    - uri:        prefix: /reviews    route:    ...

虽然主要用于管理 Ingress 流量,Gateway 还可以用在纯粹的内部服务之间或者 egress 场景下使用。不管处于什么位置,所有的网关都可以以同样的方式进行配置和控制。

以上是“kubernetes中如何实现Istio流量管理”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: kubernetes中如何实现Istio流量管理

本文链接: https://lsjlt.com/news/238624.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • kubernetes中如何实现Istio流量管理
    这篇文章主要为大家展示了“kubernetes中如何实现Istio流量管理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“kubernetes中如何实现Istio流量管理”这篇文章吧。一:简介Is...
    99+
    2023-06-04
  • kubernetes中实现Istio流量管理有什么好处
    小编给大家分享一下kubernetes中实现Istio流量管理有什么好处,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一:简介Istio流量管理的核心组件是Pil...
    99+
    2023-06-04
  • Istio流量管理能力介绍
    1      Istio是什么?Istio 1.0版本于8月1号凌晨准点发布,核心特性已支持上生产环境,各大微信公众号、博客纷纷发文转载。那么Istio到底是什么?能解决问题什么? Ist...
    99+
    2023-06-04
  • Istio 多集群之间的流量管理
    本篇文章向大家介绍《Istio 多集群之间的流量管理》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。问题内容我有几个 Kubernetes 集群。由于公司的安全问题,只有A集群A的服务才可...
    99+
    2024-04-04
  • kubernetes中Istio实现金丝雀发布原理是什么
    这期内容当中小编将会给大家带来有关kubernetes中Istio实现金丝雀发布原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一:简介    互联网产品用户数量庞大...
    99+
    2023-06-04
  • kubernetes中Istio如何配置请求路由
    这篇文章主要为大家展示了“kubernetes中Istio如何配置请求路由”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“kubernetes中Istio如何配置请求路由”这篇文章吧。一:简介由于...
    99+
    2023-06-04
  • kubernetes中istio-1.0.0如何部署和试用
    小编给大家分享一下kubernetes中istio-1.0.0如何部署和试用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一:简介本文介绍如何在kubernetes1.10.4集群中部署istio-1.0.0 并试用ist...
    99+
    2023-06-04
  • 如何实现批量vps管理
    这篇文章主要介绍了如何实现批量vps管理的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何实现批量vps管理文章都会有所收获,下面我们一起来看看吧。首先,下载解压iis7远程桌面管理工具:点击右上角的【添加】添...
    99+
    2023-06-02
  • kubernetes中如何实现Helm
    这篇文章主要介绍kubernetes中如何实现Helm,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一:简介在Kubernetes上进行容器化部署并非易事,通常需要先研究Docker镜像的运行需求,环境变量等内容,并...
    99+
    2023-06-04
  • 如何实现规模化的Kubernetes CI/CD 流水线
    本篇文章为大家展示了如何实现规模化的Kubernetes CI/CD 流水线,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、背景在近几年,Kubernetes迅速成为了容器编排的事实上的开源标准。...
    99+
    2023-06-04
  • CentOS下Kubernetes存储卷如何管理
    在CentOS下使用Kubernetes管理存储卷通常需要使用持久卷(Persistent Volume)和持久卷声明(Persis...
    99+
    2024-05-09
    CentOS Kubernetes
  • Android编程实现简单流量管理功能实例
    本文实例讲述了Android编程实现简单流量管理功能的方法。分享给大家供大家参考,具体如下: package cn.itcast.mobilesafe.ui; import ...
    99+
    2022-06-06
    流量 Android
  • Golang如何实现流量控制?
    Golang如何实现流量控制? 在网络编程中,流量控制是一项非常重要的技术,用来控制数据的传输速率,以避免网络拥堵和资源浪费。在Golang中,我们可以通过一些内置的库和技术来实现流量...
    99+
    2024-03-07
    golang 实现 流量控制 网络编程
  • 如何理解kubernetes数据卷管理的源码
    本篇文章给大家分享的是有关如何理解kubernetes数据卷管理的源码,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。概述volume是k8s中很重要的一个环节,主要用来存储k8...
    99+
    2023-06-19
  • kubernetes中如何实现Pod健康检查
    小编给大家分享一下kubernetes中如何实现Pod健康检查,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一:前言对Pod的健康状态检查可以通过两类探针来检查:...
    99+
    2023-06-04
  • Kafka中的流式处理如何实现
    Kafka是一个分布式流式处理平台,它可以支持大规模的实时数据处理。Kafka的流式处理功能主要通过Kafka Streams AP...
    99+
    2024-04-02
  • Kubernetes在混合云环境中如何部署与管理
    在混合云环境中部署和管理Kubernetes可以通过以下步骤实现: 确保在所有云服务提供商上都安装了Kubernetes,并且版本...
    99+
    2024-05-08
    Kubernetes
  • 如何理解kubernetes中的Ingress
    如何理解kubernetes中的Ingress,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一:简介Ingress资源对象,用于将不同URL的访问请求转发到后端不同的Ser...
    99+
    2023-06-04
  • Linux服务器中如何实现流量监控MRTG
    本篇文章为大家展示了Linux服务器中如何实现流量监控MRTG,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。MRTGMRTG可以分析网络流量,但是它必须依赖SNMP协议。将收集到的数据生成HTML文...
    99+
    2023-06-05
  • 如何用Java实现疫情人员流动管理系统
    本篇文章给大家分享的是有关如何用Java实现疫情人员流动管理系统,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、项目简述本系统主要实现的功能有:社区疫情流动人员管理系统,住户...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作