- kubernetes网络模型
- Kubernetes采用的是基于扁平地址空间的网络模型,集群中的每个Pod都有自己的IP地址,Pod之间不需要配置NAT就能直接通信,同一个Pod中的容器共享Pod的IP,能够通过localhost通信
- Pod容器内的通信
- 当Pod被调度到某个节点,Pod中的所有容器都在这个节点上运行,这些容器共享相同的本地文件系统,IPC和网络命名空间
- 不同Pod之间不存在端口冲突的问题,因为每个Pod都有自己的IP地址,当某个容器使用localhost时,意味着使用的是容器所属的Pod的地址空间
- 比如Pod A有两个容器container-A1和container-A2,container-A1在端口1234上监听,当container-A2连接到localhost:1234时,实际上就是在访问container-A1,这不会与同一个节点上的Pod B冲突,即使Pod B中的容器container-B1也在监听1234端口
- Pod之间的通信
- Pod的IP是集群可见的,即集群中的任何其他Pod和节点都可以通过IP直接与Pod通信,这种通信不需要借助任何网络地址转换,隧道或代理技术,Pod内部和外部使用的是同一个IP,这也意味着标准的命名服务和发现机制,比如DNS可以直接使用
- Pod与Service的通信
- Pod间可以直接通过IP地址通信,但前提是Pod知道对方的IP,在Kubernetes集群中,Pod可能会频繁的销毁和创建,也就是说Pod的IP不是固定的,为了解决这个问题,Service提供了访问Pod的抽象层,无论后端的Pod如何变化,Service都作为稳定的前端对外提供服务,同时,Service还提供了高可用和负载功能,Service负责将请求转发给正确的Pod
- 外部访问
- 无论是Pod的IP还是Service的Cluster IP,他们只能在Kubernetes集群中可见,对集群之外的世界,这些IP是私有的
- kubernetes提供了两种方式让外界能够与Pod通信
- NodePort,service通过Cluster节点的静态端口对外提供服务,外部可以通过:访问Service
- LoadBalancer:Service利用cloud provider提供的load balancer对外提供服务cloud provider负责将load provider的流量导向Service,目前支持的cloud provider有GCP,AWS,Azur等
- 各种网络方案
- 为了保证网络方案的标准化,扩展性和灵活性,kubernetes采用了Container Networking Interface(CNI)规范
-
CNI是由CoreOS提出的容器网络规范,使用了插件模型创建容器的网络栈
-
CNI的优点是支持多种容器runtime,不仅仅是Docker
-
目前已有多种支持Kubernetes的网络方案,比如Flannel,Calico,Canal,Weave Net等,因为他们都实现了CNI规范,无论选择哪种方案,得到的网络模型都一样,即每个Pod都有独立的IP,可以直接通信,
-
- Network Policy
- Network Policy是Kubernetes的一种资源,Network Policy通过Label选择Pod,并指定其他Pod或外界如何与这些Pod通信
- 默认情况下,所有Pod是非隔离的,即任何来源的网络流量都能够访问Pod,没有任何限制,当为Pod定义了Network Policy时,只有Policy允许的流量才能访问Pod
- 不是所有的Kubernetes网络方案都支持Network Policy,比如Flannel就不支持,Calico支持,
- Canal:他用Flannel实现Kubernete集群网络,同时又用Calico实现Network Policy
- Canal作为DaemonSet部署到每个节点,属于kube-system这个namespace
- 实践Network Policy
-
部署一个httpd应用,配置文件为httpd.yaml
-
httpd有三个副本,通过NodePort类型的Service对外提供服务,部署应用
-
当前没有定义任何Network Policy,验证应用可以被访问
-
启动一个busybox Pod,既可以访问Service,也可以Ping到副本Pod
-
集群节点既可以访问到Service,也可以Ping到副本Pod
-
集群外可以访问Service
-
-
创建Network Policy
-
- 定义将次Network Policy中的访问规则应用于label为run:httpd的Pod,即httpd应用的三个副本Pod
- ingress中定义只有label为accsee: "true"的Pod才能访问应用
- 只能访问80端口
-
通过kubectl apply创建Network Policy
-
验证Network Policy的有效性
-
busybox Pod已经不能访问Service
-
如果Pod添加了label access:"true"就能访问到应用,但Ping已经被禁止
-
集群节点已经不能访问Service,也Ping不到副本Pod
-
集群外也不能访问Service
-
如果希望让集群节点和集群外(192.168.56.1)也能够访问到应用,可以对Network Policy做修改
-
应用新的Network Policy
-
现在集群节点和集群外(192.168.56.1)已经能够访问了
-
-
通过ingress限制进入的流量,也可以用ingress限制外出的流量
-
-
- 为了保证网络方案的标准化,扩展性和灵活性,kubernetes采用了Container Networking Interface(CNI)规范