赞
踩
同一节点内:如果两个 Pod 部署在同一节点上,它们可以直接通过各自的 Pod IP 进行通信,这是由容器网络接口(CNI)插件(如 Flannel、Calico 等)负责配置的容器网络实现的。
跨节点:当 Pod 分布在不同节点上时,它们之间的通信同样通过 Pod IP,但需要 CNI 插件确保网络平面的一致性,例如通过隧道技术(如 IPSec、VXLAN)封装 Pod 间的流量,或使用路由规则直接路由到目标节点上的 Pod。
当 Pod 需要访问 Service 时,它不会直接访问 Service 后端的某个 Pod IP,而是通过 Service 的 Cluster IP
进行通信。Cluster IP
是一个虚拟的 IP 地址,由 Kubernetes 创建并管理。
kube-proxy
在每个节点上运行,它监听 Service 的变化,并通过 iptables 或 IPVS 规则,将发往 Cluster IP
的请求负载均衡地转发到该 Service 对应的所有后端 Pod(Endpoint)的 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。
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 端口。
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 端口,提供对外的高可用服务。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。