k8s网络模型

k8s网络模型

简介

Kubernetes 要求所有的网络插件实现必须满足如下要求:

  • 所有的 Pod 可以与任何其他 Pod 直接通信,无需使用 NAT 映射(network address translation)
  • 所有节点可以与所有 Pod 直接通信,无需使用 NAT 映射
  • Pod 内部获取到的 IP 地址与其他 Pod 或节点与其通信时的 IP 地址是同一个

在这些限制条件下,需要解决如下四种完全不同的网络使用场景的问题:

  1. Container-to-Container 的网络
  2. Pod-to-Pod 的网络
  3. Pod-to-Service 的网络
  4. Internet-to-Service 的网络

Linux network namespace

  • Linux系统中,每一个进程都在一个 network namespace (opens new window)中进行通信,

  • network namespace 是一个独立的网络堆栈;

  • 默认情况下,Linux 将所有的进程都分配到 root network namespace,以使得进程可以访问外部网络;

  • Kubernetes 为每一个 Pod 都创建了一个 network namespace。具体做法是,把一个 Docker 容器当做 “Pod Container” 用来获取 network namespace,在创建 Pod 中新的容器时,都使用 docker run 的 --network:container 功能来加入该 network namespace

Pod-to-Pod的网络

同节点内,pod-pod通信

K8S教程_Kubernetes网络模型_同节点上Pod之间发送数据包

不同节点,pod-pod

service

  • k8s的pod是可变的,sevice为最终用户提供了一个不可变的访问方式;

  • 一个service对应一组pod,这些pod可动态变化,组成微服务;

  • service通过selector和pod对应,在k8s会使用endpoint来

  • service有两种实现类型:

    • ClusterIP:

    • NodePort:

kube-proxy

  • Kube-proxy 是 kubernetes 工作节点上的一个网络代理组件,运行在每个node上;

  • Kube-proxy维护节点上的网络规则,实现了Kubernetes Service 概念的一部分 ;

  • 使发往 Service 的流量(通过ClusterIP和端口)负载均衡到正确的后端Pod;

1
2
3
4
## 查看kube-proxy
kubectl get pods -n kube-system -o wide | grep proxy
## 查看kube-proxy当前模式
kubectl logs kube-proxy-4hw9j -n kube-system

ingress

  • ingress是
1
2
## 查看ingress
kubectl get ingress --all-namespaces

参考

  1. Kubernetes网络模型 | Kuboard官网

  2. https://zhuanlan.zhihu.com/p/337806843

  3. 深入理解Kubernetes的Service:回归本源的场景需求_Kubernetes_韩超_InfoQ写作社区

  4. Kubernetes 修改 kube-porxy ipvs 模式 | dongdong's blog

  5. Kubernetes(k8s)kube-proxy、Service详解_匠人精神,持之以恒!-程序员ITS401 - 程序员ITS401

updatedupdated2024-05-102024-05-10