前言
盼着盼着 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 命令行工具。
-
增加了使用
ISTIOCONFIG
环境变量或者$HOME/.istioctl/config.yaml
设置自定义配置 -
增加使用助记符来标识端口号,比如使用
http
代替80
。 -
增加了
istioctl x uninstall
来方便卸载 Istio。
生产运维改进
-
增加让 Sidecar 启动之后才启动应用容器的特性。
这个特性非常的刚需,给 Istio 团队点个赞。举个例子,在没有这个特性的时候,应用容器启动后,第一次连接数据库总是失败的,因为 Sidecar 还没有启动,网络是无法通信的。类似,这种需要在启动时通过 Sidecar 代理来访问资源的时候,这个特性变得非常实用。使用方法,详见变更列表的流量管理。
-
强调
Istio Operator
是最佳安装方式。但是,Operator
目前还不支持金丝雀更新。 -
提供了
istio-agent
的指标,可以观察它的运行情况。
VM 安全性
本次更新对 VM 没有太多的重量级功能发布,主要更新如下:
-
VM 增加了安全特性,支持证书自动轮转
-
istioctl 增加验证 VM 的代理状态
-
增加了 RPM 安装包
其他修复
-
修复了一个与 SNI routing 相关的问题
-
Istio 可以更好地与 headless services 结合。
升级
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_instances
和pilot_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)
-
将
CRD
和Webhook
版本升级到v1
。(Issue#18771)(Issue#18838)因为
Kubernetes
在1.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 init
和istioctl 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,一定要先将升级和变更列表仔细查看。
延伸阅读
- Istio 1.19 Gateway API 服务网格支持
- Istio 1.18 环境网格(Ambient Mesh)问世
- Istio 1.17 注重生产实践的版本
- Istio 1.16 Beta Alpha Experimental 中间版本
- Istio 引入 Ambient Mesh(无 sidecar 数据平面模式),让服务网格真正成为通信基础设施
- Istio 1.15 平台支持(arm64),天下大同
- Istio 1.14 逐步产品化,未来可期
- Istio 1.13 星光点点
- Istio 1.12 Alpha 惊喜,Release 平淡
- Istio 1.11 Beta 惊喜,Release 平淡
- Istio 1.10 全新官网&开放前行
- Istio 1.9 改善生产环境体验
- Istio 1.8 稳健前进
- Istio 1.7 任性的小子
- Istio 1.6 简化以提升用户体验
- Istio 1.5 拥抱单体,简化架构