Skip to main content
Kubernetes 网络让任意 Pod 之间可以直接通信。本文讲解网络模型、Service、DNS、Ingress 和网络策略。

网络模型的三条基本要求

Kubernetes 对网络实现只提要求,不限定方案:
  1. Pod 之间无需 NAT 即可互通,跨节点也一样。
  2. 节点与 Pod 之间无需 NAT 即可互通。
  3. Pod 自己看到的 IP 与别人看到的 IP 一致。
满足这三条的方案都叫 CNI 插件。

Pod 网络与 CNI 插件

CNI 插件负责给 Pod 分配 IP、打通跨节点网络。常见选择:

Service 四种类型

Service 为一组 Pod 提供稳定入口。四种类型对比: NodePort 示例:

kube-proxy 的两种模式

kube-proxy 负责把 Service 的虚拟 IP 转发到后端 Pod。
  • iptables 模式:默认模式。用 iptables 规则做转发,规则多时匹配变慢,且只支持随机负载均衡。
  • IPVS 模式:用内核 IPVS 做转发,支持多种调度算法,大规模集群性能更好。

CoreDNS 服务发现

CoreDNS 为每个 Service 分配 DNS 名称。格式:
同命名空间内直接用 Service 名访问即可:

Ingress 与 Ingress Controller

Ingress 按域名和路径把 HTTP 流量路由到不同 Service。Ingress 只是规则,需要 Ingress Controller(如 nginx-ingress)真正执行。
先确认集群已安装 Ingress Controller,否则 Ingress 资源不会生效。用 kubectl get pods -n ingress-nginx 检查。

NetworkPolicy 入门

NetworkPolicy 限制哪些 Pod 可以互相通信。默认集群内全部放行。 下面的示例只允许带 app=frontend 标签的 Pod 访问后端:
NetworkPolicy 需要 CNI 插件支持,Calico 和 Cilium 支持,Flannel 不支持。

延伸阅读