
基于这样的基本要求,我们可以知道:
localhost+端口来访问事实上,Kubernetes 进一步确定了对一个合格集群网络的基本要求:
同一节点两个 Pod 之间可以直接通信,无需显式地使用 NAT 进行地址转换;
任意集群节点node与任意pod之间是可以直接通信的,无需使用明显的地址转换,反之亦然;
任意pod看到自己的IP跟别人看见它所用的IP是一样的,中间不能经过地址转换;
也就是说,必须同时满足以上三点的网络模型才能适用于kubernetes,事实上,在早期的 Kubernetes 中,并没有什么网络标准,只是提出了以上基本要求,只有满足这些要求的网络才可以部署 Kubernetes,基于这样的底层网络假设,Kubernetes 设计了pod-deployment-service的经典三层服务访问机制。
直到1.1发布,Kubernetes才开始采用全新的 CNI(Container Network Interface)网络标准。

实现一个 CNI 网络插件只需要一个配置文件和可执行文件:
Kubernetes使用CNI网络插件的基本工作流程:
kubelet先创建pause容器生成对应的netns网络命名空间
根据配置调用具体的CNI插件,可以配置成CNI插件链来进行链式调用
当CNI插件被调用时,它根据环境变量以及命令行参数来获得网络命名空间netns、容器的网络设备等必要信息,然后执行ADD操作
CNI插件给pause容器配置正确的网络,pod中其他的容器都是用pause容器的网络
如果不清楚什么是pause容器,它在pod中处于什么样的位置,请查看之前的笔记:https://morven.life/notes/from-container-to-pod/
pause容器生成对应的netns网络命名空间,然后其他容器共享pause容器创建的网络命名空间。而对于单个容器的网络模型我们之前也介绍过,主要就是通过docker0网桥设备与veth设备对连接不同的容器网络命名空间,由此,我们可以得到如下图所示的单个pod网络模型的创建过程:
可以看到,同一个pod里面的其他容器共享pause容器创建的网络命名空间,也就是说,所有的容器共享相同的网络设备,路由表设置,服务端口等信息,仿佛是在同一台机器上运行的不同进程,所以这些容器之间可以直接通过localhost与对应的端口通信;对于集群外部的请求,则通过docker0网桥设备充当的网关,同时通过iptables做地址转换。我们会发现,这其实就是对当个容器的bridge网络模型的扩展。
上一小节我们知道单个pod的网络模型是容器网络模型的扩展,但是pod与pod之间的是怎么相互通信的呢?这其实与容器之间相互通信非常类似,也分为同一个主机上的pod之间与跨主机的pod之间两种。
docker0网桥设备直接二层(数据链路层)网络上通过MAC地址直接通信:


下面简单介绍几种主流的方案:
Network Policy是Kubernetes提供的基于策略的网络控制,用于隔离应用并提高安全性。它使用Kubernetes中常用的标签选择器模拟传统的分段网络,并通过策略控制它们之间的东西流量以及与外部交流的南北流量。
Note: 确保使用的网络插件支持策略控制(Network Policy),比如Flannel就没有实现Network Policy
下面的例子是配置一个典型的Network Policy的实例:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
namespaceSelector与posSelector控制 Pod 之间的流量,流量的行为模式主要由以下三个对象决定:控制对象:通过spec.podSelector筛选
流量方向:ingress控制入pod流量,egress控制出pod流量
流量特征:对端-IP-协议-端口
通过使用 Network Policy 可以实现对进出流的精确控制,它采用各种选择器(标签或namespace),找到一组满足条件的pod,或者找到相当于通信的两端,然后通过流量的特征描述来决定它们之间是不是可以连通,可以理解为一个白名单的机制。
原文链接:https://mp.weixin.qq.com/s/Uff5HWmIp8BJdus7pU_wOw
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3166112/ ,如需转载,请注明出处,否则将追究法律责任。