Docker网络:可以在docker run的时候指定
bridge:这是Docker默认的网络驱动,此模式会为每一个容器分配Network Namespace和设置IP等,并将容器连接到一个虚拟网桥上。
如果未指定网络驱动,这默认使用此驱动。
1、安装docker的时候默认会启动一个docker0的虚拟网桥 docker network inspect bridge可以查看容器ip范围以及网关
2、创建容器的时候宿主机会创建虚拟网卡 veth pair ,成对出现,一端容器中eth0,另一端放在宿主机的dcoker0,以veth
为前 缀的名字命名 使用brctl show 查看
3、向外通讯的时候使用-p参数绑定主机的端口,采用NAT模式向外发送报文
NAT:网络地址转换,下一层封装上一层的ip信息进行伪装并且记录ip供报文返回寻找源ip
容器使用虚拟网卡eth0--veth--->docker0(网桥)---->eth0(宿主机的)
host:此网络驱动直接使用宿主机的网络。
none:此驱动不构造网络环境。采用了none 网络驱动,那么就只能使用loopback网络设备,容器只能使用127.0.0.1的本机网络
joined containers:使用某个已经存在的容器的网络命名空间
------------------------------------------------------------------------------------------------------------------------
overlay:此网络驱动可以使多个Docker daemons连接在一起,并能够使用swarm服务之间进行通讯。也可以使用overlay网络进行
swarm服务和容器之间、容器之间进行通讯
macvlan:此网络允许为容器指定一个MAC地址,允许容器作为网络中的物理设备,这样Docker daemon就可以通过MAC地址进行访问的
路由。对于希望直接连接网络网络的遗留应用,这种网络驱动有时可能是最好的选择。
Network plugins:可以安装和使用第三方的网络插件。可以在Docker Store或第三方供应商处获取这些插件
------------------------------------------------------------------------------------------------------------------------
kubernets网络模式
1、容器与容器之间的通信
每一个pod启动都会创建一个pause容器,该容器负责为pod提供统一的网络空间其他容器绑定该容器的网络命名空间,容器间使用
通讯localhost
2、Pod和Pod之间的通信
需要网络插件(cni)解决常用的有flannel(网络分配)、calico(提供网络策略)、目前组合使用
flannel:(不支持容器间网络策略,默认用的vxlan传输机制)一个为k8s提供叠加网络(overlay)的插件
采用L3 Overlay模式设计flannel, 规定宿主机下各个Pod属于同一个子网,不同宿主机下的Pod属于不同的子网
flannel会在每一个宿主机上运行名为flanneld代理,其负责为宿主机预先分配一个子网,并为Pod分配IP地址
使用Kubernetes或etcd来存储网络配置、分配的子网和主机公共IP等信息
数据包则通过VXLAN、UDP或host-gw这些类型的后端机制进行转发
VxLAN:可扩展虚拟局域网,使用内核中的vxlan模块封装报文,推荐使用方式
directrouting模式:vxlan使用隧道网络转发叠加网络的报文势必会造成不少的流量开销,所以设计的该模式,仅
仅在主机跨二层网络时才采取隧道方式转发通讯,其余时候直接采用二层网络转发pod报文,
从而省去隧道首部开销。
宿主机二层直达的时候会采取route模式其他使用vxlan,(集群规模不超过200台)
iptables -nL 查看forword链
ip route show 查看路由规则
UDP:使用普通udp报文封装完成隧道转发,性能低。
host-gw:通过在节点上创建目标地址的路由来完成报文的转发,性能好,但需要主机在同一个二层网络中,大型集群无
法满足
flannel运行过程:
1)设置集群网络
flannel默认使用etcd作为配置和协调中心,首先使用etcd设置集群的整体网络。通过如下的命令能够查询网络配置
信息:
etcdctl ls /coreos.com/network/config (安装etcd工具)
2)设置Node节点上的子网
基于在etcd中设置的网络,flannel为每一个Node分配IP子网。
获取子网列表etcdctl ls /coreos.com/network/subnets
获取子网信息etcdctl ls /coreos.com/network/subnets/{IP网段}
3)在每个Node上启动flannelid
flannel在每个Node上启动了一个flanneld的服务,在flanneld启动后,将从etcd中读取配置信息,并请求获取子网
的租约。所有Node上的flanneld都依赖etcd cluster来做集中配置服务,etcd保证了所有node上flanned所看到的配
置是一致 的。同时每个node上的flanned监听etcd上的数据变化,实时感知集群中node的变化。flanneld一旦获取
子网租约、配置后端后,会将一些信息写入/run/flannel/subnet.env文件
cat /var/run/flannel/subnet.env
4)创建虚拟网卡
在Node节点上,会创建一个名为flannel.1的虚拟网卡 ip addr show flannel.1
5)创建Docker网桥
并为容器配置名为docker0的网桥,实际是通过修改Docker的启动参数–bip来实现的。通过这种方式,为每个节点
的Docker0网桥设置在整个集群范围内唯一的网段,从保证创建出来的Pod的IP地址是唯一。
ip addr show docker0
6)修改路由表
flannel会对路由表进行修改,从而能够实现容器跨主机的通信
数据传递过程:container源--->docker0网桥(本机)--->flannel.1虚拟网卡(本机)--->宿主机eth0网卡--->目标主机
eth0网卡--->flannel.1虚拟网卡(目标)--->docker0网桥(目标)--->container目标
ip route查看路由规则
calico:bgp协议方式 ipip(三层隧道)提供网络策略
通过定义NetworkPolicy资源来进行
networkpolicy,定义时候ingress和egress 如果定义了生效又没有定义规则则执行默认(都拒绝)
拒绝所有出入站规则,放行本地namesapce的通信,其他的单独定义。
3、Pod和service之间的通信
通过iptables规则中得到serviceip代理的其中一个pod的ip进行通讯
------------------------------------------------------------------------------------------------------------------------
service
service:service为一组pod提供一个统一的代理服务ip解决了podip经常变化的问题,并且提供负载均衡。
service负载均衡策略设置:
service可以通过servicename解析需要强依赖coredns组件
kube-proxy:监听集群中的对 api-server 中的 service & endpoint 进行 watch ,一旦检测到更新则往 iptables 里全量推送
新的转发规则
mode参数:控制使用iptables或者ipvs
iptables和ipvs
ipvs:IPVS为大型集群提供了更好的可扩展性和性能。
IPVS支持比iptables更复杂的负载平衡算法(最小负载,最少连接,位置,加权等)。
IPVS支持服务器健康检查和连接重试等
service有四种类型
ExternalName:用来做集群外部服务引用的,需要externalIPs参数等
ClusterIP:通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的 ServiceType
NodePort:通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务
LoadBalancer:使用云提供商的负载局衡器,可以向外部暴露服务
------------------------------------------------------------------------------------------------------------------------
Ingress
Service虽然解决了服务发现和负载均衡的问题,但它在使用上还是有一些限制
只支持4层负载均衡,没有7层功能
对外访问时,NodePort类型需要在外部搭建额外的负载均衡,而LoadBalancer要求kubernetes必须跑在支持的cloud provider上
ingress controller
ngress controller通过与kubernetes API交互,动态的去感知集群中Ingress规则变化,然后读取它,按照它自己的模板生成一
段nginx配置,再写到nginx Pod中,最后reload以下
ingress:
就是一段nginx负载的配置文件
三种常用的模式
1:ingress-controller service
2:Traefik 微云应用而生无需重启操作
3:Envoy(服务网格目前习惯使用的 查看)
------------------------------------------------------------------------------------------------------------------------
网络策略:networkpolicy
------------------------------------------------------------------------------------------------------------------------
虚拟机设置静态ip
编辑ifcfg-eno16777736文件
#static assignment
NM_CONTROLLED=no #表示该接口将通过该配置文件进行设置,而不是通过网络管理器进行管理
ONBOOT=yes #开机启动
BOOTPROTO=static #静态IP
IPADDR=192.168.1.122 #本机地址
NETMASK=255.255.255.0 #子网掩码
GATEWAY=192.168.1.1 #默认网关
------------------------------------------------------------------------------------------------------------------------
隧道网络:
二层虚拟化网络:只识别MAC地址,不识IP地址
三层虚拟化网络:不但识别MAC地址,还能把MAC帧中的IP地址
core-dns:提供域名解析服务
flannel:负责集群的网络分配
calico:负责集群的网络策略
NAT:网络地址转换
macvlan:网卡虚拟化方案,它可以为一张物理网卡设置多个mac地址,相当于物理网卡施展了影分身之术,由一个变多个,同时要求物理
网卡打开混杂模式。
vxlan:虚拟可扩展局域网,是一种 overlay 网络技术
Overlay网络:一种网络架构上叠加的虚拟化技术模式,叠加网络
MTU值:数据链路层提供租后的mtu值,用来保证vxlan报文的顺利传输,