Istio 是一个领先的服务网格开源平台,在管理下一代微服务应用程序的基础设施方面发挥了重要作用。Istio 可以帮助开发和运营团队跨混合云和多云环境大规模管理分布式云原生应用程序。
从技术上讲,Istio 充当服务网络层,可自动化微服务之间的网络和通信。它与语言无关、与平台无关,并且支持多种编程语言,从而实现使用不同技术构建的微服务之间的无缝互通。此外,Istio 还与最流行的容器化应用程序编排器 Kubernetes 以及遗留应用程序使用的虚拟机 (VM) 技术无缝集成。
- Kubernetes开发指南(4) - Sidecar 容器实例
- Kubernetes开发指南(3) - Helm Chart 完全 指导 手册
- 图解Kubernetes开发指南(2) 深入理解 Kubernetes Service :示例、基本用法和故障排除
- 图解Kubernetes开发指南(1) 深入理解CRD
- Kubernetes日志完全指南与最佳实践
Istio的兴起
现代应用程序通常由在本地和云中的容器中运行的微服务组成。这些微服务需要新的工具来解决处理分布式服务时出现的连接挑战。
微服务应用程序的常见挑战包括
:
- 在所有分布式应用程序服务之间正确路由流量
- 通过重试、超时、断路器和故障转移处理问题和错误
- 保护连接,包括身份验证、授权和加密
- 服务之间的连接和流量的可观察性和故障排除
服务网格定义了控制平面(用于配置所需的服务连接和行为)和数据平面(用于引导流量并执行安全规则)。如果没有服务网格,所有这些功能都需要直接构建到所有不同的应用程序中。微服务——一项复杂的任务。
开源 Istio 项目是最受欢迎的服务网格选择,也是生产中最常部署的解决方案,有大型活跃的社区支持。
Istio 提供了一种可编程的方式来创建和管理服务网格,该服务网格在混合云和多云环境中的 Kubernetes (K8s) 编排的容器(甚至虚拟机)中本地运行。
Istio可以做什么?
Istio是一种开源服务网格解决方案,使开发人员能够连接、控制、监控和保护微服务架构。它适用于任何微服务,无论其平台、来源或供应商如何,在应用程序服务和网络之间提供统一的层。
谷歌、IBM 和 Lyft 最初于 2017 年 5 月推出了 Istio,并于 2022 年 4 月提交了 Istio 加入 CNCF 的申请提案,CNCF 是其姊妹项目 Kubernetes 和 Envoy 的所在地。
Istio 旨在提供可观察性、强大的通信和控制,即使应用程序中的微服务数量增加也是如此。开发人员可以使用 Istio 作为与平台无关的中间件,而不是通过更改应用程序代码或构建特定于语言的客户端库来解决分布式系统问题。
Istio 的一个独特功能是它支持在容器和虚拟机中运行的工作负载,并且可以管理它们之间的交互,为混合环境提供支持。
Istio 提供以下服务网格管理功能:
- 流量管理 – Istio 允许您通过配置规则和路由流量来控制流量和服务到服务的 API 调用。它使重试、超时和断路器的配置更加简单。
- 安全性 – Istio 提供通信骨干并管理安全控制,例如大规模服务通信加密、身份验证和授权。它跨运行时和协议一致地执行策略,并帮助确保应用程序和网络层 Kubernetes Pod 和服务之间的通信安全。
- 可观察性——Istio 使用监控和日志记录功能提供对服务网格部署的洞察。监控可让您了解服务行为如何影响上游和下游性能。Istio 提供自定义仪表板来跟踪所有服务的性能。
建立信任边界
Istio 允许您在全局命名空间中定义构成微服务和应用程序的资源,并允许您配置规则以在它们之间安全路由第 4 层和第 7 层流量,包括 TCP、HTTP 和 gRPC 协议。
定义路由和负载平衡
Istio 允许您 定义基本的路由行为和负载平衡,通过重试、超时和故障转移提高可靠性,以及速率限制、配额和转换等更高级的行为。Istio 中的流量整形功能使您能够进一步准确管理微服务的互连方式,并通过拆分流量来支持金丝雀和 A/B 测试,从而以更低的风险更顺利地推出新应用程序更新。
通过 mTLS 和身份验证确保通信安全
为了安全起见,Istio 提供相互传输层安全 (mTLS) 加密、身份验证和授权等访问控制以及漏洞扫描。安全性对于保护服务网格上的微服务之间传输的敏感信息至关重要。大多数客户的目标是采用“零信任”安全模型,该模型识别连接请求并拒绝来自内部或外部来源的任何/所有未经验证或不安全的连接。
收集遥测数据并与可观测性工具集成
Istio 通过遥测、跟踪、审计日志记录为您提供应用程序通信的可观察性。Istio 提供与 Prometheus、Grafana 和 Jaeger 等其他开源工具的兼容性。Istio 收集并聚合服务网格中所有点的流量指标和错误。可观察性对于发现、分析和解决服务网格的连接、性能、安全性和其他现实行为问题至关重要。
Istio 的架构
Istio 架构和组件
Istio 服务网格分为数据平面和控制平面:
- 数据平面由一组智能代理(基于 Envoy 开源项目)组成,作为 sidecar 与应用程序一起部署。
- 控制平面管理和配置代理来路由流量。
[
1. Istio数据平面
数据平面由部署为 sidecar 的 Envoy 代理组成,与 Kubernetes Pod 中的应用程序实例一起运行。Envoy 代理管理系统上服务的流量,包括管理和控制微服务之间的网络通信。
通过将 Envoy 部署为 sidecar,Istio 允许开发人员在其应用程序中实现代理,而无需更改代码。Envoy 代理通过列出路由规则(支持 HTTP、gRPC 和 TCP)并应用传输层安全 (TLS) 和流量加密策略来控制流量。
所有应用程序流量都流经这些 Envoy 代理,这些代理收集大量数据并可以提供有关流量的宝贵见解,支持可观察性。
2. Istio控制平面
Istio 控制平面由三个关键组件组成:
- Pilot — 使用 Envoy API 与 Envoy sidecar 进行通信。Pilot负责流量管理、路由选择和服务检查。
- Citadel — 通过管理用户身份验证、证书和凭证管理,提供服务之间的安全通信。
- Galley — 负责配置管理、分发和处理。
3. Envoy
Istio 使用 Envoy,这是一种高性能代理,可以协调服务网格中服务的入站和出站流量。它只允许特使代理与数据平面流量交互。Istio 将 Envoy 代理部署为 sidecar 容器,与同一 Pod 中的服务一起运行。这从逻辑上增强了 Envoy 内置功能的服务,包括:
- 负载均衡
- 动态服务发现
- TLS 终止
- 断路器
- HTTP/2 和 gRPC 代理
- 健康检查
- 故障注入
- 分阶段推出并根据百分比进行流量分配
- 丰富的指标
sidecar 部署使 Istio 能够执行策略并提取丰富的遥测数据。Istio 可以将此数据发送到监控系统,以获取有关整个网格行为的上下文。此外,这种 sidecar 代理模型允许您将 Istio 功能添加到现有部署中,而无需重新架构或重写代码。
以下是 Envoy 代理启用的 Istio 关键功能和任务:
- 流量控制— 让您可以对 gRPC、HTTP、WebSocket 和 TCP 流量实施细粒度的流量控制和丰富的路由规则。
- 网络弹性——功能包括设置重试、断路器、故障注入和故障转移。
- 安全和身份验证——Envoy 代理使 Istio 能够实施安全策略、访问控制和速率限制。您可以使用配置 API 来定义它。
- 可插拔扩展- 该模型基于 WebAssembly,它支持自定义策略实施以及网格流量的遥测生成。
4. Istiod
Istiod 提供证书管理、服务发现和配置。它将控制流量行为的高级路由规则转换为特定于 Envoy 的配置,并在运行时将它们传播到 sidecar。
服务发现
Pilot 负责抽象特定于平台的服务发现机制,并将其合成为符合 Envoy API 的 sidecar 可以使用的标准格式。
Istio 支持多种环境的发现,包括 VM 和 Kubernetes。Istio 的流量管理 API 可以帮助指示 Istiod 优化 Envoy 配置,以对服务网格中的流量实施更精细的控制。
安全
Istiod 安全性提供内置身份和凭证管理,以实现强大的服务到服务和最终用户身份验证。此外,Istio 可以帮助您升级服务网格内的未加密流量。
Istio 不是基于相对不稳定的第三层或第四层网络标识符来实施策略,而是让您根据服务身份来实施策略。您还可以使用 Istio 的授权功能来控制对服务的访问。
证书管理
Istiod 充当证书颁发机构 (CA),生成证书以在数据平面内实现安全的 mTLS 通信。
Istio 集群模型
应用程序的工作负载实例可以在一个或多个 Kubernetes 集群中运行。将集群限制在可用区或区域可提供高可用性、性能和隔离。生产系统可以在不同区域和地区的多集群服务网格中运行,并通过云负载均衡器处理局部性和区域性或区域性故障转移。
通常,集群形成端点发现和配置的边界,例如,API 服务器管理每个集群发现的配置。Kubernetes 支持这种按集群配置,因此这种方法可以最大限度地减少与错误配置相关的问题。
Istio 允许您配置跨多个集群的服务网格。
单簇网格
最简单的 Istio 服务网格跨越单个集群,通常位于单个网络上。单集群、单网络部署虽然简单,但缺乏故障隔离和故障转移等附加功能。为了获得更高的可用性,请使用多集群网格。
[
多集群网格
单个服务网格可以包含多个集群。多集群部署具有以下优势:
- 故障隔离和故障转移——一个集群出现故障并故障转移到另一个集群。
- 基于位置的路由和故障转移——将请求发送到地理位置最近的服务。
- 控制平面选项—— 不同的模型具有不同程度的可用性。
- 隔离—— 每个团队或项目都可以在专用集群中运行。
[
多集群部署提供了更高的可用性和隔离性,但也更复杂。需要高可用性的系统通常需要在不同可用区或区域中进行集群。您可以在一个集群中测试配置更改,以限制每项更改的影响。如果集群出现问题,您可以在修复集群时重新路由来自该集群的流量。
您可以确定集群之间如何通信。例如,防火墙规则可以控制同一网络内的跨集群流量。多集群网格中的服务默认共享,流量策略提供精细控制。
Istio虚拟机架构
Istio 的一个独特功能是它支持容器化工作负载和在虚拟机 (VM) 中运行的工作负载。Istio 的 VM 支持允许您将 Kubernetes 集群外部的工作负载连接到网格。此设置使您能够将 Istio 用于旧应用程序和无法在容器化环境中运行的应用程序。
Kubernetes 提供了支持在平台上运行的工作负载的功能,包括服务发现、DNS 解析和健康检查功能,这些功能通常在 VM 环境中不可用。Istio 允许您将这些功能用于在虚拟机上运行的工作负载。它还允许这些工作负载利用 Istio 功能,例如丰富的遥测、双向 TLS (mTLS) 和高级流量管理。
Istio 的 5 个好处
Istio 的主要优点是:
- 安全、可靠、安全的通信 ——如果没有 Istio 服务网格,则必须直接在每个应用程序中实现管理连接和安全性所需行为的工具——这不是非常高效、一致或可扩展。
- 从应用程序层抽象通信 ——Istio 从应用程序和物理基础设施中抽象出控制平面和数据平面,从而使管理、保护和观察分布式应用程序变得更加容易。
- 高级流量管理 – Istio 允许您分割流量以支持 A/B 测试、蓝/绿、金丝雀应用程序部署,以进行 GitOps 和 CI/CD 样式应用程序开发。
- 超越 API 网关 ——围绕 API 网关的旧产品根本无法实现 Istio 的所有功能,因为它们是在没有 Kubernetes 和云原生的情况下开发的。虽然一些供应商试图调整他们的产品,但他们有内置的架构限制。
- 支持应用程序现代化 ——Istio 甚至通过提供一种在新微服务和遗留应用程序之间引导流量的方法来帮助数字化转型和云迁移计划。
如何部署使用Istio
下载并安装 Istio
下载并安装 Istio:
-
在命令行界面上使用以下命令下载最新的 Istio 版本并自动解压:
curl -L https://istio.io/downloadIstio | sh -
-
使用以下命令导航到提取的目录:
cd istio-1.14.1
本教程下载了 1.14.1 版本的 Istio 并导航到istio-1.14.1 directory.
-
使用以下命令将目录
istiocl
中存在的客户端添加istio-1.14.1
到您的路径:\
export PATH=$PWD/bin:$PATH
-
本教程使用Istio的demo配置文件进行设置。使用以下命令安装演示配置:
istioctl install --set profile=demo -y
-
使用以下命令添加命名空间:
kubectl label namespace demo-namespace istio-injection=enabled
namespace/default labeled
当稍后部署应用程序时,Istio 将自动注入 Envoy sidecar 代理,因为我们提供了命名空间。
部署 Istio 应用程序
本教程将部署 Istio 的名为 BookInfo 的示例应用程序作为示例。
通过 Istio 部署应用程序:
-
使用以下命令部署应用程序:
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
2.使用以下命令确认服务和 Pod 已部署:
`kubectl get services`
`kubectl get pods`
3. 使用以下命令确认应用程序运行顺利并提供 HTML 页面:
`kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/` \
`productpage | grep -o "<title>.*</title>"`
该命令将显示 HTML 页面的标题作为响应。
允许外部流量访问应用程序
即使已部署 BookInfo 应用程序,也无法从外部访问该应用程序。需要 Istio 入口网关来启用外部访问,因为它将路由映射到 Istio 网格的边缘。
要允许外部流量到达您的 Istio 应用程序:
-
使用以下命令将已部署的应用程序与 Istio 网关连接:
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
-
使用以下命令确保配置没有问题:
istioctl analyze
设置入口端口和IP并查看外部访问
要确定发送流量的入口端口和 IP:
-
使用以下命令启动 Minikube 隧道,将流量路由到 Istio 入口网关:
minikube tunnel
此命令提供一个名为 的外部负载均衡器EXTERNAL-IP.
-
使用以下命令设置 Ingress 端口和主机:
export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].
port}') -
使用以下命令确保设置正确的环境变量:
echo "$INGRESS_HOST"
echo "$INGRESS_PORT"
echo "$SECURE_INGRESS_PORT"
-
使用以下命令设置 GATEWAY_URL 环境变量并确认分配成功:
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
echo "$GATEWAY_URL"
-
使用以下命令获取 Bookinfo 应用程序的外部访问命令:
echo "http://$GATEWAY_URL/productpage"
此命令将输出一个 URL,粘贴到浏览器中以访问该应用程序。
查看仪表板
Istio 允许与不同的遥测应用程序集成,帮助了解服务网格的结构并显示其拓扑和运行状况。
要查看 Istio 应用程序的仪表板:
-
使用以下命令安装和部署 Kiali 及其他相关插件:
kubectl apply -f samples/addons
kubectl rollout status deployment/kiali -n istio-system
-
使用以下命令访问 Kiali 仪表板:
istioctl dashboard kiali
显示仪表板后,选择图表。 然后,打开命名空间下拉列表后选择****默认值。最后,仪表板显示网格的概述以及 Bookinfo 应用程序中的服务如何相关
Istio流量管理示例
Istio 上的流量管理是通过专用的流量路由规则来实现的。一旦应用程序的所有流量都受到监控,发生故障的可能性就会减少。Istio 配置的 Envoy 代理监视进出应用程序 Pod 的所有流量。
Envoy 代理配置为与应用程序容器一起运行。这样,应用程序服务可以运行,同时流量监控通过代理进行代理。
1. Istio虚拟服务
Istio 虚拟服务使用户能够创建路由流量的规则。当应用程序到达负载均衡器时,这些规则对应用程序很有帮助。首先,定义规则和相应的终端服务匹配协议。然后,如果规则符合条件,流量就会被转移到终端服务。
Istio 虚拟服务还允许用户使用流量路由规则解耦传入的服务请求。用户可以在同一虚拟服务配置中维护和指定来自不同主机名的传入流量。
以下是虚拟服务配置的示例:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: tutorial-vs-config
spec:
hosts:
—tutorial-config.vs.com
http:
—match:
—headers:
end-user:
exact: /api
route:
—destination:
host: /
这里,该spec.hosts
部分包括应用程序的代码CNAME或域。该http
部分指定 HTTP 路由。它将代码后端服务配置到特定主机或目标。
一旦hosts条目匹配,它就会进入http中的匹配部分。如果匹配部分满足,Istio上的route.destination流量管理是通过专用流量路由规则实现的。一旦应用程序的所有流量都受到监控,发生故障的可能性就会减少。Istio 配置的 Envoy 代理监视进出应用程序 Pod 的所有流量。
Envoy 代理配置为与应用程序容器一起运行。这样,应用程序服务可以运行,同时流量监控通过代理进行代理。
2. Istio网关
Istio Gateway 使您能够监控和控制全局传入和传出流量。可以选择通过协议和规则指定用户希望允许进入 Istio 服务网格的流量的性质。然后,流量进一步路由至目的地。
以下示例展示了 Istio 网关的工作原理:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: tutorial-istio-gtwy
spec:
selector:
app: tutorial-app
servers:
—port:
number: 344
name: https
protocol: HTTPS
hosts:
—tutorial-gateway.vs.com
tls:
mode: SIMPLE
credentialName: tutorial-cert-tls
以下是上述 Istio Gateway 配置的工作流程:
- 流量到达应用程序的负载平衡器并路由到网关。
- 网关让流量通过上述 port.number 中提到的端口进入 Istio 服务网格。在本例中,它是 344。
- 在此阶段,没有流量路由到后端服务。
- 网关使用TLS秘密凭证来证明CNAME的可信度。
- 一旦验证通过,网关就会让来自主机的流量进入,然后虚拟服务将其路由到目标服务。
3. Istio Sidecar
用户还可以通过 Istio Sidecar 管理和限制到达应用程序 Envoy 代理的流量。此选项涉及 Istio 配置 Envoy 代理,该代理可以接受流量。此流量接受来自应用程序工作负载的流量。
下面是一个演示 Istio Sidecars 工作原理的示例:
apiVersion: networking.istio.io/v1alpha3
kind: Sidecar
metadata:
name: tutorial-sidecar
namespace: default
spec:
egress:
—hosts:
—"./*"
—"bookinfo/*"
此示例配置将 sidecar 应用到默认命名空间。egress 指定配置仅允许外部流量到达特定的后端服务。在本例中,它们是默认命名空间和 bookinfo 命名空间,由“./”和“bookinfo/”指定。因此,流量对其他命名空间的访问受到限制。它将路由到流量的入口代码。