Kubernetes - [01] 概述
容器编排工具
一、什么是Kubernetes
K8s,即Kubernetes,是一个开源的容器管理和自动化部署平台,设计用于简化容器化应用程序的部署、扩展和管理过程。它是Google在2014年基于其内部使用的Borg系统开发并开源的项目,已经成为云原生计算基金会(CNCF)的旗舰项目。
(1)虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境。
优点:程序环境不会相互产生影响,提供了一定程度的安全性。
缺点:增加了操作系统,浪费了部分资源。
(2)容器化部署:与虚拟化类似,但是共享了操作系统。
优点:
① 可以保证每个容器拥有自己的文件系统、CPU、内存、进程空间等。
② 运行应用程序所需的资源都被容器包装,并和底层基础架构解耦。
③ 容器化的应用程序可以跨云服务商、跨Linux操作系统发行版进行部署。
二、Kubernetes的核心功能和特点
- 容器编排:自动部署、调度和管理容器化应用,确保指定数量的容器实例在任何给定时间运行。
- 服务发现与负载均衡:自动发现应用容器并分配网络访问,同时提供负载均衡以优化资源使用和提高应用可用性。
- 自我修复:当容器失败时,Kubernetes能够自动重启容器、替换容器或杀死不响应的容器,确保应用程序持续运行。
- 可扩展性:无论是无状态还是有状态应用,都能实现横向和纵向的扩展,以应对流量变化。
- 存储卷管理:支持多种存储解决方案,为应用提供持久化存储。
- 自动滚动更新:平滑地更新应用,无需停机,支持金丝雀发布等策略。
- 资源监控与管理:通过资源配额和限制,有效地管理计算资源(CPU、内存)。
- 声明式配置:使用YAML或JSON文件来描述期望的集群状态,Kubernetes确保实际状态与期望状态相匹配。
Kubernetes的架构基于主从(Master-Slave)模型,其中Master节点负责集群的管理决策(如调度),而Worker(或称为Node)节点执行这些决策并运行实际的工作负载(容器)。这一设计使得Kubernetes能够跨机器、跨数据中心乃至跨云提供商进行灵活部署,支持云原生应用的微服务架构和持续集成/持续部署(CI/CD)流程。
三、组件说明
Borg系统架构
Kubernets架构
(1)api server:所有服务访问统一入口
(2)ControllerManager:维持副本期望数目(建议集群副本数 >= 3基数)
(3)Scheduler:负责介绍任务,选择合适的节点进行分配任务
(4)etcd:分布式键值对数据库,存储K8s集群所有重要的信息(持久化)
(5)Kubelet:直接跟容器引擎交互实现容器的生命周期管理
(6)Kube-proxy:负责写入规则至iptables、ipvs实现服务映射访问的
(7)CoreDNS:可以为集群中的svc创建一个域名IP的对应关系解析
(8)Dashboard:给k8s集群提供一个B/S结构的访问体系
(9)Ingress Controller:官方只能实现四层代理,Ingress可以实现七层代理
(10)Federation:提供一个可以跨集群中心多k8s统一管理功能
(11)Prometheus:提供一个k8s集群的监控能力
(12)ELK:提供k8s集群日志统一分析接入平台
四、Pod概念
4.1、自主式Pod
自主式Pod(Ad-Hoc Pod)由用户直接创建,不受到任何控制器的管理。创建方式通常是通过kubectl run
命令或者直接向Kubernetes API Server
提交包含Pod定义的YAML或JSON配置文件。这类Pod一旦被创建,除非手动删除,否则不会自动消失或重建。这意味着,如果Pod因某种原因(如节点故障、容器崩溃等)退出,它不会自动恢复到运行状态。
自主式Pod适用于一次性任务或者测试场景,不适合需要确保服务高可用性的场景。
4.2、控制器管理的Pod
控制器管理的Pod则是通过各种控制器(如ReplicationController
, ReplicaSet
, Deployment
, StatefulSet
, DaemonSet
等)来创建和管理的。控制器的主要职责是确保集群中的Pod数量和状态符合预期的配置,即维持Pod的副本数量,处理Pod的扩展、收缩、更新和故障恢复等。当控制器管理的Pod因故终止时,控制器会自动创建新的Pod来替换它,从而保证应用的高可用性和期望的状态。控制器管理的Pod适合长期运行的服务、需要自动扩缩容的应用或者有特定部署需求(如有序部署、持久化存储绑定)的场景。
自主式Pod vs 控制器管理的Pod ?
管理方式:自主式Pod缺乏自动管理机制,而控制器管理的Pod则具备自动化的生命周期管理。
高可用性:控制器管理的Pod能够自动恢复,提供高可用性,自主式Pod则不具备这一特性。
使用场景:自主式Pod适用于临时任务或测试,控制器管理的Pod适用于生产环境中的稳定服务。
运维复杂度:自主式Pod操作简单,但需人工干预维护,控制器管理的Pod虽然配置相对复杂,但能显著减少日常运维工作。
4.3、ReplicationController
ReplicationController
用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收。在新版本的Kubernetes中建议使用ReplicaSet
来取代ReplicationController
4.4、ReplicaSet
ReplicaSet
跟ReplicationController
没有本质的不同,只是名字不一样,并且ReplicaSet支持集合式的selector。
4.5、Deployment
虽然ReplicaSet可以独立使用,但一般还是建议使用Deployment来自动管理ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet
不支持rolling-update
但Deployment支持)
4.6、HPA
K8s的HPA全称为Horizontal Pod Autoscaler
,即水平Pod自动扩缩放。它是Kubernetes中一个核心功能组件,用于自动调整应用的Pod副本数量,以应对工作负载的变化。HPA通过监控预定义的性能指标(主要是CPU利用率,也可以配置为内存利用率或自定义指标),根据这些指标的实时状况动态地增加或减少Pod的数量,从而保证服务的性能和资源使用的高效性。
Horizontal Pod Autoscaler
仅适用于Deployment
和ReplicaSet
,在V1版本中仅支持根据Pod的CPU利用率扩缩容,在vlalpha版本中,支持根据内存和用户自定义的metric扩缩容。
HPA的工作原理概要如下:
(1)配置指标与阈值:用户通过YAML配置文件或命令行工具(如kubectl)设置HPA策略,包括目标CPU(或内存)利用率、最小与最大Pod副本数等。
(2)监控与评估:HPA控制器周期性地从Metrics API(通常依赖于Metrics Server)收集目标Deployment、StatefulSet、ReplicaSet、ReplicationController中Pod的资源使用情况。
(3)自动调整:当实际指标超过或低于设定的阈值时,HPA将自动调整Pod的副本数量。例如,如果CPU使用率持续高于设定的目标,HPA会增加Pod副本以分担负载;反之,如果CPU使用率低于某个阈值,且存在多余的Pod,则会减少副本数以节省资源。
(4)约束与限制:HPA的操作会在用户定义的最小与最大Pod副本数之间进行,确保扩缩容操作不会超出预设边界。
4.7、StatefulSet
StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括:
- 稳定的持久化存储,即pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现。
- 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现。
- 有序部署,有序扩展,即pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个pod运行之前所有之前的pod必须都是Running和Ready状态),基于init containers来实现。
- 有序收缩,有序删除(即从N-1到0)
OS:感觉星环的TCOS管理Kundb的pod就是用的StatefulSet
4.7、DaemonSet
DaemonSet确保全部(或者一些)Node上运行一个Pod的副本。当有Node加入集群时,也会为他们新增一个Pod。当有Node从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod
使用DaemonSet的一些典型用法:
- 运行集群存储daemon,例如在每个Node上运行glusterd、ceph
- 在每个Node上运行日志手机daemon,例如fluentd、logstash
- 在每个Node上运行监控daemon,例如Prometheus Node Exporter
疑问:给Pod打污点是什么意思?
kubectl taint nodes my-node special=true:NoSchedule
具体操作参考 Kubernetes - [06] k8s的"Sao"操作
五、Job & CronJob
Job负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束
Cron Job管理基于时间的Job,即:
* 在给定时间点只运行一次
* 周期性地在给定时间点运行
六、集群类型
Kubernetes 集群大体上分为两类:一主多从和多主多从
(1)一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境。
(2)多主多从:多台Master节点和多台Node节点,搭建麻烦,安全性高,适合用于生产环境。
— 要养成终生学习的习惯 —
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南