Istio服务网格:为忙碌人士而生

我最近为Istio做出了一个小贡献,Istio 是一个开源服务网格项目。我的贡献包括为 Istio CLI 的一个命令添加了一些测试。如果你想查看详细信息,可以在此处找到 pull 请求。这不是一个巨大的改变,但它是一个很棒的学习体验。在 Istio 上工作帮助我更深入地理解了服务网格。我很高兴能做出更多贡献。在这篇文章中,我将解释什么是 Istio,它为什么有用以及它是如何工作的。

译自The Istio Service Mesh for People Who Have Stuff to Do | Blog,作者 Luca Cavallin。

从本质上讲,Istio 是一个服务网格。服务网格管理微服务之间的通信,负责处理诸如路由流量、保护通信和提供可观测性等事项。随着微服务数量的增长,管理这些交互会变得很复杂。Istio 自动执行许多这些任务,因此你可以专注于构建应用程序,而不是管理服务之间的通信。

为什么要使用 Istio?

随着架构变得越来越复杂,你将面临新的挑战。服务需要以可靠、安全和高效的方式进行通信。Istio 帮助你在三个关键领域做到这一点:

  1. 管理流量: Istio 使你能够控制流量在服务之间如何流动。你可以将流量拆分到服务的不同版本之间,在部署期间重新路由请求,或者设置重试和超时策略。保护通信: Istio 使启用
  2. 双向 TLS (mTLS)变得容易。这确保了服务之间所有通信都是加密和经过身份验证的,从而阻止未经授权的服务。
  3. 可观测性: Istio 自动收集指标、日志和跟踪,使你能够实时了解你的服务。这有助于监控、故障排除和性能调整。

这三个领域——流量管理、安全性和可观测性——是运行健康微服务架构的关键,Istio 可以轻松地处理它们。

使用 Istio 管理流量

Istio 的主要功能之一是管理服务之间的流量。在微服务设置中,你可能有多个版本的同一个服务同时运行。例如,你可能正在测试支付服务的最新版本,并希望将大部分流量发送到版本 1,但将一些流量路由到版本 2。

以下是如何使用 Istio 将流量拆分到服务的两个版本之间的示例:

apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: paymentsspec:  hosts:  - payments.myapp.com  http:  - route:    - destination:        host: payments        subset: v1        weight: 90    - destination:        host: payments        subset: v2        weight: 10

在这个例子中:

  • 90% 的流量被发送到payments服务的版本 1,而10%被发送到版本 2。
  • hosts字段指定虚拟服务适用的域——在本例中为payments.myapp.com
  • route块定义了流量如何在服务的两个子集中进行拆分:v1(版本 1)和v2(版本 2)。weight字段控制流量分配。

这对于金丝雀部署非常有用,在金丝雀部署中,你可以使用一小部分用户测试新功能,然后再完全推出。

Envoy 代理和 Sidecar 容器

Istio 的数据平面依赖于Envoy 代理,Envoy 代理是一个第 7 层代理,它管理服务之间所有流量。网格中的每个服务都有自己的Sidecar 代理,它位于服务旁边,并管理其所有入站和出站流量。

Envoy 允许你应用流量策略,例如重试、超时和断路器,所有这些都无需更改应用程序代码。它还收集有关流量流的详细指标,有助于监控和调试。

由于 Envoy 作为Sidecar 容器运行,因此它可以在不干扰应用程序逻辑的情况下执行这些规则并收集数据。简而言之,Envoy 充当服务网格中所有通信的“交通警察”。

可观测性:了解系统中发生的事情

运行一个包含许多微服务的系统可能会让你难以了解正在发生的事情。Istio 的内置可观测性功能可以帮助你跟踪服务之间所有通信的指标、日志和跟踪。这对于监控系统的运行状况、发现性能问题和修复错误至关重要。

Istio 的可观测性工具可以让你清楚地了解系统的工作方式。你可以及早发现问题,并使你的服务运行得更加顺畅。

安全:启用 mTLS 和访问控制

安全是管理微服务时的一大问题。Istio 使实施双向 TLS (mTLS)变得容易,双向 TLS (mTLS) 会加密服务之间的所有通信,并确保服务在交换数据之前相互验证身份。

Istio 还允许您设置访问控制策略,以指定哪些服务可以进行通信。这有助于限制哪些服务可以交互,从而减少系统的攻击面。

以下是一个 Istio 策略示例,该策略仅允许billing服务与payments服务通信:

apiVersion: security.istio.io/v1beta1kind: AuthorizationPolicymetadata:  name: payments-to-billingspec:  selector:    matchLabels:      app: payments  rules:  - from:    - source:        principals: ["billing.myapp.com"]

在此策略中:

  • selector指定此规则适用于payments服务,使用标签app: payments
  • rules块仅允许billing服务(由主体"billing.myapp.com"标识)与payments服务通信。任何其他服务都不允许向payments服务发送流量。

此策略限制除billing服务之外的所有服务访问payments服务,从而加强了微服务的安全性。

什么是 SPIFFE?

