Service Mesh - Istio 1.7 任性的小子

前言

盼着盼着 Istio 1.7 终于如约而至,Istio 团队完美兑现了发布路线图的诺言。在官方的 Announcing 中是这么描述的:

“伟大的 Istio 社区(Istio’s great community)”

确实,在这个版本中,来自 40 多个公司的 200 多个开发者做出了贡献。

那究竟 Istio 1.7 怎么样呢?值得我们更新吗?还是再等等?且听笔者以下分析。

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

安全增强

  • 确认了使用安全发现服务(SDS)作为证书分发的好处,并认为这是一个重要的安全最佳实践。现在这一特性也可以被使用在出口网关上,详见 Egress Gateways with TLS Origination (SDS)

    如果还没使用 SDS 的同学们,建议大家可以用起来。以入口网关为例,没有使用 SDS 之前,每次更新 TLS 证书的时候,都需要重新启动下入口网关 pod,很是麻烦。使用了 SDS 后,可以自动更新,详见 Secure Gateways

  • 增加了信任域验证TCP 流量的支持(之前只能支持 HTTP),并且还支持在 MeshConfig 中进行灵活配置。
  • 增加通过 ECC 进行 CA 通信 的能力,提高了安全性和效率。
  • 基于一条最佳实践:不要让运行的进程有多于它所需的权限,这会导致不必要的混淆网关默认使用非根(non-root)用户部署

    这一最佳实践,在编写 Dockerfile 的时候也常会用到,详见 Best practices for writing Dockerfiles

  • 修复了关于一个 Istio Gateway 和 mTLS 的 bug

易用性提升

在易用性方面主要的改进还是围绕 istioctl 命令行工具。

生产运维改进

  • 增加让 Sidecar 启动之后才启动应用容器的特性。

    这个特性非常的刚需,给 Istio 团队点个赞。举个例子,在没有这个特性的时候,应用容器启动后,第一次连接数据库总是失败的,因为 Sidecar 还没有启动,网络是无法通信的。类似,这种需要在启动时通过 Sidecar 代理来访问资源的时候,这个特性变得非常实用。使用方法,详见变更列表的流量管理

  • 强调 Istio Operator 是最佳安装方式。但是,Operator 目前还不支持金丝雀更新

  • 提供istio-agent 的指标,可以观察它的运行情况。

  • Prometheus 指标收集方面的改进

VM 安全性

本次更新对 VM 没有太多的重量级功能发布,主要更新如下:

  • VM 增加了安全特性,支持证书自动轮转

  • istioctl 增加验证 VM 的代理状态

  • 增加RPM 安装包

其他修复

升级

Require

Require Kubernetes 1.16+

Kubernetes 1.16+ is now required for installation.

说实话,看到需要 Kubernetes 1.16+ 的时候,感觉 Istio 也太任性了吧。目前绝大多数企业和用户所使用的 Kubernetes 版本应该都是 1.16 以下的。这也就相当于拒接了许多现在的用户,因为对于企业和用户来讲 Kubernetes 是比 Istio 更基础的基础设施

另外,对于低版本 Istio 的用户也是伤害极大的,想要升级 Istio,还得先升级 Kubernetes,升级前还要验证下是否有兼容性问题

安装

  • 移除了 istioctl manifest apply,使用 istioctl install 代替。

  • 废弃了 telemetry addons。

网关以非根(non-root)用户运行

因为网关以非根(non-root)用户运行,所以不具备绑定 1024 以下端口的权限。所以,在网关端口声明的地方,需要做响应的修改。举例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
ingressGateways:
  - name: istio-ingressgateway
    enabled: true
    k8s:
      service:
        ports:
          - port: 15021
            targetPort: 15021
            name: status-port
          - port: 80
            name: http2
          - port: 443
            name: https

这里,需要修改成明确指定有效的 targetPort

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ingressGateways:
  - name: istio-ingressgateway
    enabled: true
    k8s:
      service:
        ports:
          - port: 15021
            targetPort: 15021
            name: status-port
          - port: 80
            name: http2
            targetPort: 8080
          - port: 443
            name: https
            targetPort: 8443

如果你还是想以 root 用户运行 gateway 的话,可以通过配置项设置 --set values.gateways.istio-ingressgateway.runAsRoot=true.

变更列表

