k8s网络模型
简介
Kubernetes 要求所有的网络插件实现必须满足如下要求:
- 所有的 Pod 可以与任何其他 Pod 直接通信,无需使用 NAT 映射(network address translation)
- 所有节点可以与所有 Pod 直接通信,无需使用 NAT 映射
- Pod 内部获取到的 IP 地址与其他 Pod 或节点与其通信时的 IP 地址是同一个
在这些限制条件下,需要解决如下四种完全不同的网络使用场景的问题:
- Container-to-Container 的网络
- Pod-to-Pod 的网络
- Pod-to-Service 的网络
- 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通信
不同节点,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;
|
|
ingress
- ingress是
|
|