Service Mesh - Istio 1.8 稳健前进

前言

Istio 1.8 应着2020 年路线图 如约而至,这是 Istio 在 2020 年发布的第个也是最后一个版本。

Istio 1.8 按照路线路继续推进,致力于提高可用性安全性可靠性,并专注于多集群网格VM 工作负载

以下是此版本的一些要点:

安装和升级

之前为了将所有关于如何安装和升级汇总到 Istio Operator,Istio 团队构建了 IstioOperator API 和两种不同的安装方法(istioctl installIstio operator)。但是,有些用户具有基于 Helm 的其他软件的部署工作流,因此在 Istio 1.8 中,增加了使用 Helm 3 进行安装和升级。从 Istio 1.8 开始支持使用 Helm 进行 in-place 升级和 canary 升级。

注:目前,Helm 3 支持是 Alpha

鉴于 Istio 现在支持多种安装方法,Istio 团队添加了应该使用什么方法安装 Istio? FAQ 页面,帮助用户了解哪种方法最适合自己。

注:尽管 Istio 1.8 增加了 Helm 的支持,但是 Istio Operator 依然将是 Istio 安装的最终形式,强烈推荐大家试用 Istio Operator 安装

多集群

Istio 1.8 为跨集群的 Mesh 安装编写了新的安装指南降低了安装难度,主要选项由集群是否在同一网络以及是否需要保留多个控制平面决定。

轻松将虚拟机添加到网格

在之前的 Istio 1.7 介绍中,我们谈到 Istio 如何支持虚拟机。Istio 1.8 将重点放在了可用性上。简化了安装过程(可使用 istioctl 进行安装);新增智能 DNS 代理 可以从虚拟机解析网格服务,而不必将它们安全地指向群集 DNS 服务器,减少了群集 DNS 流量,也减少了解析服务 IP 所需的查找次数。

通过自动注册,可以告诉 VM Agent 是什么样的工作负载,并在加入网格时,自动创建 WorkloadEntry

安全与机密

