为了对公有云进行资源管理,诞生了资源管理器:
MESOS–》Docker Swarm–》Kubernetes
MESOS:Mesos是Apache旗下的开源分布式资源管理框架,它被称为是分布式系统的内核,后来在twitter得到广泛使用。
Twitter也是mesos的最大客户,但是大概在2019年5月份,Twitter 宣布不再使用MESOS,而改用 Kubernetes,至此,Mesos已经是慢慢的被淘汰了
Docker Swarm,是一个非常轻量的群集管理工具,只有几十MB大小。
Swarm 是 Docker官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。
但是Swarm 和 Kubernetes 比较类似,因为更加轻,所以具有的功能也较 kubernetes 更少一些。
大概在2019年7月份,阿里云宣布将Docker Swarm 从选择列表中剔除,这也意味着在不就得将来,Docker Swarm 也会像Mesos一样慢慢被淘汰掉。
Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本。
Kubernetes的名字来自希腊语,意思是“舵手” 或 “领航员”,所以他的图标是这样的
在这里插入图片描述
一、什么是Kubernetes
Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。
K8S用于容器化应用程序的部署,扩展和管理。
K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。
Kubernetes目标是让部署容器化应用简单高效。
二、Kubernetes特性
自我修复
在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
弹性伸缩
使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
自动部署和回滚
K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不影响业务。
(滚动更新的时候:不可避免的会有一部份请求访问到新容器,一部分访问到旧容器)
补充:两种部署更新方式
蓝绿部署:
可用区分为两大块,可用区A更新,可用区B接收请求;可用区B更新,可用区A接收请求
灰度部署:
(金丝雀)适用于体量大,业务不能停的业务 属于滚动更新,一次更新一个Pod,而不是同时删除所有Pod
服务发现和负载均衡
K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。
统一访问入口:统一的管理入口;统一的客户端访问入口
机密和配置管理
管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。
存储编排
挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。
批处理
提供一次性任务,定时任务;满足批量数据处理和分析的场景。
三、Kubernetes集群架构与组件
在这里插入图片描述
3.1master节点组件
Master组件提供集群的管理控制中心。
Master组件可以在集群中任何节点上运行。但是为了简单起见,通常在一台VM/机器上启动所有Master组件,并且不会在此VM/机器上运行用户容器。
kubectl:管理人员入口(命令工具)
Auth:身份认证;验证是否具备管理权限
Etcd:分布式键值对存储数据库;用于保存集群的状态信息、用户信息等(支持持久化)。etcd与其他数据库最大的区别便是其可以自动发现服务这是其他数据库无法做到的
API Server:作为整个集群的唯一入口,具备核心的管理机制和任务分配机制,起着协调各个组件的作用。kube-apiserver用于暴露Kubernetes API。任何的资源请求/调用操作都是通过kube-apiserver提供的接口进行。
controller-manager:指定类型(无状态还是有状态);处理集群中常规后台任务,一个资源对应一个控制器,而controller-manager就是负责管理这些控制器的;维持副本期望的数目
scheduler:调度程序,根据调度算法为新创建的Pod选择到哪一个node节点上(人为指定到哪个node节点时,就不经过scheduler)
3.2node节点组件
kubelet:master节点的全权代理;kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。
Pod:k8s的基本管理单元;容器的集合(往往一个Pod中只跑一个容器,方便管理)
kube-proxy:客户端访问请求的代理,在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
docker或rocket:容器引擎,运行容器
3.3K8S的架构
单master结构:这种架构只适用于实验环境,由于是一个单master节点所以其非常容易出现单点故障。一个master节点下面运行着3个node节点和三个etcd数据库。
在这里插入图片描述
多master节点架构:在整个集群的最前端是由至少两个代理服务器接收来自外部的请求,并转发给master节点和node节点。至少两个master节点互为主备关系,其他的节点不变。
在这里插入图片描述
四、K8S的核心概念
1.Pod
在node节点中的pod是运行容器、管理容器的最小部署单元,其中一个pod可以管理一个或者多个容器,然而在生产环境中最好让一个pod中运行一个容器。
当然也有个例外,作为运维人员我们都搭建过ELK企业日志收集分析集群。在web端,我们不仅要搭建web服务器还要搭建logstash进行日志文件的收集工作。这时我们就需要将web容器和logstash容器一起运行在同一个pod之中。我们称其为带斗容器。
一个Pod中的容器共享网络命名空间;Pod是短暂的。
在这里插入图片描述
2.Controllers
在master节点上运行的controller-manager,其主要的功能是:replicaset,保证pod的副本数量,这个数量是运维工程师制定的,但是在资源无法满足的情况下是无法创建出目标数量的pod,所以才叫做预期的pod数量。
在K8S中还要考虑到无状态和有状态pod的创建:deployment和statefulset。无状态应用的部署最典型的就是各种web服务,即使出现宕机只要集群中有备份就不会出现数据不对等的情况。而典型的有状态服务是数据库,一旦有一个数据库出现宕机,等到其重新上线由于数据库内容与集群中其他数据库中的内容不一致就非常容易出现数据不对等的情况。
daemonset,确保所有node运行同一个pod。
job和cronjob:一次性任务和定时任务。
3.Service
防止Pod失联;定义一组Pod的访问策略
4.Label
标签,附加到某个资源上,用于关联对象、查询和筛选
5.Namespaces
命名空间,将对象逻辑上隔离
6.Annotations
注释
五、Flannel网络规划服务
Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。而且它还能在这些IP地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不动的传递到目标容器内。
Overlay Network:覆盖网络,在基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路连接起来。
VXLAN:将源数据包封装到UDP中,并使用基础网络的IP/MAC作为外层报文头进行封装,然后在以太网上传输,到达目的地后由隧道端点(VTEP)解封装并将数据发送给目标地址。
Flannel:是Overlay网络的一种,也是将源数据包封装在另一种网络包里面进行路由转发和通信,目前已经支持UDP、VXLAN、AWS VPC和GCE路由等数据转发方式。
VXLAN介绍:
VXLAN(Virtual eXtential LAN)意为虚拟可拓展局域网。随着大数据、云计算技术的兴起以及虚拟化技术的普及,VLAN技术的弊端逐渐显现出来,具体表现为如下3个方面:
(1) 虚拟化技术的发展促使大数据、云计算技术公司采用单个物理设备虚拟多台虚拟机的方式来进行组网,随着应用模块的增加,对于支持VLAN数目的要求也在提升,802.1Q标准中的最多支持4094个VLAN的能力已经无法满足当下需求。
(2) 公有云提供商的业务要求将实体网络租借给多个不同的用户,这些用户对于网络的要求有所不同,而不同用户租借的网络有很大的可能会出现IP地址、MAC地址的重叠,传统的VLAN仅仅解决了同一链路层网络广播域隔离的问题,而并没有涉及到网络地址重叠的问题,因此需要一种新的技术来保证在多个租户网络中存在地址重叠的情况下依旧能有效通信的技术。
(3) 虚拟化技术的出现增加了交换机的负担,对于大型的数据中心而言,单台交换机必须支持数十台以上主机的通信连接才足以满足应用需求,而虚拟化技术使得单台主机可以虚拟化出多台虚拟机同时运行,而每台虚拟机都会有其唯一的MAC地址。这样,为了保证集群中所有虚机可以正常通信,交换机必须保存每台虚机的MAC地址,这样就导致了交换机中的MAC表异常庞大,从而影响交换机的转发性能。
基于以上需求,VXLAN技术被提出。
VXLAN技术是网络Overlay技术的一种实现,对于Overlay技术,笔者的理解是:在基于物理网络拓扑的基础上通过一定的技术来构建虚拟的、不同于物理网络拓扑的逻辑网络,而物理网络的拓扑结构对于Overlay终端而言是透明的,终端不会感知到物理网络的存在,而仅仅能感知到逻辑网络结构。对于终端的视角,网络的情况和直接通过物理设备实现逻辑拓扑的效果是相同的。VXLAN技术可以基于三层网络结构来构建二层虚拟网络,通过VLAN技术可以将处于不同网段网络设备整合在同一个逻辑链路层网络中,对于终端用户而言,这些网络设备似乎“真实地”部署在了同一个链路层网络中。
通过VXLAN可以使得两台终端在“逻辑上”位于“同一个”链路层网络中而与两台终端直接相连的路由器也在逻辑上构建了一条在虚拟链路中的通道vxlan tunnel,这样的路由器我们称之为“vxlan隧道终端”(VXLAN Tunnel End Point, VTEP)。
不同node间的node通信时数据包结构变化:
1.不同节点间数据出去时的封装:有两层地址,
有效数据+flannel虚拟封装+物理封装
2.到达目标node后先解除物理网络的封装
3.flannel组件再解除内层虚拟封装,目标容器就可以看到里面的有效数据