一个方针:容器操作;两地三中心;四层服务发现;五种Pod同享资源;六个CNI常用插件;七层负载平衡;八种阻隔维度;九个网络模型准则;十类IP地址;百级产品线;千级物理机;万级容器;相如无亿,k8s有亿:亿级日服务人次。
一个方针:容器操作
Kubernetes(k8s)是主动化容器操作的开源渠道。这些容器操作包含:布置、调度和节点集群间扩展。
详细功用:
主动化容器布置和仿制。
实时弹性缩短容器规划。
容器编列成组,并供给容器间的负载平衡。
调度:容器在哪个机器上运转。
组成:
kubectl:客户端指令行东西,作为整个体系的操作进口。
kube-apiserver:以RESTAPI服务方法供给接口,作为整个体系的操控进口。
kube-controller-manager:履行整个体系的后台使命,包含节点情况情况、Pod个数、Pods和Service的相关等。
kube-scheduler:担任节点资源办理,接纳来自kube-apiserver创立Pods使命,并分配到某个节点。
etcd:担任节点间的服务发现和装备同享。
kube-proxy:运转在每个估算节点上,担任Pod网络署理。守时从etcd获取到service信息来做相应的战略。
DNS:一个可选的DNS服务,用于为每个Service目标创立DNS记载,这样一切的Pod就能够经过DNS拜访服务了。
下面是k8s的架构拓扑图:
两地三中心
两地三中心包含本地分娩中心、本地灾备中心、异地灾备中心。
两地三中心要处理的一个重要问题便是数据一致性问题。
k8s运用etcd组件作为一个高可用、强一致性的服务发现存储库房。用于装备同享和服务发现。
它作为一个遭到Zookeeper和doozer启示而催生的项目。除了具有他们的一切功用之外,还具有以下4个特色:
容易:依据HTTP+JSON的API让你用curl指令就能够轻松运用。
安全:可选SSL客户认证机制。
快速:每个实例每秒支撑一千次写操作。
可信:运用Raft算法充沛完成了分布式。
四层服务发现
先一张图解释一下网络七层协议:
k8s供给了两种方法进行服务发现:
环境变量:当创立一个Pod的时期,kubelet会在该Pod中注入集群内一切Service的相关环境变量。须要留意的是,要想一个Pod中注入某个Service的环境变量,则有必要Service要先比该Pod创立。这一点,简直使得这种方法进行服务发现不可用。
比方,一个ServiceName为redis-master的Service,对应的ClusterIP:Port为10.0.0.11:63则对应的环境变量为:
DNS:能够经过clusteradd-on的方法轻松的创立KubeDNS来对集群内的Service进行服务发现。
以上两种方法,一个是依据TCP,DNS依据UDP,它们都是建立在四层协议之上。
五种Pod同享资源
Pod是k8s最基本的操作单元,包含一个或多个严密相关的容器。
一个Pod能够被一个容器化的环境看作运用层的“逻辑宿主机”;一个Pod中的多个容器运用通常是严密耦合的,Pod在Node上被创立、发动或许毁掉;每个Pod里运转着一个独特的被称之为Volume挂载卷,因而他们之间通讯和数据交换更为高效。在规划时咱们能够充沛利用这一特性将一组密切相关的服务进程放入同一个Pod中。
同一个Pod里的容器之间仅需经过localhost就能相互通讯。