流量管理

  • 增加了配置项 values.global.proxy.holdApplicationUntilProxyStarts,使 sidecar 注入器在 pod 容器列表的开始处注入 sidecar,并将其配置为阻止所有其他容器的开始,直到代理就绪为止。默认情况下禁用此选项。(Issue#11130)

  • 增加了对用于客户端证书和 CA 证书的 SDS 支持,该证书用于使用 DestinationRule 从 Egress Gateway 发起的 TLS/mTLS。(Issue#14039)

安全

  • 改进的信任域验证也可以验证 TCP 流量,以前仅支持 HTTP 流量。(Issue#26224)

  • 改进的 Istio 网关,允许在服务器的 TLS 模式为 ISTIO_MUTUAL 时使用基于源主体的授权。(Issue#25818)

  • 改进的虚拟机安全性。VM 身份现在从一个短暂的 Kubernetes 服务帐户令牌启动。VM 的工作负载证书会自动轮换。(Issue#24554)

遥测

  • 向 istio-agent 添加了 Prometheus 指标。(Issue#22825)

  • 使用 istioctl 添加了自定义度量。(Issue#25963)

  • 向 Stackdriver 添加了 TCP 度量标准和访问日志。(Issue#23134)

  • istioctl 已弃用遥测插件。默认情况下将禁用这些功能,并且在将来的版本中将其完全删除。有关安装这些插件的更多信息,请参见“集成”页面。(Issue#22762)

  • 默认情况下,已启用 Prometheus 指标合并。(Issue#21366)

  • 修复了 Prometheus 度量合并以在应用程序故障期间不删除 Envoy 度量的问题。(Issue#22825)

  • 修复了无法解释的会影响 Kiali 图的遥测。此修复程序将默认出站协议嗅探超时增加到 5s,这对像 mysql 这样的服务器优先协议产生了影响。(Issue#24379)

  • 删除了不准确的 pilot_xds_eds_instancespilot_xds_eds_all_locality_endpoints Istiod 指标。(Issue#25154)

安装

  • 增加了用于在 VM 上运行 Istio sidecar 的 RPM 软件包。(Issue#9117)

  • 增加了对单集群和多集群的实验性中心 Istiod 支持

  • 修复了防止 NodePort 服务用作 meshNetworks 中的 registryServiceName 的问题。

  • 改进的网关部署,默认情况下以非 root 身份运行。(Issue#23379)

  • 改进了 operator 默认情况下以非 root 用户身份运行的情况。(Issue#24960)

  • 通过指定严格的安全上下文改进了 operator。(Issue#24963)

  • 改进了 Istiod,默认情况下以非 root 身份运行。(Issue#24961)

  • 改进的 Kubernetes 战略合并用于覆盖 IstioOperator 用户文件,从而改善了处理列表项的方式。(Issue#24432)

  • CRDWebhook 版本升级到 v1。(Issue#18771)(Issue#18838)

    因为 Kubernetes1.16 中将 webhook 的 API 版本改为 v1,并会在 1.19 版本中删除老的 v1beta 版本。这导致 Istio 不得不在自己的 1.8 版本之前完成对应的迁移。对于我们而言,需要更新自己的 mesh 配置文件的版本号,如果你的集群应用较多,那是个不小的工作量,不单单要修改,而且还要验证。

istioctl

  • 为从 Kubernetes 的非工作负载添加了 Allow proxy-status <pod> 命令,并通过 --file 参数传递了代理配置。

  • 添加了一个配置文件以保存 istioctl 默认标志。可以使用环境变量 ISTIOCONFIG 更改其默认位置($HOME/.istioctl/config.yaml)。新命令 istioctl 实验性配置列表显示了默认标志。(Issue#23868)

  • istioctl initistioctl remove 命令添加了 --revision 标志,以支持多个控制平面升级。(Issue#23479)

  • 添加了 istioctl x uninstall 命令以卸载 Istio 控制平面。(Issue#24360)

  • 改进的 istioctl analyze 以警告是否存在已弃用的 mixer 资源。(Issue#24471)

  • 改进的 istioctl analyze 可警告 DestinationRule 是否未使用 CaCertificates 验证服务器身份。

  • 改进的 istioctl 验证以检查资源中的未知字段。(Issue#24861)

  • 改进的 istioctl 安装,在尝试以不支持的旧 Kubernetes 版本安装 Istio 时发出警告。(Issue#26141)

  • 删除 istioctl manifest apply。更简单的安装命令将替换 manifest apply。(Issue#25737)

文档

  • 如果 istio.io 页面已通过 istio.io 自动化测试进行了测试,则添加了可视指示。(Issue#7672)

小结

Istio 1.7 版本存在着太多的激进做法,也许 Istio 团队也很无奈,但是 Service Mesh(Istio)作为云原生的一个基础设施,这么“不稳定”,真的是好事吗?

Istio 1.7 版本总体上看来,并无亮点,反而因为一些激进的做法,导致用户在安装、升级过程中增加成本和不稳定性,在用户体验上是一次严重的倒退。

综上所述,笔者不建议大家立即更新 1.7。如果你硬要更新到 1.7,一定要先将升级变更列表仔细查看。

延伸阅读

参考


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