Istio 使用SPIFFE(安全生产身份框架,面向所有人)来管理服务身份。SPIFFE 提供了一种为服务分配安全、可验证身份的方法。网格中的每个服务都会获得一个SPIFFE 可验证身份文档 (SVID),该文档与 mTLS 一起使用以确保安全通信。此身份系统是 Istio 安全模型的基础。

Istio 中的网络

微服务中的网络可能很困难,尤其是在控制网格内部和外部的流量时。Istio 提供了几种管理网络流量的工具:

  1. 服务条目: 允许外部服务与网格内部的服务进行通信,反之亦然。
  2. 虚拟服务: 定义流量如何在网格内部路由。
  3. 目标规则: 将流量策略(如负载均衡或 mTLS)应用于服务。
  4. 网关: 管理进出网格的流量。

配置示例:网关、服务条目、虚拟服务和目标规则

假设您在网格中有一个 API 服务器,它通过负载均衡器接收来自互联网的流量。以下是如何配置网关服务条目虚拟服务目标规则来处理此流量。

网关配置

apiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata:  name: api-gatewayspec:  selector:    istio: ingressgateway  servers:  - port:      number: 80      name: http      protocol: HTTP    hosts:    - "api.myapp.com"

这里发生了什么?网关端口 80上监听来自域api.myapp.com的 HTTP 流量。selector字段将此网关连接到Istio 入口网关,该网关处理进入网格的流量。

服务条目配置

假设您的 API 服务器需要调用外部身份验证服务。以下是如何配置服务条目

apiVersion: networking.istio.io/v1alpha3kind: ServiceEntrymetadata:  name: auth-service-entryspec:  hosts:  - "auth.external-service.com"  location: MESH_EXTERNAL  ports:  - number: 443    name: https    protocol: HTTPS  resolution: DNS  endpoints:  - address: 203.0.113.1

这里发生了什么?服务条目告诉 Istio 如何将流量路由到外部服务 (auth.external-service.com),该服务在端口 443(HTTPS)上运行。location: MESH_EXTERNAL指示此服务存在于 Istio 服务网格之外。endpoints字段包含外部服务的 IP 地址,允许网格内的 API 服务器发送请求。

虚拟服务配置

以下是如何在网格内路由流量:

apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: api-virtualservicespec:  hosts:  - "api.myapp.com"  gateways:  - api-gateway  http:  - match:    - uri:        prefix: "/v1"    route:    - destination:        host: api-service        subset: stable

这里发生了什么?虚拟服务定义了流量路由规则。在这种情况下,通过api-gateway到达api.myapp.com/v1的流量将路由到网格中的api-servicesubset: stable指的是api-service的特定版本(您可以拥有同一服务的多个版本)。

目标规则配置

最后,以下是一个目标规则,用于应用负载均衡和 mTLS:

apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:  name: api-destination-rulespec:  host: api-service  trafficPolicy:    loadBalancer:      simple: ROUND_ROBIN    tls:      mode: ISTIO_MUTUAL

这里发生了什么?目标规则将策略应用于路由到api-service的流量。它使用轮询负载均衡将请求均匀地分布到实例中。mTLS通过tls.mode: ISTIO_MUTUAL启用,确保服务之间加密通信。

弹性:使用重试、超时和断路器处理故障

在分布式系统中,故障是不可避免的。服务可能会宕机,网络可能会变慢,或者用户可能会遇到延迟。Istio 可以帮助您使用重试超时断路器来处理这些问题。

  • 重试: 自动重试失败的请求,以处理临时故障,而不会影响用户体验。
  • 超时: 定义服务在放弃并继续执行之前应等待响应的时间。
  • 断路器: 如果服务出现故障,Istio 可以停止向其发送流量,从而防止可能导致系统其他部分崩溃的级联故障。

以下是如何在 Istio 中配置重试和超时的示例:

apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: my-servicespec:  hosts:  - my-service  http:  - route:    - destination:        host: my-service      retries:        attempts: 3        perTryTimeout: 2s      timeout: 5s

这里发生了什么?如果对my-service的请求失败,Istio 将最多重试该请求3 次。每次重试尝试都有2 秒的限制。请求的总允许时间为5 秒。在此之后,Istio 将停止等待响应。

对于断路,您可以使用类似这样的目标规则

apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:  name: my-servicespec:  host: my-service  trafficPolicy:    connectionPool:      tcp:        maxConnections: 100      http:        http1MaxPendingRequests: 50    outlierDetection:      consecutive5xxErrors: 2      interval: 10s      baseEjectionTime: 30s      maxEjectionPercent: 50

这里发生了什么?如果my-service10 秒内返回两个连续的 5xx 错误,Istio 将停止向其发送流量。该服务将从负载均衡池中剔除30 秒,然后重新考虑。

总结

Istio 是一个强大的工具,它简化了微服务的流量管理、安全性和可观测性。为 Istio 做贡献让我了解了它如何帮助解决运行分布式系统时遇到的一些复杂挑战。

如果您正在运行微服务架构或计划进行扩展,Istio 可以帮助您使系统更具弹性和更易于管理。如果您有任何问题或想了解更多关于 Istio 的信息,请随时联系我,我很乐意分享我的经验。

本文在云云众生https://yylives.cc/)首发,欢迎大家访问。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容