目录
- 1、Cluster IP
- 2、Node IP
- 3、NodePort
- 4、Pod IP
- 5、LoadBalancer
- 6、三种IP间通信
-
- 6.1、Pod IP 与 Pod IP 通信
- 6.2、Pod IP 与 Cluster IP 通信
- 6.3、Node IP 与 Pod IP 通信
- 6.4、Node IP 与 Cluster IP
- 7、YAML 示例
-
- 7.1、ClusterIP Service
- 7.2、LoadBalancer Service
1、Cluster IP
- 定义:Cluster IP 是 Kubernetes 为每个 Service 分配的一个虚拟的、仅集群内部可访问的 IP 地址。这个 IP 不绑定到任何物理或虚拟网络接口,仅在 Kubernetes 集群内部有效。
- 用途:Cluster IP 使得集群内的应用可以通过一个固定且稳定的 IP 访问 Service,而不需要知道后端 Pod 的具体 IP 或数量变化。Kube-Proxy 负责将发往 Cluster IP 的请求负载均衡到后端 Pod。
2、Node IP
- 定义:Node IP 是 Kubernetes 集群中每个节点(物理服务器或虚拟机)的物理网卡的 IP 地址。这是节点在网络中的实际可路由地址,用于节点间的通信以及集群内外的通信。
- 用途:外部系统访问集群内的服务时,尤其是通过 NodePort 和 LoadBalancer 类型的服务,通常需要通过 Node IP 加上相应的端口号来访问。
3、NodePort
- 定义:NodePort 是一种 Service 类型,它会在每个节点的某个静态端口上公开服务。这意味着,外部可以通过任意节点的 IP 地址加上这个 NodePort 访问到 Service。
- 用途:NodePort 提供了一种简单的方式,让集群外的客户端能够访问集群内的服务,常用于测试和调试环境。它比 LoadBalancer 更轻量,因为不需要云提供商的负载均衡器支持。
4、Pod IP
- 定义:Pod IP 是分配给每个 Pod 的独立 IP 地址,由 Kubernetes 网络插件(如 Calico、Flannel 等)动态分配。这个 IP 地址属于虚拟的二层网络,允许同一网络平面内的 Pod 直接通过 Pod IP 通信。
- 用途:Pod IP 使得集群内的 Pod 可以相互发现和直接通信,是实现服务间通信的基础。
5、LoadBalancer
- 定义:LoadBalancer 是 Service 的一种类型,它会在云提供商(如 AWS、GCP、Azure 等)的层面创建一个负载均衡器,并将流量分发到集群内的多个节点。
- 用途:LoadBalancer 适用于生产环境,提供了高可用性和扩展性。它允许外部客户端通过一个稳定且可预测的 DNS 名称或公共 IP 访问服务,自动处理后端节点的添加和移除,保证服务的持续可用性。
6、三种IP间通信
6.1、Pod IP 与 Pod IP 通信
-
同一节点内:如果两个 Pod 部署在同一节点上,它们可以直接通过各自的 Pod IP 进行通信,这是由容器网络接口(CNI)插件(如 Flannel、Calico 等)负责配置的容器网络实现的。
-
跨节点:当 Pod 分布在不同节点上时,它们之间的通信同样通过 Pod IP,但需要 CNI 插件确保网络平面的一致性,例如通过隧道技术(如 IPSec、VXLAN)封装 Pod 间的流量,或使用路由规则直接路由到目标节点上的 Pod。
6.2、Pod IP 与 Cluster IP 通信
-
当 Pod 需要访问 Service 时,它不会直接访问 Service 后端的某个 Pod IP,而是通过 Service 的
Cluster IP
进行通信。Cluster IP
是一个虚拟的 IP 地址,由 Kubernetes 创建并管理。 -
kube-proxy
在每个节点上运行,它监听 Service 的变化,并通过 iptables 或 IPVS 规则,将发往Cluster IP
的请求负载均衡地转发到该 Service 对应的所有后端 Pod(Endpoint)的 Pod IP 上。
6.3、Node IP 与 Pod IP 通信
-
从 Node 到 Pod :在某些情况下,可能需要从 Node 直接访问 Pod IP。虽然 Kubernetes 不鼓励直接这样做,但在特殊场景下,比如调试,可以通过 Node 的网络栈路由到该节点上的 Pod。不过,由于 Pod IP 并非全局可达,通常需要在 Node 上使用
iptables
规则或特定网络插件的功能来实现。 -
从外部到 Pod:通常不直接通过 Node IP 访问 Pod IP,而是通过 NodePort Service 或 LoadBalancer Service 间接访问。但如果配置了 hostNetwork: true,Pod 会共享宿主机网络,此时可以从外部通过 Node IP 加 Pod 容器端口访问 Pod。
6.4、Node IP 与 Cluster IP
- 一般情况下,Node 本身并不直接与 Cluster IP 通信,因为 Cluster IP 是一个仅集群内部可访问的虚拟 IP。但是,kube-proxy 在每个 Node 上运行,它通过处理到 Cluster IP 的流量来实现对 Service 的访问,间接体现了 Node 与 Cluster IP 之间的交互。
7、YAML 示例
7.1、ClusterIP Service
yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: ClusterIP
在这个例子中,my-service
服务通过 ClusterIP 类型定义,监听 80 端口,将流量转发到标签为 app=MyApp
的 Pod 的 9376 端口。
7.2、LoadBalancer Service
yaml
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: LoadBalancer
在这个例子中,my-loadbalancer-service
会创建一个负载均衡器,将外部流量通过 80 端口导入集群,并分配给标签为 app=MyApp
的 Pod 的 9376 端口,提供对外的高可用服务。