Skip to content

说说 istio

Istio 是什么

  • service mesh 的一个工具链
  • 比起 k8s service 负载均衡,提供一些熔断,限流,灰度的策略

Istio 原理

  • sidecar 模型
  • 在 pod 里运行一个 container 叫 istio-proxy(c++):

    1. 从 container 里发出的流量,就被 pod 里的 iptables 拦截进 istio-proxy 进程;
    2. istio-proxy 进程会解析 HTTP 请求,获取 Header 里的 Host 字段;
    3. istio-proxy 根据 Host 知道流程该转发给哪些目标 pod,然后随机选择目标pod进行流量转发。
    4. 进入当前 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) -> 目标地址