核心组件
- Kubernetes集群包含有
节点代理kubelet和Master组件(APIs, scheduler, etc)
,一切都基于分布式的存储系统。
核心组件
:etcd:
保存了整个集群的状态apiserver:
提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制controller manager:
负责维护集群的状态,比如故障检测、自动扩展、滚动更新等scheduler:
负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上kubelet:
负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理Container runtime:
负责镜像管理以及Pod和容器的真正运行(CRI)kube-proxy:
负责为Service提供cluster内部的服务发现和负载均衡
- 除了核心组件,还有一些推荐的
Add-ons
:- kube-dns:负责为整个集群提供DNS服务
- Ingress Controller:为服务提供外网入口
- Heapster:提供资源监控
- Dashboard:提供GUI
- Federation:提供跨可用区的集群
- Fluentd-elasticsearch:提供集群日志采集、存储与查询
关于kubectl、kubeadm、kubelet
kubeadm是kubernetes集群快速构建工具
kubelet运行在所有节点上,负责启动POD和容器,以系统服务形式出现
kubectl是kubenetes命令行工具,提供指令
kubernetes设计架构
- Kubernetes设计理念和功能其实就是一个类似Linux的分层架构
核心层
:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境应用层
:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)管理层
:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)接口层
:kubectl命令行工具、客户端SDK以及集群联邦生态系统
:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴Kubernetes外部
:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等Kubernetes内部
:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等
图例1:
图例2:
控制器
概述
- Kubernetes 如何能够实现最大单个集群能够达到5000个节点,15 万个 Pod 的完全自动化管理,
更多归功于声明式API编程与控制器模式的协作
。在 Kubernetes 中运行了一系列控制器来确保集群的当前状态与期望状态保持一致,它们就是 Kubernetes 集群内部的管理控制中心或者说是”中心大脑”。例如,ReplicaSet 控制器负责维护集群中运行的 Pod 数量;Node控制器负责监控节点的状态,并在节点出现故障时,执行自动化修复流程,确保集群始终处于预期的工作状态。
控制器类型
Replication Controller和ReplicaSet
Deployment
DaemonSet
StatefulSet
Job
CronJob
HPA,全称Horizontal Pod Autoscaler
详细介绍
Replication Controller和ReplicaSet
- ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet。
- ReplicaSet 和 Replication Controller 的唯一区别是选择器的支持,ReplicaSet 支持新的基于集合的选择器需求。
- ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。
- 虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制。
Deployment
- Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法。
- 典型的应用场景:
- 用来创建Pod和ReplicaSet
- 滚动更新和回滚
- 扩容和缩容
- 暂停与恢复
DaemonSet
- DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
- DaemonSet 的典型用法:
- 在每个节点上运行集群存储 DaemonSet,例如 glusterd、ceph。
- 在每个节点上运行日志收集 DaemonSet,例如 fluentd、logstash。
- 在每个节点上运行监控 DaemonSet,例如 Prometheus Node Exporter、zabbix agent等
- 一个简单的用法是在所有的节点上都启动一个 DaemonSet,将被作为每种类型的 daemon 使用。
- 一个稍微复杂的用法是单独对每种 daemon 类型使用多个 DaemonSet,但具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求。
StatefulSet
- StatefulSet 是用来管理有状态应用的工作负载 API 对象。实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,称为“有状态应用”
- StatefulSet 用来管理 Deployment 和扩展一组 Pod,并且能为这些 Pod 提供序号和唯一性保证。
- StatefulSets 对于需要满足以下一个或多个需求的应用程序很有价值:
- 稳定的、唯一的网络标识符。
- 稳定的、持久的存储。
- 有序的、优雅的部署和缩放。
- 有序的、自动的滚动更新。
Job
- 执行批处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束。
CronJob
- Cron Job 创建基于时间调度的 Jobs。
- 一个 CronJob 对象就像 crontab (cron table) 文件中的一行,它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job。
HPA
- 根据资源利用率自动调整service中Pod数量,实现Pod水平自动缩放。