一个Pod中的运用容器同享五种资源:
PID命名空间:Pod中的不同运用程序能够看到其他运用程序的进程ID。
网络命名空间:Pod中的多个容器能够拜访同一个IP和端口规模。
IPC命名空间:Pod中的多个容器能够运用SystemVIPC或POSIX音讯行列进行通讯。
UTS命名空间:Pod中的多个容器同享一个主机名。
Volumes(同享存储卷):Pod中的各个容器能够拜访在Pod等级界说的Volumes。
Pod的生命周期经过ReplicationController来办理;经过模板进行界说,然后分配到一个Node上运转,在Pod所包含容器运转完结后,Pod完结。
Kubernetes为Pod规划了一套共同的网络装备,包含为每个Pod分配一个IP地址,运用Pod名作为容器间通讯的主机名等。
六个CNI常用插件
CNI(ContainerNetworkInterface)容器网络接口是Linux容器网络装备的一组规范和库,用户须要依据这些规范和库来开发自己的容器网络插件。CNI只专心处理容器网络连接和容器毁掉时的资源开释,供给一套结构。所以CNI能够支撑许多不同的网络形式,并且简单完成。
下面用一张图表明六个CNI常用插件:
七层负载平衡
提负载平衡就不得不先提服务器之间的通讯。
IDC(InternetDataCenter)也可称数据中心、机房,用来放置服务器。IDC网络是服务器间通讯的桥梁。
上图里画了许多网络设备,它们都是干啥用的呢?
路由器、交换机、MGW/NAT都是网络设备,依照功用、内外网区分不同的人物。
内网接入交换机:也称为TOR(topofrack),是服务器接入网络的设备。每台内网接入交换机下联48台服务器,运用一个掩码为/24的网段作为服务器内网网段。
内网中心交换机:担任IDC内各内网接入交换机的流量转发及跨IDC流量转发。
MGW/NAT:MGW即LVS用来做负载平衡,NAT用于内网设备拜访外网时做地址转化。
外网中心路由器:经过静态互联运营商或BGP互联美团一致外网渠道。
先说说各层负载平衡:
二层负载平衡:依据MAC地址的二层负载平衡。
三层负载平衡:依据IP地址的负载平衡。
四层负载平衡:依据IP+端口的负载平衡。
七层负载平衡:依据URL等运用层信息的负载平衡。
这儿用一张图来说说四层和七层负载平衡的差异:
上面四层服务发现讲的主要是k8s原生的kube-proxy方法。k8s关于服务的露出主要是经过NodePort方法,经过绑定minion主机的某个端口,然后进行Pod的恳求转发和负载平衡,但这种方法有下面的缺点:
Service可能有许多个,假如每个都绑定一个Node主机端口的话,主机须要敞开外围的端口进行服务调用,办理紊乱。
无法运用许多公司要求的防火墙规矩。
抱负的方法是经过一个外部的负载平衡器,绑定固定的端口,比方80;然后依据域名或许服务名向后面的ServiceIP转发。
Nginx很好的处理了这个需求,但问题是假如有的新的服务参加,怎么去修正并且加载这些Nginx装备?
Kubernetes给出的计划便是Ingress。这是一个依据七层的计划。
八种阻隔维度
k8s集群调度这边须要对上面从上到下、从粗粒度到细粒度的阻隔做相应的调度战略。
九个网络模型准则
k8s网络模型要契合四个根底准则、三个网络要求准则、一个架构准则、一个IP准则。
每个Pod都具有一个独立的IP地址,并且假定一切Pod都在一个能够直接连通的、扁平的网络空间中,不论是否运转在同一Node上都能够经过Pod的IP来拜访。
k8s中的Pod的IP是最小粒度IP。同一个Pod内一切的容器同享一个网络仓库,该模型称为IP-per-Pod模型。
Pod由docker0实践分配的IP。
Pod内部看到的IP地址和端口与外部保持一致。
同一个Pod内的不同容器同享网络,能够经过localhost来拜访对方的端口,相似同一个虚拟机内不同的进程。
IP-per-Pod模型从端口分配、域名解析、服务发现、负载平衡、运用装备等视点看,Pod能够看做是一台独立的虚拟机或物理机。
一切容器都能够不必NAT的方法同其他容器通讯。
一切节点都能够在不同NAT方法下同一切容器通讯,反之亦然。
容器的地址和他人看到的地址是同一个地址。
要契合下面的架构:
由上图架构引申出来IP概念从集群外部到集群内部:
十类IP地址
我们都知道IP地址分为ABCDE类,别的还有五类独特用处的IP。
第一类
A类:1.0.0.1226.255.255.2默许子网掩码/即255.0.0.0。
B类:128.0.0.191.255.255.2默许子网掩码/即255.255.0.0。
C类:192.0.0.223.255.255.2默许子网掩码/即255.255.255.0。
D类:224.0.0.239.255.255.2一般用于组播。
E类:240.0.0.255.255.255.255(其间255.255.255.255为全网播送地址)。E类地址一般用于研讨用处。
第二类
0.0.0.0
严格来说,0.0.0.0现已不是一个真实意义上的IP地址了。它表明的是这样一个调集:一切不清楚的主机和意图网络。这儿的不清楚是指在本机的路由表里没有特定条目指明怎么抵达。作为缺省路由。
127.0.0.1本机地址。
第三类
224.0.0.1组播地址。
假如你的主机敞开了IRDP(internet路由发现,运用组播功用),那么你的主机路由表中应该有这样一条路由。
第四类
169.254.
运用了DHCP功用主动获取了IP的主机,DHCP服务器产生毛病,或呼应时刻太长而超出了一个体系规则的时刻,体系会为你分配这样一个IP,代表网络不能正常运转。
第五类
10.xxx、172.16.~172.31.、192.168.私有地址。
许多用于企业内部。保存这样的地址是为了防止亦或是哪个接入公网时引起地址紊乱。
