一、k8s网络规划
(一)、k8s网络设计
1、每个Pod都拥有一个独立IP地址,Pod内所有容器共享一个网络命名空间。
2、集群内所有pod都在一个直接联通的扁平网络中,可通过IP直接访问。
(1)所有的Pod之间可以在不使用NAT网络地址转换的情况下相互通信。
(2)所有的Node之间可以在不使用NAT网络地址转换的情况下相互通信
(3)每个pod自己看到的自己的IP和其他pod看到的一致
(二)、k8s网络要求
k8s对网络的要求总的来说主要有两个基本要求,分别是:
(1)要能够为每一个node上的pod分配互相不冲突的IP地址
(2)要所有Pod之间能够互相访问
(三)K8s网络规范
CNI是由coreos提出的一个容器网络规范。已采纳规范的包括apache mesos,cloud foundry,kuberne,另外contiv networking,project calico和weave这些项目也为CNI提供插件。
CNI(容器网络接口):
这是k8s中提供一种通用网络标准规范,因为K8s本身不提供网络解决方案。目前比较知名的网络解决方案有:
flannel
calico
canel
kube-router
.......
(四)k8s网络规范
(1)隧道方案
隧道方案在Iaas层的网络中应用也比较多,将Pod分布在一个大二层的网络规范下。网络拓扑简单,但随着节点规范的增长复杂度会提升。
weave:UDP广播,本机建立新的BR,通过PCAP互通
open vswitch(OVS):基于Vxlan和GRE协议,但是性能方面损失比较严重
Flannel:UDP广播,Vxlan
Racher:IPsec
(2)路由方案
路由方案一般是从3层或者2层实现隔离和跨主机容器互通的,出了问题也很容易排查
Calico:基于BGP协议的路由方案,支持很细致的ACL控制,对混合云亲和度比较高。
Macvlan: 从逻辑和kernel层来看隔离性和性能最优的方案,基于二层隔离,所以二层路由器支持。大多数云服务商不支持,所以混合云上比较难以实现
- (五)k8s pod网络创建流程
(1)每个Pod除了创建时指定的容器外,都有一个kubelet启动时指定的基础容器
(2)kubelet创建基础容器,生成network namespace
(3)kubelet调用网络CNI drive,由它根据配置调用具体CNI插件(eg:calico,flannel)
(4)CNI插件给基础容器配置网络
(5)pod中其他的容器共享使用基础容器的网络
二、K8S网络
前言:K8S有三种网络三种IP
(一)k8s的网络通信问题:
1、容器间通信问题:即同一个pod内多个容器间通信,通常使用loopback来实现。
2、pod间通信:k8s要求,pod和pod之间通信必须使用pod-ip“直接”访问另一个pod-ip
3、pod与service通信:即pod-ip去访问clusterip,当然,clusterip实际上是IPVS或iptables规则的虚拟IP,是没有TCP/IP协议栈支持的。但不影响pod访问它。
4、service与集群外部client的通信,即k8s中提供的服务必须能被互联网上的用户所访问到。
(二)pod网络与service网络的初步认识
k8s为pod和service资源对象分别使用了各自的专用网络,pod网络由k8s的网络插件配置实现;而service的网络则由k8s集群给予实现。
为了提供更灵活的解决方案,k8s的网络模型需要借助外部插件实现,它要求任何实现机制都必须满足以下要求:
1)所有Pod之间均可不通过NAT机制而直接通信
2)所有节点均可不结果NAT机制而直接与所有容器通信。
3)容器自己使用的IP地址也是其他容器或节点直接看到的地址。换句话说,所有pod对象都位于同一个平面网络中,而且可以使用pod自身的地址直接通信
k8s使用的网络插件必须能为pod提供满足以上的要求,它需要为每个Pod配置至少一个特定的地址,即pod ip。
(1)IP是否存在于网卡上
pod ip地址实际存在于某个网卡(可以是虚拟设备)上;而service的地址却是一个虚拟IP地址,没有任何网络接口,在将其调度至后端pod对象。service的IP地址是集群提供服务的接口,也称为cluster ip。
(2)IP由哪个插件配置
pod网络机器IP由k8s的网络插件负责配置和管理,具体使用的网络地址可在管理配置插件时指定,如10.244.0.0/16网络;而cluster网络和IP则是由k8s集群负责配置和管理,如10.96.0.0/12网络
(3)总结:
总结起来,k8s集群至少应该包含三个网络,如下图所示。一个是各主机(master、node和etcd等)自身所属的网络,其地址配置与主机的网络接口,用于各主机之间的通信,例如,master与个node之间的通信。
此地址配置与k8s集群构建之前,它并不能由k8s管理,管理员需要于集群构建之前自行确定其地址配置及管理方式。
第二个是k8s集群上赚用于pod资源对象的网络,它是一个虚拟网络,用于为各pod对象设定IP地址等网络参数,其地址配置与pod中容器的网络接口之上。pod网络需要借助k8s插件或NCI插件实现,改插件可独立于部署于k8s集群之外,亦可托管于k8s之上,它需要在构建k8s集群时由管理员定义,而后在创建pod对象时由其自动完成各网络参数的动态配置。
第三个是专用与service资源对象的网络,它也是一个虚拟网络,用于为k8s集群之中的service配置IP地址,但此地址并不配置于任何主机或容器的网络接口之上,而是通过node之上的kube-proxy配置为iptables或ipvs规则,(际上是IPVS或iptables规则的虚拟IP)从而将发往此地址的所有流量调度至其后端的各pod对象之上。service网络在k8s集群创建时给予指定,而各service地址则在用户创建service时给予配置。
- 三种IP的定义与理解
三种IP定义:
1、node ip:node节点的IP地址,即物理机(虚拟机)的IP地址。
2、pod ip: pod的IP地址,即docker容器的IP地址(由flannel提供),此为虚拟IP地址
3、cluster ip:service的IP地址,此为虚拟IP地址。
三种IP的理解:
(1)node ip: 是物理机IP(或虚拟机ip)。每个service都会在node节点上开通过一个端口,外部可以通过http://nodeip:nodeport即可访问service里的pod提供的服务。
(2)cluster ip:是service的IP地址,此为虚拟ip地址,外部网络无法ping通,只有k8s集群内部访问使用;cluster ip仅仅作用于k8s service这个对象,并由k8s管理和分配IP地址;cluster ip无法被ping,他没有一个“实体网络对象”。单独的cluster ip不具备通信的基础,并且他们属于k8s集群这样一个封闭的空间;在不同service的pod节点在集群间相互访问可以通过cluster ip。
(3)pod ip:是每个pod的IP地址,一般由网络插件提供配置(flannel),通常是一个虚拟的二层网络。同service下的pod可以直接根据podip相互通信;不同service下的pod在集群间pod通信要借助于cluster ip;
pod和集群通信,要借助于node ip。
(四)k8s的网络中pod的通信
1、通一个pod内的容器间通信:
因为pause容器提供pod内网络共享,所以容器直接可以使用localhost(lo,loopback,环回侦听端口)访问其他容器。
2、各pod彼此之间的通信(两个pod在一台主机上面,两个pod分布在不同主机之上)
1)两个pod在一台主机上面:通过dockere默认的docker网桥互联容器(docker0)
2)两个pod分布在不同主机之上:通过CNI插件实现,eg: flannel,calico
3、pod与service之间的通信
service分配的IP叫做cluster ip,是一个虚拟IP(相对固定,除非删除service),ip只能在k8s集群内部使用(clusterip模式);如果service需要对外提供,只能使用nodeport方式映射到主机上,使用主机的ip和端口对外提供服务(nodeport模式)。
节点上面有个kube-proxy进程,这个进程会从master apiserver、etcd获取信息,感知service和endpoint(用来记录一个service对应的所有pod的访问地址。)的创建,然后做两个事:
1)为每个service在集群中每个节点上面创建一个随机端口,任何此端口上面的连接会代理到相应的pod。
2)集群中每个节点安装iptables/ipvs规则,用于clusterip+port路由到上一步定义的随机端口上。
所以集群中每个Node节点都有service的转发规则:iptables -L -n -t filter
备注:
Linux网络名词的解释:
(1)网络的命名空间:Linux在网络栈中引入网络命名空间,将独立的网络协议栈隔离到不同的命名空间中,彼此间无法通信。
(2)veth设备对(v+eth):veth设备对的引入实现在不同网络命名空间的通信。
(3)iptable/netfilter: netfilter负责在内核中执行各种挂接的规则(过滤、修改、丢弃等),运行在内核模式中;iptables模式是在用户模式下运行的进程,负责协助维护内核中netfileter的各种规则表;通过两者的配合来实现整个linux网络协议中灵活的数据包处理机制。
(4)网桥:网桥是一个二层网络设备,通过网桥可以将Linux支持的不同端口连接起来,并实现类似交换机那样的多对多的通信。
(5)路由:linux系统包含一个完整的路由功能,当IP层在处理数据发送或转发的时候,会使用路由表来决定发往哪里。