证书现在从 Istiod 发送到网关,而不是直接从 Kubernetes 读取。这减少了通常公开显示的网关特权,从而改善了我们的“纵深防御”(defense in depth安全态势。此外,这为提高性能和减少内存占用以及证书源的其他可扩展性打开了大门。

Istio 附带了一个现成的证书颁发机构,但是许多用户希望连接到现有的 CA。当前,您必须实现 Istio CSR API 并自己编写第三方集成。在 Istio 1.8 中,引入了一种利用 Kubernetes CSR API 的方法,该方法可以与使用该 API 的任何工具集成。Istiod 充当注册机构(RA)的角色,以对工作负载进行身份验证和授权,然后创建,批准和监视 CSR 资源的更新。然后,第三方工具(例如 cert-manager)可以应用正确的签名者来创建具有适当后端 CA 的签名证书。此功能目前处于试验阶段

便于使用

在 Istio 1.8 中,引入了 istioctl bug-report,可以用来收集调试信息和获取集群状态

istioctl analyze 现在可以显示对象未正确验证的位置以及群集错误。如果出现错误,它将立即返回错误的确切行号

支持间接引用 pod。不再需要 istioctl dashboard envoy $(kubectl get pods -l app=productpage -o jsonpath="{.items[0].metadata.name}") -,而是 istioctl dashboard envoy deployment/productpage 即可。

弃用

Mixer 组件现已从 1.8 中删除

改变安装 add-on 的方式,在 1.7 中已经不推荐使用 istioctl 来安装,在 1.8 中直接被移除,这样有利于解决 add-on 落后于上游及难以维护的问题。

变更列表

已知的问题

  • TCP Wasm 扩展中的内存泄漏会影响 TCP 遥测(请参见问题#24720)。当上游连接在中途中断时,会发生泄漏。

  • Wasm 扩展配置更新具有破坏性(请参见问题#13690)。该配置将立即应用于现有请求和连接,并且如果外部 xDS 被拒绝,则不会还原该配置。

  • 为相同的服务创建 EnvoyFilterServiceEntry 时的问题。注入 Istio 的 Pod 因段故障而无法启动 istio-proxy。有关更多信息,请参见问题#28620

流量管理

  • 使用 istioctl x workload entry configure 安装 VM 时,默认在 istio-agent 中添加了 DNS 捕获

  • 已将 holdApplicationUntilProxyStarts 字段添加到 ProxyConfig,从而可以在 pod 级别上对其进行配置。不建议与 values.global.proxy.holdApplicationUntilProxyStarts 一起使用。(问题#27696

  • EnvoyFilter HTTP_ROUTE 新增 INSERT_FIRSTINSERT_BEFOREINSERT_AFTER 插入操作问题#26692

  • EnvoyFilter 添加了 REPLACE 操作。REPLACE 操作可以用新内容替换命名过滤器的内容。仅对 HTTP_FILTER 和有效 NETWORK_FILTER。(问题#27425

  • 添加了 Istio 资源状态包括观察到的生成(问题#28003

  • 修正当 WorkloadEntry 新标签不匹配 ServiceEntryworkloadSelector 时删除终点的问题。(问题#25678

  • 修正了当一个节点有多个 IP 地址(例如,虚拟机在网格扩展情况),Istio 代理将绑定 inbound 听众列表中(新的行为)第一个适用的地址,而不是到最后一个(原行为)。(问题#28269

安全

  • 改进的网关证书可以从 Istiod 中读取和分发,而不是在网关容器中分发。这减少了网关中所需的权限,提高了性能,并使证书读取更加可扩展。此更改与旧机制完全向后兼容,不需要更改群集。如果需要,可以通过 ISTIOD_ENABLE_SDS_SERVER=false 在 Istiod 中设置环境变量来禁用它。(Pull Request#27744

  • 改进了 sidecar 服务器端入站路径上的 TLS 配置,以强制实施 TLSv2 版本以及建议的密码套件。如果不需要此选项或对非 Envoy 客户端造成问题,可以通过将 Istiod env 变量设置 PILOT_SIDECAR_ENABLE_INBOUND_TLS_V2 为 false 来禁用它。(Pull Request#27500

  • 更新了的 ipBlocks/notIpBlocks 字段 AuthorizationPolicy 现在严格引用 IP 数据包到达 Sidecar 时的源 IP 地址。在此版本之前,如果使用代理协议,则 ipBlocks/notIpBlocks 将引用由代理协议确定的 IP 地址。现在,必须使用 remoteIpBlocks/notRemoteIpBlocks 字段来引用代理协议中的客户端 IP 地址。(参考)(用法)(用法)(Issue#22341

  • AuthorizationPolicy 现在添加支持嵌套 JWT 声明。(发行编号 21340

  • 使用信任域别名时,增加了对客户端 Envoy 安全命名配置的支持。这将修复多集群服务发现客户端 SAN 生成,使其使用所有端点的服务帐户,而不是使用第一个找到的服务注册表。(Pull Request#26185

  • 添加了实验性功能支持,允许 Istiod 使用 Kubernetes CSR API 与外部证书颁发机构集成(仅> = 1.18)。(发行#27606)(用法

  • 添加了“启用用户”来设置自定义 VM 身份提供程序以进行凭据身份验证(问题#27947

  • 在授权策略中添加了操作“ AUDIT”,可用于确定应审核哪些请求。(问题#25591

  • 增加了对常规 K8S 令牌以及新的 K8S 令牌与受众的迁移和同时使用的支持。此功能默认情况下处于启用状态,可以通过 REQUIRE_3P_TOKENIstiod 中的环境变量禁用,这将需要与观众建立新令牌。该 TOKEN_AUDIENCES 环境变量允许自定义检查观众,默认的遗体 istio-ca。(Pull Request#26482

  • AuthorizationPolicy 现在添加的支持 Source 类型为 remoteIpBlocks/的 notRemoteIpBlocks 映射到新 Condition 属性 remote.ip,该属性也可以在“时间”子句中使用。如果在入口网关的前面使用 http / https 负载均衡器,则该 remote.ip 属性将设置为原始客户端 IP 地址,该 IP 地址由安装 Istio 或通过以下方式设置时 X-Forwarded-For 的 numTrustedProxies 字段 gatewayTopology 下配置的受信任代理中的 http 标头确定。meshConfig 入口网关上的注释。请参阅此处的文档:配置网关网络拓扑。如果将 TCP 负载平衡器与入口网关前面的代理协议一起使用,则将 remote.ip 其设置为代理协议给定的原始客户端 IP 地址。(参考)(用法)(用法)(问题#22341

注: 在 Envoy 中发现了一个严重的错误,即对于非 HTTP 连接,代理协议的下游地址被错误地还原了。

请不要在非 HTTP 连接上使用带有代理协议的 remoteIpBlocks 字段和 remote_ip 属性,直到发布具有正确修复的 Istio 的新版本为止。

请注意,Istio 不支持代理协议,只能通过 EnvoyFilterAPI 启用它,应自行承担风险。

遥测

  • 更新了“控制平面仪表板”和“性能仪表板”以使用 container_memory_working_set_bytes 度量标准来显示内存。该指标仅计算即使在内存压力下也无法被内核回收的内存,因此与跟踪更相关。这也与一致 kubectl top。报告的值低于以前的值。

  • 更新了 Istio Workload 和 Istio Service 仪表板,从而缩短了加载时间。(问题#22408

  • datasource 向 Grafana 仪表板添加了参数(问题#22408

  • ResponseFlag 从 Envoy 设置时添加了侦听器访问日志。(问题#26851

  • 添加了对 OpenCensusAgent 带有可配置跟踪上下文标头的格式化跟踪导出的支持。

  • 添加了代理配置以控制 Envoy 本机统计信息的生成。(问题#26546

  • 添加了 Istio Wasm Extension Grafana 仪表板。(问题#25843

  • 添加了 gRPC 流式消息计数代理 Prometheusmetrics istio_request_messages_total 和 istio_response_messages_total (Pull Request#3048

  • 增加了对在客户端度量标准中正确标记流量的支持,以用于未到达目标位置或不在代理后面的情况。(发行编号 20538

  • 固定的解释$(HOST_IP)在基普金及 Datadog 示踪剂地址。(问题#27911

  • 删除了所有与 Mixer 相关的功能。这是对已淘汰的 Istio 服务和部署以及以 Mixer 为重点的 CRD,组件和相关功能的计划删除。(问题#25333)(问题#24300

安装

  • 将 外部控制平面提升为 Alpha。(问题第 11 期

  • 将 Kiali 插件更新为 1.26 版。

  • 添加了对使用 Helm 3 安装和升级 Istio 的支持

  • 改进的多网络配置,因此使用标记服务 topology.istio.io/network=network-name 可以配置跨网络网关,而无需使用网状网络。

  • 改进了 Sidecar 注入,以不修改 securityPolicy.fsGroup 可能与现有设置和秘密安装冲突的 Pod 。该选项在 Kubernetes 1.19+上自动启用,并且在较早版本中不支持。(问题#26882)(问题#27911

  • 与清单一起使用的改进的生成的运算符清单 kustomize 可在清单目录中找到。(问题#27139

  • 更新了安装脚本以绕过 GitHub API 速率限制。(Pull Request#23469

  • 将端口添加 15012 到服务的默认端口列表 istio-ingressgateway。(问题#25933

  • 在 Istio 1.8 中增加了对 Kubernetes 1.16 至 1.19 版本的支持。(问题#28814

  • 添加了使用标签为 Pod 指定网络的功能 topology.istio.io/network。这将覆盖集群安装值(values.globalnetwork)的设置。如果未设置标签,则会根据群集的全局值注入标签。(问题#25500

  • 不推荐使用的安装标志 values.global.meshExpansion.enabled,支持用户管理的配置,并且 values.gateways.istio-ingressgateway.meshExpansionPorts 支持 components.ingressGateways[name=istio-ingressgateway].k8s.service.ports (问题#25933

  • 修复 Istio 操作员管理器以允许配置 RENEW_DEADLINE。(问题#27509

  • 修复了阻止 NodePort 服务用作 registryServiceNamein 的问题 meshNetworks。

  • 删除了对使用安装第三方遥测应用程序的支持 istioctl。这些应用程序(Prometheus,Grafana,Zipkin,Jaeger 和 Kiali),通常称为 Istio 插件,现在必须单独安装。这不会影响 Istio 为插件使用的遥测功能。有关更多信息,请参见重新设计我们的插件集成。(问题#23868)(问题#23583

  • 删除 istio-telemetry 和 istio-policy 服务,并部署从安装的 istioctl。(问题#23868)(问题#23583

  • 修复了具有 reporter 字段的 Istio Grafana 仪表板查询。问题#27595

istioctl

  • 改进 istioctl analyze 了在分析 Yaml 文件时查找带有配置错误的确切行号的功能。之前,它将返回带有错误的资源的第一行。问题#22872

  • 已更新 istioctl experimental version 并 proxy-status 使用令牌安全性。–plaintext 已创建一个新选项,用于不带令牌的测试。问题#24905

  • 现在,添加的 istioctl 命令现在可以间接引用 pod,例如 istioctl dashboard envoy deployment/httpbin 问题#26080

  • 除了之外,还 io 作为 Istio Operator 资源的简称添加 iop。问题#27159

  • 添加 –type 用于 istioctl experimental create-remote-secret 允许用户为创建的机密指定类型。

  • 在中添加了实验性 OpenShift Kubernetes 平台配置文件 istioctl。要使用 OpenShift 配置文件进行安装,请使用 istioctl install –set profile=openshift。(OpenShift 平台设置)(使用安装 OpenShiftistioctl)

  • 添加了 istioctl bug-report 命令以生成 Istio 和群集信息的存档,以帮助调试。问题#26045

  • 添加了新命令 istioctl experimental istiod log 以启用管理 istiod 组件的日志记录级别。问题#25276问题#27797

  • 已弃用的 centralIstiod 标志有利于 externalIstiod 更好地支持外部控制平面模型。问题#24471

  • 修复了在安装时允许使用空修订版本标志的问题。问题#26940

小结

Istio 团队履行了2020 年路线图的承诺,保持了稳健的发布节奏,在性能、用户体验上持续优化。让我们期待 Istio 在 2021 年给我们带来更多惊喜。

延伸阅读


CatchZeng
Written by CatchZeng Follow
AI (Machine Learning) and DevOps enthusiast.