美文网首页
笔记-网络篇

笔记-网络篇

作者: 李潇_d8d7 | 来源:发表于2019-01-25 15:14 被阅读0次

    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报文的顺利传输,

    相关文章

      网友评论

          本文标题:笔记-网络篇

          本文链接:https://www.haomeiwen.com/subject/tuomjqtx.html