说说 istio
Istio 是什么¶
- service mesh 的一个工具链
- 比起 k8s service 负载均衡,提供一些熔断,限流,灰度的策略
Istio 原理¶
- sidecar 模型
-
在 pod 里运行一个 container 叫 istio-proxy(c++):
- 从 container 里发出的流量,就被 pod 里的 iptables 拦截进 istio-proxy 进程;
- istio-proxy 进程会解析 HTTP 请求,获取 Header 里的 Host 字段;
- istio-proxy 根据 Host 知道流程该转发给哪些目标 pod,然后随机选择目标pod进行流量转发。
- 进入当前 pod 的流量,iptables 会识别目标端口,若是 app 监听的端口,拦截并 REDIRECT 到 istio-proxy(各种策略),转发给 localhost 的 app 端口。
-
原生 k8s service 方案
源 POD -> service(VIP,虚拟ip) -> 目标 POD
- istio service mesh 方案
源 POD -> iptables REDIRECT 流量拦截 -> istio-proxy(各种策略) -> 目标 POD
Istio 如何进入 pod¶
- 方案一:使用 istio 官方提供的镜像,手动修稿 Deployment YAML,将 istio-proxy container/istio-iptables initcontainer 配置进去;
- 方案二: istio 的webhook机制,在我们提交 YAML 给 k8s 时,会去改写我们的 YAML配置。
istio-proxy 如何做流量改写/拦截/转发¶
- 进入 istio-proxy 容器
iptables -t nat -nvL
查看流量转发表tcpdump port 80 -i eth0
抓包,请求 curl :80 端口测试一下- iptables inbound 流量链路(外 -> 内):curl -> iptables REDIRECT -> :15006(istio-proxy) -> :80(nginx)
- iptables outbound 流量链路:OUTPUT -> ISTIO_REDIRECT -> :15001(istio-proxy) -> 目标地址