目录

  • 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

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

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 端口,提供对外的高可用服务。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