Ref.
Istio服务网格
服务网格提供了一种透明且独立于语言的方式,可以灵活,轻松的自动化运维应用程序的网络功能。
Service Mesh通过Sidecar(从容器)的模式,对于服务本身时没有侵入式的。开发人员只需要关注微服务本身的代码逻辑。不需要去管理service mesh的sidecar是怎么实现的,所以说它是透明的方式。
Service Mesh不是跟任何开发语言绑定的,是一种平台框架。
自动化运维是通过sidecar来实现的。
服务网格的3个特性:
K8S模式中,微服务是以Pod+Container的方式在运行的,我们会用到service(cluster ip, nodeport)把后面的pod代理成一个集群。比如在发布一个微服务镜像的时候,replicas设置为3,同时发布了一个cluster IP的服务。这样就是表示一个cluster IP service后面挂着3个pod。服务间的通讯,是通过work node上kube-proxy做流量转发。所有的请求是基于kubernetes API server上的数据来路由的。这是传统的K8S内部服务网络的管理。参照之前文档。Kubernetes网络之Service网络(2)
Service Mesh基于service的概念,做到了更多的拓展。K8S的原生服务,如上面所讲,是对后面的POD集群做了一个代理,通过round-robin的方式,将你的请求转发到后面的pod。但是Service Mesh做到了更多的拓展,比如 retry, 熔断,流量转发控制。
Kube-proxy是全局模式的,以daemonset的方式在每一个节点上运行的。kube-proxy的配置是全局的,只能做到针对的node级别的管控。然而Service Mesh,每次你运行一个容器,它都会在旁边跑一个sidecar(从容器),所以它可以支持到一个服务粒度的管控。
一般情况下,K8S集群服务暴露是用Ingress Controller 或者 Nginx Controller的方法。
Istio是基于envoy服务来实现Istio本身的gateway功能。接口更加丰富,原生支持与很多中间件的通信。(如图)。还支持流量转发的管控,白名单, 调用重试,超时,健康检查等机制。
它的定位是中间的service proxy的服务。跑在Istio sidecar容器里的服务。
Service Mesh理念对微服务是非常有价值的。Istio是当前社区流行的service mesh的实现方式。
Istio分为两个面,控制平面,数据平面。
控制平面(Control Plane):类似于K8S的API Server, Scheduler,etcd这些组件。Istio也需要有自己的控制组件。
数据平面:
如果部署一个微服务,只需要发布一个传统的deployment和一个service。那如果开启了Istio的Auto sidecar injection的功能,最终部署出来的容器是多了两个容器。
Istio如何注入容器呢?
是基于Kubernetes的mutating webhook。mutating webhook是Admission controller的一个拓展。比如用户通过kubectl apply -f file.yml创建了一个pod,如果没有Istio,它会简单部署为一个pod。一旦开启了Istio Auto sidecar injection,file.yml就会经过k8s的mutating webhook,mutating webhook判断该服务应该被管控,然后基于Istio已经配置好的Istio-sidecar-injector的yaml文件,创建一个资源对象,存到etcd里面。
注意:istio-injection开启
matchLabels:
istio-injection: enabled
istio-injection规则:
rules:
- operations: ["CREATE"]
apiGroups: [""]
apiVersions: ["v1"]
resources: ["pods"]
流量管理主要是由pilot组件来实现的。从容器的注入,流量的转发规则,都是pilot组件负责配置,分发到对应的sidecar proxy(envoy)里面。
Pilot组件包含一个envoy API,负责与sidecar proxy(envoy)交互。
Istio的流量管理实现了: