一、Istio

Istio 是一个服务网格,它允许集群中的 pods 和服务之间进行更详细、复杂和可观察的通信。

它通过使用 CRD 扩展 Kubernetes API 来进行管理,它将代理容器注入到所有 pods 中,然后由这些 pods 来控制集群中的流量。


二、kube-proxy

Kubernetes 中的服务是由运行在每个节点上的 ​​kube-proxy​​ 组件实现的,该组件创建 iptables 规则,并将请求重定向到 Pod。

因此,服务就是 iptables 规则。


下图中,服务 ​​service-nginx​​​ 指向 nginx pods,服务 ​​service-python​​ 指向 python pods。

红线显示了从 ​​pod1-nginx​​​ 中的 nginx 容器向 ​​service-python​​​ 服务发出的请求,该服务将请求重定向到 ​​pod2-python​​。

kubernetes Istio是什么_重定向


三、Kubernetes Istio

集群中安装了 Istio,每个 pod 都有第二个称为 ​​istio-proxy​​ 的 sidecar 容器,该容器在创建期间会自动将其注入到 pods 中。

拥有 ​​istio-proxy​​​ 的 pods 将不再使用 ​​kube-proxy​​ 组件了。

kubernetes Istio是什么_nginx_02

每当配置或服务发生变化时,Istio 控制平面就会对所有 ​​istio-proxy​​ sidecars 进行处理。

Istio 控制平面使用现有的 Kubernetes 服务来接收每个服务点所指向的所有 pods ,通过使用 pod IP 地址,Istio 实现了自己的路由。



四、Istio 工作原理

所有的 ​​istio-proxy​​ 容器已经被 Istio 控制平面所管控,并包含所有必要的路由信息。

来自 ​​pod1-nginx​​​ 的 nginx 容器向 ​​service-python​​ 发出请求。

请求被 ​​pod1-nginx​​​ 的 ​​istio-proxy​​​ 容器拦截,并被重定向到一个 python pod 的 ​​istio-proxy​​ 容器,该容器随后将请求重定向到 python 容器。

kubernetes Istio是什么_kubernetes_03


五、Istio优势

1. 可以掌握所有请求流量的详细信息

现在所有流量都通过每个 Pod 中的 ​​istio-proxy​​​ 容器进行路由,每当 ​​istio-proxy​​ 接收并重定向一个请求时,它还会将有关该请求的信息提交给 Istio 控制平面。

因此 Istio 控制平面可以准确地知道该请求来自哪个 pod、存在哪些 HTTP 头、从一个​​istio-proxy​​​ 到另一个 ​​istio-proxy​​ 的请求需要多长时间等等。

在具有彼此通信的服务的集群中,这可以提高可观察性并更好地控制所有流量。


2. 先进的路由

Kubernetes 内部 Services 只能对 pods 执行轮询或随机分发请求,使用 Istio 可以实现更复杂的方式。比如,如果发生错误,根据请求头进行重定向,或者重定向到最少使用的服务。


3. 部署

允许将一定比例的流量路由到特定的服务版本。


4. 加密

可以对 pods 之间从 ​​istio-proxy​​​ 到 ​​istio-proxy​​ 的集群内部通信进行加密。


5. 监控/图形

Istio 可以连接到 Prometheus 等监控工具,也可以与 Kiali 一起展示所有的服务和他们的流量。

kubernetes Istio是什么_kubernetes_04


6. 追踪

因为 Istio 控制平面拥有大量关于请求的数据,所以可以使用 Jaeger 等工具跟踪和检查这些数据。

kubernetes Istio是什么_kubernetes_05


7. 多集群 mesh

kubernetes Istio是什么_nginx_06





六、Istio 会取代 Kubernetes 的服务吗?

不会,因为 Istio 会使用现有的 Kubernetes 服务获取它们的所有 ​​endpoints/pod IP​​ 地址。


七、Istio 取代了 Kubernetes 的 Ingress 吗?

是的,Istio 提供了新的 CRD 资源,比如 ​​Gateway​​​ 和 ​​VirtualService​​​,甚至还附带了 ingress 转换器 ​​istioctl convert-ingress。​

下图显示了 Istio 网关如何处理进入流量,网关本身也是一个 ​​istio-proxy​​ 组件。

kubernetes Istio是什么_nginx_07