一、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
集群中安装了 Istio,每个 pod 都有第二个称为 istio-proxy
的 sidecar 容器,该容器在创建期间会自动将其注入到 pods 中。
拥有 istio-proxy
的 pods 将不再使用 kube-proxy
组件了。
每当配置或服务发生变化时,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 容器。
五、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 一起展示所有的服务和他们的流量。
6. 追踪
因为 Istio 控制平面拥有大量关于请求的数据,所以可以使用 Jaeger 等工具跟踪和检查这些数据。
7. 多集群 mesh
六、Istio 会取代 Kubernetes 的服务吗?
不会,因为 Istio 会使用现有的 Kubernetes 服务获取它们的所有 endpoints/pod IP
地址。
七、Istio 取代了 Kubernetes 的 Ingress 吗?
是的,Istio 提供了新的 CRD 资源,比如 Gateway
和 VirtualService
,甚至还附带了 ingress 转换器 istioctl convert-ingress。
下图显示了 Istio 网关如何处理进入流量,网关本身也是一个 istio-proxy
组件。