Ambient Mesh vs Sidecar vs Proxyless 实现service mesh 能力对比
背景
从 sidecar
到 proxyless
再到 Ambient
模式
Ambient Mesh 模式是一种 Sidecar less
模式, 将服务直接sidecar代理
转换到统一网络ztunnel共享代理
。
Ambient 模式对应用程序本身没有任何侵入
,而是在应用程序外围:
- Node上通过DamentSet部署
ztunnel
:使用Envoy
实现的共享代理,多租户模式,负责L4
网络,主要是安全性方面; - 以
服务集
为单位部署Waypoint proxy
:同样使用Envoy
实现,单租户模式,使用Gateway API
部署的Gateway
资源,负责L7
网络,当服务需要L7
网络功能的时候才部署;
Sidecar模式
Sidecar 模式
有以下限制:
Sidecar
容器生命周期不受控制,有可能在sidecar
就没准备好的情况下,pod
就开始接收连接,让sidecar
的生命周期与应用程序pod
绑定,这本身就是对应用程序在部署形态
上的一种入侵Sidecar
无法解释不规范的七层系列,如HTTP
、Dubbo
gRPC
;- 如果仅需服务网格的安全功能,那么引入 sidecar 是一次过大的投资,因为它增加了很多七层网络功能,这些是用不到的,客户无法做到渐进式采用服务网格;
Sidecar
升级时,应用程序需要重新部署或者启动,这需要对应用程序进行协调;- 引入
Sidecar
对开发、调试、测试环节添加的负载度;
Proxyless模式
Proxyless 模式
有以下限制:
- Proxyless 默认是将istiod的 xds 实现在Framework中,需要开发多种语言的sdk. 和开发框架 开发
语言绑定
- 可移植性低: 无法通过切换sidecar的形式来非侵入式地升级基础设施.
Ambient Mesh模式
ambient 模式
:使得 Istio 越来越复杂,用户理解起来更加费力;控制平面为了支持多种数据平面部署模式,其实现将更加复杂。- 安全问题: 统一的ztunnel,Node节点共用网络外围组件,扩大是故障影响半径;
- 升级 sidecar 也会带来很大的运营成本
试用后的感想
- Ambient Mesh: 需要两个组件ztunnel(多租户Envoy) 和 Waypoint proxy (单租户Envoy) , 来实现旁路网络转发;
- 未来不排除使用其他语言(非 C++,如 Rust)来实现一个轻量级的 ztunnel;
- 未来Ambient Mesh 和 Sidecar Mesh 模式将会并存;
使用
- 安装Ambient
$ istioctl install --set profile=ambient
- 开启 ambient 模式
$ kubectl label namespace default istio.io/dataplane-mode=ambient
- 开启L7 网络功能
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: Gateway
metadata:
name: service-a
annotations:
istio.io/service-account: sa-service-a
spec:
gatewayClassName: istio-mesh
- 限制
- 对 Kubernetes 版本的要求不低于 1.25å
- 不支持 EnvoyFilter;
- 不支持 IPv6;
- 直接对 Pod IP 而不是 service 的请求在某些情况下将无效;
- Ambient 模式下的服务无法通过 LoadBalancer 和 NodePort 方式访问,不过你可以部署一个入口网关(未启用 ambient 模式)以从外部访问服务;
- 不支持 Calico CNI 和 Dataplane V2 CNI,因为 Ambient 模式会使用 Istio CNI,与其他 CNI 冲突;
其他
「如果这篇文章对你有用,请随意打赏」
FEATURED TAGS
agent
apiserver
application
bandwidth-limit
cgo
cgroupfs
ci/cd
client-go
cloudnative
cncf
cni
community
container
container-network-interface
containerd
controller
coredns
crd
custom-controller
deployment
docker
docker-build
docker-image
drop
ebpf
ecology
egress
etcd
gitee
github
gitlab
golang
governance
hpa
http2
image
ingress
iptables
jobs
kata
kata-runtime
kernel
kind
kubelet
kubenetes
kubernetes
library
linux-os
logging
loki
metrics
monitor
namespace
network
network-troubleshooting
node
nodeport
pingmesh
pod
prestop
prometheus
proxyless
pvc
rollingupdate
schedule
scheduler
serverless
sidecar
sigtrem
systemd
throttling
timeout
tools
traceroute