1 公司网络架构
(2) 核心层: 主要完成数据高效转发、链路备份等 (3) 汇聚层: 网络策略、安全、工作站交换机的接入、VLAN之间通信等功能 (4) 接入层: 工作站的接入
所谓的局域网就是同一路由器或交换机下面连接的网段,通熟易懂的解释就是在一个路由器或交换机下面连接的多个计算机串联组,这些 计算机串联组就构成了一个局域网环境,局域网的稳定性非常好,局域网有一定的专业性和安全性,所以,一般公司单位基本上都是采用 局域网串联计算机组来使用。局域网内主机怎么通信的,主机访问外网又是怎么通信的,想要搞懂这些问题得从交换机,路由器讲起。
2 交换技术
据传输。
(1) 交换技术分为2层和3层
3层:三层交换技术的诞生,最初是为了解决广播域的问题,多年的发展,三层交换机已经成为构建中大型网络的主要力量。
(2) 广播域
络是一个广播域。路由器的一个接口下的网络是一个广播域,所以路由器可以隔离广播域。
(3) ARP(地址解析协议,在IPV6中用NDP替代)
发送这个广播帧是由ARP协议实现,ARP是通过IP地址获取物理地址的一个TCP/IP协议。
(4) 三层交换机
据 MAC 地址或 IP 地址转发数据包。
(5) VLAN(Virtual Local Area Network)虚拟局域网
VLAN应用非常广泛,基本上大部分网络项目都会划分vlan。VLAN的主要好处有: 分割广播域,减少广播风暴影响范围;提高网络安全 性,根据不同的部门、用途、应用划分不同网段。
3 路由技术
1)WAN口: 配置公网IP,接入到互联网,转发来自LAN口的IP数据包。 2)LAN口: 配置内网IP(网关),连接内部交换机。
(2) 路由器是连接两个或多个网络的硬件设备,将从端口上接收的数据包,根据数据包的目的地址智能转发出去,路由器的功能如下
2)转发 3)隔离子网 4)隔离广播域
的地址给出一条最优的路径。那么路径信息的来源有两种,动态路由和静态路由。 1)静态路由: 指人工手动指定到目标主机的地址然后记录在路由表中,如果其中某个节点不可用则需要重新指定。 2)动态路由: 则是路由器根据动态路由协议自动计算出路径永久可用,能实时地适应网络结构的变化。
1)RIP (Routing Information Protocol ,路由信息协议) 2)OSPF (Open Shortest Path First,开放式最短路径优先) 3)BGP (Border Gateway Protocol,边界网关协议)
4 OSI七层模型
模型或七层模型。
5 TCP/UDP协议
大,可靠性要求高的应用场景。
输少量的数据,可靠性要求低的应用场景,相对TCP传输速度快。
6 补充
5) 路由表: 目的网段 下一跳ip 出端口
4) 数据帧:数据 + 源IP地址 + 目标IP地址 + 源物理地址 + 目标物理地址
实现容器之间通信
4.2 Kubernetes网络模型
1 Docker 容器网络模型
(1) Docker网络模型涉及的名词
这一特性,实现不同容器间的网络隔离。 2)Veth设备对: Veth设备对的引入是为了实现在不同网络命名空间的通信,veth工作在数据链路层,veth-pair设备在转发数据包过程中并 不串改数据包内容。 3)Iptables/Netfilter: Docker使用Netfilter实现容器网络转发。 4)网桥: 网桥是一个二层网络设备,通过网桥可以将Linux支持的不同的端口连接起来,并实现类似交换机那样的多对多的通信。 5)路由: Linux系统包含一个完整的路由功能,当IP层在处理数据发送或转发的时候,会使用路由表来决定发往哪里。
(2) Docker容器网络示意图如下
2 Pod 网络
实现: k8s会在每个Pod里先启动一个infra container小容器,然后让其他的容器连接进来这个网络命名空间,然后其他容器看到的网络 视图就完全一样了,即网络设备、IP地址、Mac地址等。这就是解决网络共享的一种方法,所以Pod的IP地址就是infra container的IP 地址。
两种情况为 1)两个Pod在同一个Node上 2)两个Pod在不同的Node上
同节点Pod之间通信道理与Docker网络一样的,如下图:
2)对 pod2 来说,eth0 通过虚拟以太网设备(veth1)连接到 root namespace 的 cbr0 网桥上; 3)cbr0网桥是一个二层网络设备,可以理解为交换机; 4)pod1 使用ARP协议解析出目标pod2的mac地址; 3)然后pod1的数据包通过cbr0网桥转发到pod2的network namespace中的eth0网络设备上。
相比同节点Pod通信,这里源Pod发出的数据包需要传递到目标节点,但是源Pod并不知道目标Pod在哪个节点上。 1)K8S网络模型要求Pod IP在整个网络中都可访问,这种需求是由第三方网络组件实现
一个Pod一个IP 所有的 Pod 可以与任何其它 Pod 直接通信 所有节点可以与所有 Pod 直接通信 Pod 内部获取到的 IP 地址与其它 Pod 或节点与其通信时的 IP 地址是同一个
3)目前支持的一些K8s网络组件
常用的k8s网络组件为flannel、calico。
和维护etcd中的信息。
3 CNI(容器网络接口)
网络设备。其实 cni 存在的意义就在于让第三方网络组件能够更顺利的连接 k8s,因为pod由kubelet去创建的,pod的网络也是由kubelet去 分配的,那kubelet这么去创建的容器呢,kubelet调用docker的API去实现的,也就是使用dockershim来创建容器,并且也会调用cni二进制 文件为容器分配网络,比如分配一个ip,有cni就是为了网络规范,k8s这块不能都满足所有的需求,所以它制定了一个规范,只要按照它的 规范就能接入到k8s的网络中来,它能结藕组件,也就是接入想用的组件都可以,只要满足这个需求。
(1) CNI二进制程序默认路径
# kubelet -> dockershim -> 调用cni插件为infra container分配网络(/opt/cni/bin)
(2) CNI配置文件默认路径
要使用 Flannel 作为容器网络方案。
(3) cni插件、配置文件路径在kubelet启动参数中定义
4.3 Kubernetes网络组件之 Flannel
1 Flannel 部署
护进程在每台主机上运行,并负责维护ETCD信息和路由数据包。
) 项目地址 https://github.com/flannel-io/flannel (2) yaml文件下载地址 # wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml (3) 部署 1) 在每个节点上部署cni二进制文件 # mkdir -p /opt/cni/bin/ # tar -xzf cni-plugins-linux-amd64-v1.0.1.tgz -C /opt/cni/bin/ 2) 在k8s master节点上应用kube-flannel.yml文件 # kubectl apply -f kube-flannel.yml (4) 在应用kube-flannel.yml文件之前,有两处可能需要调整 # vim kube-flannel.yml net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" } } 1) Network:指定Pod IP分配的网段,与controller-manager配置的保持一样 --allocate-node-cidrs=true --cluster-cidr=10.244.0.0/16 kubeadm部署 # /etc/kubernetes/manifests/kube-controller-manager.yaml 二进制部署 # /opt/kubernetes/cfg/kube-controller-manager.conf 2) Backend:指定工作模式,Flannel支持多种工作模式 udp # 最早支持的一种方式,由于性能最差,目前已经弃用。 vxlan # Overlay Network方案,源数据包封装在另一种网络包里面进行路由转发和通信(隧道方案)。 host-gw # Flannel通过在各个节点上的Agent进程,将容器网络的路由信息写到主机的路由表上,这样一来所有的主机都有整个容器网络的路由 数据了(路由方案)。 directrouting # 同时支持vxlan和host-gw工作模式。 公有云VPC # ALIYUN,AWS