kubernetes的网络设计主要针对以下几种情况实现的:
● 同一pod下容器与容器的通信(容器之间);
● 同一节点下不同的pod之间的容器间通信(Pod之间);
● 不同节点下容器之间的通信;
● 集群外部与内部组件的通信;
● pod与service之间的通信;
● Internet与Service之间的网络;
k8s对集群的网络有以下要求:
● 所有的Pods之间可以在不使用NAT网络地址转换的情况下相互通信;
● 所有的Nodes之间可以在不使用NAT网络地址转换的情况下相互通信;
● 每个Pod自己看到的自己的ip和其他Pod看到的一致;
k8s中的网络建设 , 主要是为可给每个 NODE上的 docker 容器都分配互相不冲突的 IP;在这些 IP 地址之间建立一个上层网络(overlay Network), 通过这个上层网络上,数据包可原封不动地传递到目标容器内。且目标为:每个Pod都拥有一个独立的 IP地址,而且假定所有 Pod 都在一个可以直接连通的、扁平的网络空间中 。 不管它们是否运行在同 一 个 Node (宿主机)中,都要求它们可以直接通过对方的 IP 进行访问。这样,用户就无需再额外考虑如何建立 Pod 之间的连接,也不需要考虑将容器端口映射到主机端口等问题。实际,我们这里说的k8s网络就是集群的网络,因k8s主要设计就是管理一组/批容器(集群)的。
二、网络建设 2.1 网络类型首先,回顾下Docker容器网络:
1)从范围上分:
单机网络: none,host, bridge
跨主机网络:overlay,macvlan,flannel等
2)从生成方式分:
原生网络:即利用宿主机操作系统本身就提供的功能构建的网络,包括:none,host, bridge;
自定义网络:docker容器实现中自带的网络驱动:bridge(自定义),overlay,macvlan, 使用第三方驱动实现的自定义网络:flannel等。
K8s的网络按实现目标来分类:
1)同一pod下容器与容器的通信
同一个pod下的容器间的通信,是借助容器都在共用一个linux协议栈,共用一个网络Namespace,即pod中容器都是共享同一网络空间的,所有Pod内的容器可看作在同一个网络平面里,比如:其中一个容器为web服务,一个容器为mysql。
web服务可以使用宿主机的IP地址+3306端口就可以访问,不需要通过其他组件的处理,这种访问方式是最简单的。
2.2 网络实现


