Kubernetes总结一:初识Kubernetes
Kubernetes总结一:初识Kubernetes
文章目录
一. 简述
1. 由来
Kuberbetes简称 K8S
,来源于古希腊语,意思是 舵手
。是由Google的几位工程师创立的,2014年6月首次对外公布。K8S的开发深受谷歌内部的一个叫做 Borg
系统的影响,Borg系统是谷歌内部稳定运行了十几年的大规模容器编排工具。谷歌沿用Borg系统的思路,用 GO
语言重新构建了这个容器编排工具,并命名为Kubernetes。
2. 简介
Kubernetes一个用于容器集群的自动化部署、扩容以及运维的开源平台。通过Kubernetes,你可以快速有效地响应用户需求;快速而有预期地部署你的应用;极速地扩展你的应用;无缝对接新应用功能;节省资源,优化硬件资源的使用。为容器编排管理提供了完整的开源方案。
- 容器:一般指Docker容器,通过容器隔离的特性和宿主机进行解耦,与宿主机互不影响。而kubernetes则负责管理服务中所有的Docker容器,创建、运行、重启与删除容器。
-
快速响应
- 新增或者修改需求时,可以快速进行部署测试(CICD)
- kubernetes可以根据不同条件进行动态扩缩容
- 举个栗子,用户访问量突然由1000人上升到100000人时,现有的服务已经无法支撑,kubernetes会自动将用户服务模块增加更多实例以保证当前的系统访问量。
- 扩展:完善的注册发现机制,当某个服务的实例增加时,kubernetes会自动将其加入服务列表中,免除在传统运维中需要人工维护服务列表的问题。
- 对接新应用:kubernetes是一个通用的容器编排框架,支持不同类型的语言,或者是语言无关的,新增加的应用都会以一个新的对象进行接入。
- 硬件资源:这一点我觉得是kubernetess很基本但是非常重要的一个优点了,kubernetes在部署应用时会自动检查各个服务器的cpu与内存使用量,同时会根据服务申请的cpu与内存资源,将服务部署到最合适的服务器。(其实这就是容器调度的核心功能了)
3. 特性
- 自动装箱:基于资源依赖,以及其它约束,能够自动完成容器的部署而且不影响可用性。
- 自我修复:具有自愈能力,考虑到容器非常轻量级的特点,一旦某个应用容器崩溃了,可以很快启动一个新的应用容器替代。
- 水平扩展:能够实现自动水平扩展,一个容器不够,就再启一个,可以不断的扩展,只要你的物理平台资源足够。
- 服务发现/负载均衡:自动实现服务发现和负载均衡
- 自动发布和回滚:kubernetes在部署服务时,会记录部署服务的版本,我们可以很容易的进行上次版本或跨版本回退。
- **和配置管理
- 存储编排:对存储卷实现动态供给。如某一个容器需要用到存储卷时,会根据容器的需求自动创建符合要求的存储卷
- 批量处理执行
二.kubernetes架构与组成
1. 架构
kubernetes 属于主从分布式架构,主要由 Master节点 和 Node节点 组成,以及包括客户端命令行工具 kubectl 和其它附加项。
Master节点 包含API Server
、Scheduler(调度器)
、ControllerManager(控制器管理器)
这三个核心的组件。
Node节点 包含Kubelet
、Docker(容器引擎)
、Kube-proxy
这三个核心的组件。
-
k8s架构:
-
k8s运行流程
2. 组成
Master节点
- 简介:集群
控制管理
节点,所有命令都经由master处理 - 组成:
-
API Server:
提供rest接口
,是k8s里所有资源增删改查的唯一入口
-
Scheduler:负责
pod调度
,按照预定的调度策略将Pod调度到响应的机器上 -
ControllerManager:k8s所有对象的自动化控制中心,
资源对象大总管
。维护集群状态,比如故障检测,自动扩展,滚动更新等
-
API Server:
etcd
- 简介:一个高可用
键值存储系统
,主要用于共享配置
和服务发现
- 作用:
- 功能与zookeeper相似,但更加轻量
- 通过Raft算法保证一致性
- 特点:
- 简单:支持curl方式的用户api(http+json)
- 安全:可选的ssl客户端证书认证
- 快速:单实例 1000次/秒 读写
- 可靠:通过Raft算法保证强一致性
Node节点
- 简介:集群
工作负载节点
, 如果宕机,上面的docker会被master转移到其他节点上 - 组成:
-
kubelet:
- 负责
pod对应容器的创建和启停
(维护Pod生命周期) - 向 Master节点
汇报当前 Node节点 的资源使用情况
(如果某个node超过指定时间不上报信息,会被master判定为“失联”,node状态被标记为不可用“Not Ready”,随后master会触发“工作负载大转移”自动流程)
- 负责
-
kube-proxy : 实现
与kubernetes Service通信
与负载均衡
的重要组件 -
Docker : 负责
本机容器创建与管理
工作
-
kubelet:
3. 其他概念
Pod(容器组)
- 简介:
- Pod是
最小部署单元
,一个Pod由一个或多个容器组成,Pod中容器共享存储和网络
,在同一台Docker主机上运行 -
同一个Pod
里容器,共享同一个网络命名空间,可以使用localhost
互相通信
- Pod是
- 分类:
- 普通Pod:存放在etcd中
- 静态Pod:存放在Node具体文件中,且只能在此Node上启动运行
- 特点:
- 每个Pod都有一个“根容器”–
Pause容器
。和一个或多个业务容器 - 一个Pod里的容器与另外主机上的Pod容器能够直接通信
- 如果Pod所在Node宕机,这个Node的所有Pod会转移到其他Node上
- 一个Pod中的应用程序共享同一组资源
- PID命名空间:Pod中的不同应用程序可以看到其他应用程序的进程ID;
- 网络命名空间:Pod中的多个容器能够访问同一个IP和端口范围;
- IPC命名空间:Pod中的多个容器能够使用SystemV IPC或POSIX消息队列进行通信;
- UTS命名空间:Pod中的多个容器共享一个主机名;
- Volumes(共享存储卷):Pod中的各个容器可以访问在Pod级别定义的Volumes;
- 每个Pod都有一个“根容器”–
- 设置资源限额(CPU和Memory)
-
Request
: 资源最小申请量 -
Limits
: 资源最大允许使用量
-
- 图示
- pod组成:
- pod,容器,node之间关系:
- pod组成:
Pod控制器
- 简介:用来管理Pod
- 分类:
- ReplicationController (副本控制器),确保Pod的数量始终保持设定的个数。也支持Pod的滚动更新。主要用来
部署升级
- ReplicaSet (副本集),它不直接使用,有一个声明式更新的控制器叫
Deployment来负责管理
。但是Deployment只能负责管理那些无状态的应用。 - StatefulSet (有状态副本集),负责管理
有状态
的应用。 - DaemonSet ,如果需要在每一个Node上
只运行一个副本
,而不是随意运行,就需要DaemonSet。 - Job,运行作业,对于
时间不固定的操作
,比如:某个应用生成了一大堆数据集,现在需要临时启动一个Pod去清理这些数据集,清理完成后,这个Pod就可以结束了。 这些不需要一直处于运行状态的应用,就用Job这个类型的控制器去控制。如果Pod运行过程中意外中止了,Job负责重启Pod。如果Pod任务执行完了,就不需要再启动了。 - Cronjob,
周期性作业
。
- ReplicationController (副本控制器),确保Pod的数量始终保持设定的个数。也支持Pod的滚动更新。主要用来
Endpoint , Event
- EndPoint(IP+Port):标识
服务进程的访问点
- Event:一个
事件记录
,记录事件最早产生时间,最后重复时间,重复次数,发起者,类型,以及导致此时间原因。用来排查故障
Service(服务)
- 简介:
- k8s中的Service是对象资源之一,一个k8s Service是一个应用服务的抽象,定义了Pod逻辑集合和访问这个Pod集合的策略
- Service代理Pod集合对外表现是一个
访问入口
,分配集群IP地址,来自这个IP的请求,通过负载均衡转发后端Pod中的容器 - Service通过
Lable Selector
选择一组Pod提供服务 - Service被创建后,系统自动床架你一个同名的
endPoint
- kubernetes 中 ip 分类:
-
ClusterIp:Service的Ip地址(Service不是共用一个负载均衡器的ip地址,而是每个service分配一个
全局唯一的虚拟Ip地址
, 这个虚拟ip被称为ClusterIp) - NodeIp:node节点的IP地址,k8s每个节点的物理网卡的Ip地址
- podIp:pod的ip地址,是docker分配的,是一个虚拟二层网络,不同Node上的Pod能彼此通信。
-
ClusterIp:Service的Ip地址(Service不是共用一个负载均衡器的ip地址,而是每个service分配一个
- Pod,RC 与 Service 的关系
Label(标签)
- 简介:标签,用来分组管理
- 作用:
- Lable可以附加在各种资源对象上,一个资源对象可定义任意数量Label。
- 然后通过
Lable Selector
查询和筛选拥有某些label的资源对象。 - 通过给指定资源对象捆绑一个或多个Label来实现多维度资源分组管理
- 示例:
select * from pod where pod's name = 'xxx' , env ='yyy'
- 支持操作符:=、!=、in、not in
Deployment(部署)
- 简介:拥有更加灵活强大的升级,回滚功能。
- 作用:
升级,部署,回滚Pod
。官方推荐Replica Set + Deployment代替 RC
- 优势:相对于RC,可以知道当前Pod部署进度
- 使用场景:
- 创建一个Deployment对象来生成对应的Replica Set并完成Pod副本创建过程
- 检查更新Deployment的状态来查看部署动作是否完成:Pod副本数量是否达到预期的值
- 更新Deployment以创建新的Pod(比如镜像升级)
- 如果当前Deployment不稳定,则回滚到一个早先的Deployment版本
- 挂起或者恢复一个Deployment
HPA(横向自动缩扩容)
- 简介:Horizontal Pod Autoscaler简称HPA,意思是Pod横向自动扩容。
- 作用:
自动化,智能化缩扩容
- 实现:CPUUtilizationPercentage
- 通常使用一分钟平均值,通过Heapster扩展组件获取这个值
- 利用率计算:
Pod的CPU利用率 = Pod的CPU使用量/Pod Request
(如果没有定义Pod Reques的值,则无法使用)
Volume(数据卷)
- 简介:数据卷是Pod中能
被多个容器访问的共享目录
。定义在Pod上,被一个 Pod 中的多个容器挂载到具体文件目录下。与Pod生命周期相同。
NameSpace(命名空间)
- 简介:命名空间将对象逻辑上分配到不同的NameSpace,可以是不同的项目,用户等区分管理,并设定控制策略,从而实现多租户。命名空间也称为
虚拟集群
Kubectl(k8s命令行工具)
- 简介:通过命令行对
资源对象
(Node,Pod,Replication Controlle,Servcie 等) 进行增删改查
操作,并保存在etcd
进行持久化
Ingress(路由)
- 简介:无论是容器组还是Service,外网都是无法直接访问的,Ingress就可以通过一个负载IP与Kubernetes集群内部进行通讯,一般会
和Service对象进行配合使用
。
ConfigMap(配置项)
- 简介:简单理解为一个管理配置的对象,可以将项目的配置写入到ConfgiMap中,项目中的配置使用相应的变量名就可以读取相应的变量值。
概念理解起来比较困难,这里推荐一个形象的理解
用插画理解Kubernetes
插画版Kubernetes指南