【容器应用系列教程】Kubernetes介绍
一、Kubernetes介绍
1.Kubernetes
是什么
- 是容器编排工具
- 由
google
公司开源的应用,基于go
语言编写 - 简称
k8s
2.Kubernetes
的作用
- 服务发现和负载均衡
- 存储编排
- 自动部署和回滚
- 资源调度分配
- 自我修复
总而言之,
kubernetes
的目的就是让容器部署应用变得更简单、高效
二、Kubernetes组件介绍
1.Master
节点
Master
负责管理整个集群。Master
协调集群中的所有活动,例如调度应用、维护应用的所需状态、应用扩容以及推出新的更新
API Server
组件
- 与
etcd
数据库进行交互,读写集群状态信息 - 接收客户端操作请求, 验证身份
- 接收
kubelet
发送过来的注册请求
Scheduler
组件
- 调度客户端操作请求,选择合适的
Node
节点运行资源
Controller Manager
组件
- 管理集群控制器,例如
replication controller
负责维护容器的副本数量
2.Node
节点
运行
pod
的主机,可以是物理服务器,也可以是虚拟机
处理生产级流量的Kubernetes
集群至少应具有三个Node
container engine
组件
容器引擎
K8s
支持包括Docker
和Podman
在内的主流容器管理软件
kubelet
组件
- 调度容器引擎创建容器
kube-proxy
组件
- 在多个容器间实现负载均衡(LVS)
- 同样负责容器的发布服务(iptables)
3.etcd
数据库
记录集群状态数据,例如
node
节点信息、pod
信息、service
等
同样也是k8s
环境中,最重要的部分
三、Kubernets组件详解
通过k8s
集群创建一个pod
的过程说明组件间的交互过程
- 用户通过客户端工具向
api server
组件发送创建pod`的请求 api server
接收到该请求后,会将请求信息(pod名称、镜像、卷、网络等信息)记录到etcd
数据库scheduler
组件会周期性的请求api server
,以询问是否有操作请求api server
组件查询etcd
数据库响应scheduler
组件,scheduler
组件会得知存在创建pod
的请求scheduler
按一定的算法选择一个合适的node
节点计划创建Pod
, 并将选定的节点信息返回给api server
;api server
会将该node
节点要与创建的pod
对应关系写入etcd
数据库kublet
组件启动后,会先api server
注册自己,以让api server
得知有运行起kublet
服务的node
节点的存在,并将node
节点信息记录到etcd
数据库;这样scheduler
组件才可以根据数据库的记录选择合适的节点创建pod
kubelet
组件也会周期性的请求api server
, 以询问是否有自己要做的操作,api server
查询数据库响应kubelet
,kubele
t获知到要创建的pod
的信息后,调用container engine
创建容器- 容器创建完成后,为便于访问,由
kube-proxy
提供负载均衡
三、Kubernetes集群对象
1.Node
运行
pod
的主机,可以是物理服务器,也可以是虚拟机;每个node
节点上都要运行容器引擎(docker或rkt)、kubelet
组件及kube-proxy
组件
2.Namespace
命名空间,是资源或对象的抽象集合
kubernetes
集群默认会自动创建3
个namespace
- default——默认namespace
- kube-system
- k8s集群内部组件
- kube-public
3.Container
容器
4.Pod
kubernetes
所能管理的最小单元, 一个pod
中可以放一个容器,也可以放多个容器pod
的设计理念是支持多个容器在一个pod
中共享网络地址和文件系统k8s
集群会为每个pod
分配一个IP
,称为podIP
- 从实际应用角度讲,多数应用都是一个
pod
中只放一个容器 - 本质上讲,
k8s
创建一个pod
后,每个Pod
中至少存在两个容器,一个是用户自定义的容器,另一个是k8s
自动创建的名称为pause-amd64
的容器, 实际上Pod
的IP
是配置在pause
容器上的
5.Label
- 一个
key-value
键值对的数据结构,用于在k8s
集群中标识对象;例如每创建一个pod
都应该为其分配一个或多个label
- 一个对象可以被分配一个
label
或多个label
label
分配完成后,k8s集群会使用Label selector
来选择具有相同标签的一组资源
6.Annotations
key-value
键值对的数据结构,用于为对象添加注释说明信息- 默认情况下可以不写
- 在特殊应用场景下,可以通过
Annotations
辅助部署应用;例如特定的镜像结合特定的说明信息时
7.Replication Controller复制控制器 RC
RC
是k8s
集群中保证Pod
高可用的对象。通过监控运行中的Pod
来保证集群中运行指定数量的Pod
副本RC
通过Label Selector
机制实现对Pod
副本的自动控制
8.Replica Set 副本集 RS
RS
是新一代的RC
,提供同样的高可用能力。
9.Deployment部署
- 通过
Deployment
来管理集群中的RS
、Pod
- 在实际操作中,很少直接去操作
RS
或Pod
,在k8s
集群中要完成对RS
和Pod
的管理,都是通过操作Deployment
完成 Deployment
自动创建RS
保证Pod
副本- 在升级操作时,
Deployment
会做滚动升级 - 在升级操作时,如果检测到升级失败,会自动回滚
10.HPA Horizontal Pod Autoscaler
- 用于实现
Pod
自动横向扩容 HPA
会实时监测RC
中的Pod
的负载情况,完成自动扩展- 可通过
CPU
百分比、自定义指标QPS
实现
11.Service服务
- 将具有相同
label
的Pod
标记为一组,由集群为service
分配固定IP
,便于用户访问 - 可以理解为一个
service
是一组具有相同标签的Pod
的集合 - 由
kube-proxy
组件实现,kube-proxy
创建service
类似于负载均衡器,后端Pod
类似于real server
Pod
宕机产生新Pod
时,kube-proxy
会自动更新etcd
数据库关于service
与Pod
的对应关系
12.服务发现
- 借助
DNS
实现,coreDNS
组件 - 创建
service
时,k8s
集群会为其分配一个域名www.default.svc.cluster.local
- 域名格式:
- 服务名称.命名空间.svc.cluster.local
service
创建完成后,会自动形成IP
与域名的解析关系,集群内多个service
相互通信时,依靠域名实现
13.Job任务
k8s
集群执行批处理任务的对象- 用于运行一次性任务,任务成功完成后
Pod
自动退出,类似于一次性计划任务
14.DaemonSet
- 保证选定的业务在所有的节点运行一个
Pod
- 典型场景:监控
agent
, 日志收集工具filebeat
15.StatefulSet有状态服务
- 通过
Statefulset
创建的Pod
,集群会为其分配一个固定的名称,而且该名称创建后是不能修改的、也是集群全局唯一的;用于让构建业务集群的多个Pod
间通过名称通信,而不是借助IP
,来保证服务的有状态性 stateful
的实现要依赖于存储volume
,例如一个Pod
挂载一个独立的存储,该Pod
宕机后,自动创建一个新的Pod
,新Pod
一样会去挂载存储获取数据,这就相当于新Pod
继承的原有Pod
的所有数据及状态- 典型应用场景:数据库集群
16.Volume卷
用于实现数据持久化保存
17.Federation集群联邦
- 存在多个不同的
k8s
集群时,常规情况下,我们连接哪个集群创建资源,资源就会被创建在哪个集群里 Federation
基于全局控制器,可实现将多个不同的集群放到一个全局控制器中,创建资源时,向该全局控制器发送请求,全局控制器会选择一个集群创建资源Fderation
基于全局调度器,在访问资源时,向全局调度器发送请求,它会将请求转交到合适的集群处理