在深入了解数据包如何在 Kubernetes 集群中流动的细节之前,让我们首先明确 Kubernetes 网络的要求。
Kubernetes 网络模型定义了一组基本规则:
- 集群中的 pod 应该能够在不使用网络地址转换 (NAT) 的情况下与任何其他 pod 自由通信。
- 在集群节点上运行的任何程序都应该与同一节点上的任何 pod 进行通信,而无需使用 NAT。
- 每个 pod 都有自己的 IP 地址(IP-per-Pod),并且每个其他 pod 都可以通过相同的地址访问它。
这些要求不会将实施限制为单一解决方案。
相反,它们笼统地描述了集群网络的属性。
为了满足这些限制,您必须解决以下挑战:
- 你如何确保同一个 pod 中的容器的行为就像它们在同一个主机上一样?
- pod 能否到达集群中的其他 pod?
- pod 可以访问服务吗?服务是负载平衡请求吗?
- pod 可以接收集群外部的流量吗?
在本文中,您将重点关注前三点,从 Pod 内网络或容器到容器的通信开始。
- Kubernetes 网络要求
- Linux 网络命名空间如何在 Pod 中工作
- pause 容器在 pod 中创建网络命名空间
- 为 pod 分配了一个 IP 地址
- 检查集群中 pod 到 pod 的流量
- Pod 网络命名空间连接到以太网桥
- 在同一节点上跟踪 pod 到 pod 的流量
- 跟踪不同节点上的 pod 到 pod 通信
- 容器网络接口 - CNI
- 检查 pod 以服务流量
- 使用 Netfilter 和 Iptables 拦截和重写流量
- 检查服务的响应