Kubernetes 教程
欢迎学习 Kubernetes(K8s)!本教程将带你从零基础开始,逐步掌握 Kubernetes 的核心知识和实践技能。
什么是 Kubernetes?
Kubernetes 是希腊语"舵手"或"飞行员"的意思,简称 K8s(因为 K 和 s 之间有 8 个字母)。它是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,它支持声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统,其服务、支持和工具广泛可用。
Kubernetes 的起源与发展
理解 Kubernetes 的起源,有助于我们更好地理解它的设计理念和为什么它会是今天这个样子。
从 Google 内部系统说起
Kubernetes 并非凭空诞生,它继承了 Google 十多年的容器管理经验。
Borg 系统(2003-2004 年):Google 内部最早的大规模集群管理系统,用于管理 Google 的生产工作负载。Borg 可以在数千台机器上运行数万个任务,实现了资源的池化管理和高效利用。Borg 的核心理念是:将整个数据中心看作一台巨大的计算机。
Omega 系统(2013 年左右):Borg 的继任者,采用了更模块化的架构。Omega 引入了多调度器的设计,让不同的工作负载可以使用不同的调度策略,同时共享底层的资源池。
Kubernetes 吸收了 Borg 和 Omega 的精华,同时针对云原生环境进行了重新设计。2014 年,Google 将 Kubernetes 开源,这标志着容器编排技术从 Google 内部走向了整个行业。
Kubernetes 的发展历程
| 时间 | 里程碑 |
|---|---|
| 2014 年 6 月 | Google 在 DockerCon 上首次公开 Kubernetes |
| 2015 年 7 月 | Kubernetes 1.0 发布,捐赠给 CNCF |
| 2016 年 | 成为 CNCF 第一个毕业项目 |
| 2017 年 | 成为容器编排的事实标准 |
| 2018 年 | 被广泛采用,成为企业云原生战略的核心 |
| 至今 | 持续演进,功能不断完善 |
为什么 Google 要开源 Kubernetes?
Google 开源 Kubernetes 有几个重要原因:
- 推动云原生生态:Google 希望通过开源,推动整个行业向云原生架构转型,从而扩大其云服务的市场
- 标准化容器编排:避免碎片化,建立行业标准
- 吸收社区力量:通过开源,让更多开发者参与改进,加速技术演进
部署技术的演进
理解 Kubernetes 的价值,需要了解应用部署技术的演进历程。
传统部署时代
早期,组织在物理服务器上运行应用程序。无法为物理服务器上的应用程序定义资源边界,这导致了资源分配问题。例如,如果在同一台物理服务器上运行多个应用程序,某个应用程序可能会占用大部分资源,导致其他应用程序性能下降。
解决方案是为每个应用程序运行在不同的物理服务器上。但这无法扩展,因为资源利用率低,而且组织维护许多物理服务器的成本很高。
传统部署的特点:
- 应用直接运行在物理机上
- 资源隔离困难,应用相互影响
- 扩展需要购买新硬件,周期长
- 维护成本高
虚拟化部署时代
作为解决方案,虚拟化技术被引入。虚拟化允许在单个物理服务器的 CPU 上运行多个虚拟机(VM)。虚拟化技术实现了应用之间的隔离,提供了安全层面的隔离,因为一个应用的信息不能被另一个应用随意访问。
虚拟化实现了物理资源的更好利用,更好的扩展性,因为可以轻松添加或更新应用程序,降低了硬件成本。
虚拟化部署的特点:
- 每个虚拟机运行完整的操作系统
- 资源隔离良好
- 可以在同一物理机上运行多个应用
- 虚拟机相对重量级,启动慢
容器部署时代
容器类似于虚拟机,但它们共享操作系统的隔离属性更加宽松。因此,容器被认为是轻量级的。与虚拟机类似,容器有自己的文件系统、CPU、内存、进程空间等。由于它们与底层基础设施解耦,因此可以跨云和操作系统发行版移植。
容器带来的优势:
- 敏捷的应用创建和部署:相比虚拟机镜像,容器镜像创建更加便捷高效
- 持续开发、集成和部署:提供可靠且频繁的容器镜像构建和部署,支持快速回滚
- 开发与运维关注点分离:在构建/发布时而非部署时创建应用容器镜像,将应用与基础设施解耦
- 可观测性:不仅显示操作系统级别的信息和指标,还显示应用健康状态和其他信号
- 跨环境一致性:在笔记本电脑上运行与在云中运行相同
- 跨云和操作系统可移植性:可在 Ubuntu、RHEL、本地环境、主要公有云上运行
- 以应用为中心的管理:将抽象层次从虚拟硬件上运行操作系统提升到操作系统上使用逻辑资源运行应用
- 松耦合、分布式、弹性的微服务:应用程序被分解为更小的独立部分,可以动态部署和管理
为什么要用 Kubernetes?
容器是打包和运行应用程序的好方法。但在生产环境中,你需要管理运行应用程序的容器,并确保没有停机。例如,如果一个容器宕机,需要启动另一个容器。如果这种行为能由系统自动处理,岂不是更好?
这就是 Kubernetes 登场的地方。Kubernetes 为你提供了一个运行分布式系统的框架,能够弹性地处理扩展和故障转移,提供部署模式等。例如,Kubernetes 可以轻松地为你的系统管理金丝雀部署。
Kubernetes 的核心功能
服务发现和负载均衡
Kubernetes 可以使用 DNS 名称或自己的 IP 地址暴露容器。如果容器的流量很大,Kubernetes 能够负载均衡并分发网络流量,使部署稳定。
存储编排
Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公有云提供商等。
自动滚动更新和回滚
你可以使用 Kubernetes 描述已部署容器的期望状态,它可以以受控的速率将实际状态更改为期望状态。例如,你可以自动化 Kubernetes 为你的部署创建新容器、删除现有容器并将其所有资源用于新容器。
自动装箱
你提供给 Kubernetes 一个节点集群,它可以用来运行容器化任务。你告诉 Kubernetes 每个容器需要多少 CPU 和内存(RAM)。Kubernetes 可以将容器放置到节点上,以便充分利用你的资源。
自我修复
Kubernetes 会重新启动失败的容器、替换容器、杀死不响应用户定义健康检查的容器,并且在它们准备好服务之前不会向客户端通告它们。
密钥和配置管理
Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。你可以在不重建容器镜像的情况下部署和更新密钥和应用配置,也不会在堆栈配置中暴露密钥。
批处理执行
除了服务,Kubernetes 还可以管理批处理和 CI 工作负载,在需要时替换失败的容器。
水平扩展
你可以通过简单的命令、UI 或基于 CPU 使用率自动扩展应用程序。
IPv4/IPv6 双栈支持
为 Pod 和 Service 分配 IPv4 和 IPv6 地址。
可扩展性设计
在不更改上游源代码的情况下向 Kubernetes 集群添加功能。
Kubernetes 不是什么?
理解 Kubernetes 不是什么同样重要,这有助于你正确地使用它。
Kubernetes 不是传统的一体化 PaaS
Kubernetes 在容器级别而非硬件级别运行,提供了 PaaS 产品常见的一般功能,如部署、扩展、负载均衡,并让用户集成他们的日志、监控和告警解决方案。然而,Kubernetes 不是单体系统,这些默认解决方案是可选且可插拔的。Kubernetes 提供了构建开发者平台的构建块,但在重要的地方保留了用户的选择和灵活性。
Kubernetes 的边界
Kubernetes 不限制支持的应用程序类型。Kubernetes 旨在支持极其多样化的工作负载,包括无状态、有状态和数据处理工作负载。如果应用程序可以在容器中运行,它就应该在 Kubernetes 上运行良好。
Kubernetes 不部署源代码,也不构建你的应用程序。持续集成、交付和部署(CI/CD)工作流程由组织文化和偏好以及技术要求决定。
Kubernetes 不提供应用级服务作为内置服务,如中间件(例如消息总线)、数据处理框架(例如 Spark)、数据库(例如 MySQL)、缓存,也不提供集群存储系统(例如 Ceph)。这些组件可以在 Kubernetes 上运行,或通过可移植机制(如开放服务代理)被运行在 Kubernetes 上的应用程序访问。
Kubernetes 不指定日志、监控或告警解决方案。它提供一些集成作为概念证明,以及收集和导出指标的机制。
Kubernetes 不提供或强制要求配置语言/系统(例如 Jsonnet)。它提供一个声明式 API,可以被任意形式的声明式规范针对。
Kubernetes 不提供或采用任何全面的机器配置、维护、管理或自我修复系统。
Kubernetes 不是传统的编排系统
实际上,Kubernetes 消除了对编排的需求。编排的技术定义是执行定义的工作流程:首先执行 A,然后执行 B,然后执行 C。相比之下,Kubernetes 包含一组独立的、可组合的控制过程,这些过程持续将当前状态驱动向提供的期望状态。从 A 到 C 的过程应该无关紧要。也不需要集中控制。这导致了一个更易于使用、更强大、更健壮、更具弹性和可扩展性的系统。
Kubernetes 的应用场景
| 场景 | 说明 |
|---|---|
| 微服务部署 | 管理和部署大量微服务应用 |
| 云原生迁移 | 将传统应用迁移到容器化架构 |
| 持续集成/持续部署 | 实现自动化部署流水线 |
| 混合云管理 | 统一管理多云和跨区域集群 |
| 大规模容器管理 | 统一管理数千个容器实例 |
| 机器学习平台 | 运行 GPU 工作负载和训练任务 |
| 边缘计算 | 在边缘节点部署轻量级应用 |
Kubernetes 版本演进
Kubernetes 保持每约 4 个月发布一个主要版本的节奏,每个版本都会引入重要的新特性和改进。了解最新版本的变化有助于更好地使用 Kubernetes。
最新版本状态(2025-2026)
当前 Kubernetes 项目维护最近的三个次要版本(1.35、1.34、1.33)。
| 版本 | 发布时间 | 状态 | 主要特性 |
|---|---|---|---|
| 1.35 | 2025-12 | 最新稳定版 (Timbernetes) | 原地更新 Pod 资源 GA、Pod 证书 Beta、节点声明特性 Alpha |
| 1.34 | 2025-08 | 稳定版 (Of Wind & Will) | DRA 核心 GA、Linux Swap 支持 GA、Sleep 钩子 GA |
| 1.33 | 2025-04 | 维护中 (Octarine) | Sidecar 容器稳定版、nftables kube-proxy 稳定版、用户命名空间 Beta |
Kubernetes 1.35 重要特性(Timbernetes - The World Tree Release)
Kubernetes 1.35 代号 "Timbernetes"(世界树),包含 60 项增强功能,其中 17 项升级为稳定版,19 项进入 Beta,22 项为 Alpha。
稳定版特性(GA)
原地更新 Pod 资源:允许在不重启 Pod 的情况下动态调整 CPU 和内存资源,实现无停机的垂直扩缩容。这个特性对于有状态应用和批处理任务特别有价值,避免了因资源调整导致的工作负载中断。
# 原地更新资源配置示例
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: app
image: my-app:v1
resources:
requests:
cpu: "500m" # 可动态调整
memory: "512Mi"
limits:
cpu: "1000m"
memory: "1Gi"
PreferSameNode 流量分布:Service 的 trafficDistribution 字段新增 PreferSameNode 选项,优先将流量路由到同一节点上的 Pod,减少跨节点网络跳转。同时,原有的 PreferClose 选项重命名为 PreferSameZone,使 API 更加自解释。
可靠的 Pod 更新追踪:Pod API 新增 .metadata.generation 和 .status.observedGeneration 字段,让控制器和用户能够可靠地验证 kubelet 是否已处理 Pod 的最新更改。这对于原地垂直扩缩容等特性特别重要。
Job API managed-by 机制:Job API 新增 managedBy 字段,允许外部控制器处理 Job 状态同步,主要用于 MultiKueue 等多集群调度系统。
Beta 特性
Pod 证书(工作负载身份认证):Kubernetes 原生支持 Pod 获取 X.509 证书,kubelet 可以自动管理证书轮换。这大大简化了服务网格和零信任架构的实现,无需依赖外部控制器如 cert-manager。
# Pod 证书卷示例
volumes:
- name: pod-certs
projected:
sources:
- podCertificate:
name: my-service-cert
HPA 可配置容差:Horizontal Pod Autoscaler 支持在每个资源基础上定义自定义容差窗口,让关键工作负载能够快速响应小的指标变化。
behavior:
scaleUp:
policies:
- type: Percent
value: 100
periodSeconds: 15
scaleDown:
tolerance: 0.05 # 自定义容差为 5%
StatefulSet maxUnavailable:StatefulSet 的滚动更新策略支持 maxUnavailable 字段,允许定义更新期间最大不可用 Pod 数量,加快有状态应用的更新速度。
OCI 镜像卷挂载:支持将 OCI 镜像作为卷直接挂载,适合配置包、二进制文件和机器学习模型等数据制品的分发。
volumes:
- name: config-bundle
image:
reference: my-registry/config:v1
用户命名空间支持:Pod 可以使用隔离的用户和组 ID 映射运行,容器内部可以以 root 身份运行,而实际映射到主机上的非特权用户,降低权限提升风险。
Alpha 特性
节点声明特性:节点通过 .status.declaredFeatures 字段声明支持的 Kubernetes 特性,调度器可以据此确保 Pod 只调度到兼容的节点。
Gang 调度支持:原生支持 "all-or-nothing" 调度策略,确保一组 Pod 只有在集群有足够资源容纳整个组时才会调度,避免 AI/ML 训练作业的部分调度死锁。
Kubernetes 1.34 重要特性(Of Wind & Will - O' WaW)
Kubernetes 1.34 代号 "Of Wind & Will",包含 58 项增强功能,其中 23 项升级为稳定版,22 项进入 Beta,13 项为 Alpha。
稳定版特性(GA)
DRA(动态资源分配)核心 GA:DRA 提供了更强大的方式来选择、分配、共享和配置 GPU、TPU、NIC 等设备。resource.k8s.io/v1 API 已稳定,支持结构化参数进行设备声明。
apiVersion: resource.k8s.io/v1
kind: ResourceClaim
metadata:
name: gpu-claim
spec:
devices:
requests:
- name: gpu
deviceClassName: gpu.nvidia.com
Linux 节点 Swap 支持 GA:可配置的节点 Swap 支持正式稳定。默认使用 NoSwap 模式,可通过 LimitedSwap 模式让 Pod 在内存限制内使用 Swap,提高工作负载稳定性。
# kubelet 配置
memorySwap:
swapBehavior: LimitedSwap
Sleep 生命周期钩子 GA:为容器的 PreStop 和 PostStart 钩子提供 Sleep 动作,简化优雅关闭的实现,无需编写复杂的脚本。
lifecycle:
preStop:
sleep:
seconds: 10 # 等待 10 秒后再终止
VolumeAttributesClass GA:允许在线修改卷参数(如 IO 配置),支持工作负载动态调整存储性能,平衡成本和性能。
结构化认证配置 GA:使用配置文件管理 API 服务器客户端认证,支持多个 JWT 认证器、CEL 表达式验证和动态重载。
流式 List 响应 GA:对于 JSON 和 Kubernetes Protobuf 格式,List 请求自动使用流式编码,避免在 API 服务器上分配大内存缓冲区,提高大规模集群的稳定性。
Beta 特性
Pod 级资源请求和限制:支持在 Pod 级别定义资源,由多个容器共享,简化多容器 Pod 的资源配置,HPA 现在也支持 Pod 级资源规格。
spec:
resources:
requests:
memory: "1Gi"
cpu: "500m"
limits:
memory: "2Gi"
cpu: "1000m"
变更准入策略(MutatingAdmissionPolicies):提供声明式的进程内变更准入控制替代方案,使用 CEL 表达式定义变更规则,无需编写 Webhook。
外部 ServiceAccount 令牌签名:支持通过外部密钥管理方案(如 HSM、云 KMS)签署 ServiceAccount 令牌,增强安全性。
原地 Pod 资源调整改进:支持减少内存使用,并与 Pod 级资源集成。
kubelet 凭证提供者的投影 ServiceAccount 令牌:kubelet 可以为镜像拉取请求短期、受众绑定的 ServiceAccount 令牌,提高安全性。
版本选择建议
| 场景 | 推荐版本 | 原因 |
|---|---|---|
| 新项目 | 最新稳定版(1.35+) | 最新特性、最佳性能 |
| 生产环境 | 1.33+ | 稳定特性丰富、长期支持 |
| 企业环境 | 1.31+ | 成熟稳定、广泛验证 |
| 学习测试 | 任意版本 | 功能差异不大 |
每个主要 Kubernetes 版本支持到有两个更新的主要版本发布为止。例如,Kubernetes 1.33 支持到 1.35 发布。
升级注意事项
升级集群前,请务必:
- 阅读官方升级说明
- 检查弃用的 API 和特性
- 在测试环境验证应用兼容性
- 准备回滚方案
# 查看当前集群版本
kubectl version
# 查看可用的升级版本
kubeadm upgrade plan
教程目录
基础入门
- Kubernetes 架构 - 深入理解 Kubernetes 集群架构和核心组件
- 环境配置 - 安装 Kubernetes 集群和配置开发环境
- Pod 详解 - 最小部署单元 Pod 的概念和使用
- Deployment 部署 - 应用部署和管理
工作负载管理
- Job 与 CronJob - 批处理任务和定时任务
- StatefulSet 详解 - 有状态应用的部署管理
- DaemonSet 详解 - 节点守护进程管理
服务与存储
- Service 与网络 - 服务发现、负载均衡和网络策略
- 存储管理 - PersistentVolume、ConfigMap 和 Secret
- 配置管理 - ConfigMap、Secret 和资源配置
高级主题
- 安全策略 - RBAC、NetworkPolicy 和安全最佳实践
参考资料
- 速查表 - Kubernetes 命令和资源速查
学习建议
- 理解概念:先掌握 Kubernetes 的核心概念(Pod、Service、Deployment 等)
- 动手实践:使用 Minikube 或 Kind 在本地搭建集群进行实践
- 循序渐进:按照教程顺序学习,从基础到高级
- 结合文档:遇到问题查阅 Kubernetes 官方文档
- 理解原理:不只是记住命令,要理解底层的工作原理
- 项目练习:将实际项目部署到 Kubernetes 是最好的学习方式
环境准备
在学习 Kubernetes 之前,建议你准备好以下环境:
1. Docker 环境
Kubernetes 使用容器作为应用载体,首先需要安装 Docker。
# 检查 Docker 版本
docker --version
# 启动 Docker 服务
docker ps
2. Kubernetes 集群
可以选择以下方式搭建本地开发环境:
| 工具 | 说明 | 适用场景 |
|---|---|---|
| Minikube | 单节点本地集群 | 学习、开发和测试 |
| Kind | 使用 Docker 构建集群 | 快速测试、CI/CD |
| K3s | 轻量级 Kubernetes | 边缘计算、资源受限环境 |
| kubeadm | 官方集群搭建工具 | 生产环境 |
# 使用 Minikube 启动集群
minikube start
# 使用 Kind 创建集群
kind create cluster
# 检查集群状态
kubectl cluster-info
kubectl get nodes
3. kubectl 命令行工具
kubectl 是与 Kubernetes 集群交互的主要命令行工具。
# 检查 kubectl 版本
kubectl version --client
# 查看集群信息
kubectl cluster-info
# 查看节点
kubectl get nodes
# 查看 Pod
kubectl get pods -A
4. 配置 kubectl 自动补全
# Bash
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
# Zsh
source <(kubectl completion zsh)
echo "if [ $commands[kubectl] ]; then source <(kubectl completion zsh); fi" >> ~/.zshrc
# Windows PowerShell
kubectl completion powershell | Out-String | Invoke-Expression
参考资料
准备好开始学习了吗?点击下一章深入了解 Kubernetes 架构!