前言
资源管理器诞生
Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本。
Kubernetes的名字来自希腊语,意思是“舵手” 或 “领航员”,所以他的图标是这样的
一、什么是K8S
- Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。
- K8S用于容器化应用程序的部署,扩展和管理。
- K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。
- Kubernetes目标是让部署容器化应用简单高效。
二、K8S 特性
- 自我修复
在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
- 弹性伸缩
使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
- 自动部署和回滚
K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不影响业务。
(滚动更新的时候:不可避免的会有一部份请求访问到新容器,一部分访问到旧容器)
补充:两种部署更新方式
蓝绿部署:
可用区分为两大块,可用区A更新,可用区B接收请求;可用区B更新,可用区A接收请求
灰度部署:
(金丝雀)适用于体量大,业务不能停的业务
属于滚动更新,一次更新一个Pod,而不是同时删除所有Pod
- 服务发现和负载均衡
K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。
统一访问入口:统一的管理入口;统一的客户端访问入口
- 机密和配置管理
管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。
- 存储编排
挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。
- 批处理
提供一次性任务,定时任务;满足批量数据处理和分析的场景。
三、K8S 集群架构与组件
3.1 master组件
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.2 node组件
kubelet:master节点的全权代理;kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。
Pod:k8s的基本管理单元;容器的集合(往往一个Pod中只跑一个容器,方便管理)
kube-proxy:客户端访问请求的代理,在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作
docker 或 rocket:容器引擎,运行容器
3.3 k8s架构
单master结构:这种架构只适用于实验环境,由于是一个单master节点所以其非常容易出现单点故障。一个master节点下面运行着3个node节点和三个etcd数据库。
多master节点架构:在整个集群的最前端是由至少两个代理服务器接收来自外部的请求,并转发给master节点和node节点。至少两个master节点互为主备关系,其他的节点不变。
四、K8S 核心概念
1、Pod
- 最小部署单元
- 一组容器的集合
- 一个Pod中的容器共享网络命名空间
- Pod是短暂的。
2、Controllers
- ReplicaSet :确保预期的Pod副本数量
- Deployment :无状态应用部署
- StatefulSet :有状态应用部署
- DaemonSet :确保所有Node运行同一个Pod.
- Job :一次性任务
- Cronjob :定时任务
更高级层次对象,部署和管理Pod
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路由等数据转发方式。
不同node间的node通信时数据包结构变化:
1.不同节点间数据出去时的封装:有两层地址,
有效数据+flannel虚拟封装+物理封装
2.到达目标node后先解除物理网络的封装
3.flannel组件再解除内层虚拟封装,目标容器就可以看到里面的有效数据