局部代理ipKubernetes中port、nodePort、targetPort、kube-proxy分析比较

一、port端口

这里的port表示:service暴露在cluster ip上的端口,<cluster ip>:port 局部代理ip是提供给集群内部客户访问service的入口。

专栏Spring Cloud微服务架构项目实战作者:软件架构29.8币27人已购查看

二、nodePort端口

集群外部机器可访问的端口。

比如一个Web应用需要被其他用户访问,那么需要配置type=NodePort,而且配置nodePort=3000,那么其他机器就可以通过node:3000访问到该服务,例如:30001。

例如MySQL数据库可能不需要被外界访问,只需被内部服务访问,那么不必设置NodePort端口。

总的来说,port和nodePort都是service的端口,前者暴露给集群内客户访问服务,后者暴露给集群外客户访问服务。从这两个端口到来的数据都需要经过反向代理kube-proxy流入后端pod的targetPod,从而到达pod局部代理ip上的容器内。

专栏Kafka v2.3 快速入门与实践作者:软件架构29.8币35人已购查看

三、targetPort 端口

Docker容器的端口,与制作容器时暴露的端口一致(DockerFile中EXPOSE),例如docker.io官方的nginx暴露的是80端口。

targetPort是pod上的端口,从port和nodePort上到来的数据最终经过kube-proxy流入到后端pod的targetPort上进入容器。

当service有了port和nodePort之后,就可以对内/外提供服务。那么其具体是通过什么原理来实现的呢?奥妙就在kube-proxy在本地node上创建的iptables规则。

专栏SkyWalking分布式链路追踪和监控作者:软件架构29.8币38人已购查看

四、kube-proxy

kube-proxy 为 pod 提供代理服务。service是一组pod的服务抽象,相当于一组pod的LB,负责将请求分发给对应的pod。service会为这个LB提供一个IP,一般称为cluster IP。kube-proxy局部代理ip的作用主要是负责service的实现,具体来说,就是实现了内部从pod到service和外部从node port向service的访问。

Kube-Proxy 通过配置 DNAT 规则(从容器出来的访问,从本地主机出来的访问两方面),将到这个服务地址的访问映射到本地的kube-proxy端口(随机端口)。然后 Kube-Proxy 会监听在本地的对应端口,将到这个端口的访问给代理到远端真实的 pod 地址上去。

用下面这张图来展示 kube-proxy在 kubernetes中的作用:

不管是通过集群内部服务入口<cluster ip>:port,还是通过集群外部服务入口<node ip>:nodePort的请求都将重定向到本地kube-proxy端口(随机端口)的映射,然后将到这个kube-proxy端口的访问给代理到远端真实的 pod 地址上去。

专栏Elasticsearch 7.x从入门到精通作者:软件架构29.8币87人已购查看

NodePort访问方式,在无外部负载均衡器的情况下,可以通过NodePort提供外部访问的能力,其访问的流程如下图所示:

访问的数据流向为: Client-->NodeIP:NodePort>kube-proxy(iptables)-->Pod Backend

专栏Elasticsearch 7.x订单中心实战作者:软件架构29.8币73人已购查看