1. 概述
在本文中,我们将对 Kubernetes 进行一次简要的理论性介绍。主要内容包括:
- 为何需要容器编排工具
- Kubernetes 的核心特性
- Kubernetes 架构组成
- Kubernetes API 的基本概念
如需深入了解,建议查阅 Kubernetes 官方文档。
2. 容器编排的必要性
在之前的一篇 Docker 教程 中,我们已经了解了 Docker 的基础概念,以及如何打包和部署应用。
一句话总结:Docker 是一个容器运行时工具,它提供了一种标准化的方式,用于打包、传输和运行单个应用实例,也就是我们常说的容器。
但随着系统复杂度的提升,一些新的需求也随之出现:比如自动化部署、容器编排、任务调度、高可用保障、多实例集群管理等。
市场上有不少容器编排工具,但 Kubernetes 正在逐步成为主流,被广泛采用。
3. Kubernetes 的核心特性
Kubernetes 是一个用于在一组节点上编排容器化应用的系统,它同时管理网络和存储基础设施。其主要特性包括:
- ✅ 资源调度:将 Pod 合理分配到各个节点上运行
- ✅ 自动扩缩容:根据负载动态增加节点并部署新 Pod
- ✅ 自愈机制:监控容器状态,按策略重启失败容器
- ✅ 服务发现:通过 DNS 注册并发布 Pod 和 Service
- ✅ 滚动更新与回滚:支持按顺序更新 Pod,失败时可回退
- ✅ 密钥与配置管理:安全地处理密码、API Key 等敏感信息
- ✅ 存储编排:支持多种第三方存储系统,可作为持久化卷使用
4. Kubernetes 架构概览
Kubernetes 架构主要由以下核心组件构成:
- Master(控制平面):维护集群的期望状态。我们通过
kubectl
等工具与 Master 交互。 - Node(节点):运行应用的机器(可以是虚拟机或物理服务器),由 Master 控制。
- Container Runtime(容器运行时):Node 上必须安装的容器运行环境,最常用的是 Docker。
- Minikube:用于本地开发测试的单节点 Kubernetes 集群工具。
- Kubernetes API:提供了对 Kubernetes 各种资源对象的抽象,通过 API 操作集群。
- kubectl:命令行工具,用于创建、更新、删除和查看 Kubernetes 资源对象。
5. Kubernetes API 对象模型
API 对象是 Kubernetes 的“意图记录”,一旦创建对象,Kubernetes 就会持续确保该对象的状态与定义一致。
每个对象都包含两个部分:
- spec:描述期望状态(我们定义的)
- status:描述当前实际状态(由集群维护并更新)
接下来我们介绍几种常见的 Kubernetes 对象。
5.1 基础对象
- Pod:最小调度单元,通常包含一个或多个紧密协作的容器、共享存储和网络。
- Service:逻辑上将一组 Pod 分组,并定义访问方式,对外提供统一入口。
- Volume:为容器提供持久化或共享存储。支持多种类型,例如 hostPath、NFS、云存储等。
- Namespace:实现多租户,允许在同一个物理集群中划分多个虚拟集群。
5.2 控制器对象(Controller)
控制器基于基础对象构建,提供更高级的功能:
- Deployment:用于声明式更新 Pod 和 ReplicaSet。我们定义期望状态,Deployment 控制器负责实现。
- ReplicaSet:确保指定数量的 Pod 副本始终在运行。
- StatefulSet:适用于有状态应用,Pod 有唯一、稳定的网络标识和存储。
- DaemonSet:确保集群中每个节点(或部分节点)上运行一个特定 Pod,常用于日志收集、监控等场景。
- GarbageCollection:清理无主对象,释放资源。
- Job:用于运行一次性任务,确保指定数量的 Pod 成功完成。
5.3 对象元数据(Metadata)
元数据用于描述对象的附加信息,主要包括:
- Namespace:默认为
default
,用于隔离资源。 - Name:在同一 Namespace 中唯一。
- Uid:全局唯一标识符,用于区分不同生命周期的对象。
可选元数据包括:
- Labels:键值对,用于分类资源,支持灵活筛选。
- Label Selector:通过 Label 筛选符合条件的资源。
- Annotations:键值对,用于存储构建、版本等信息,不用于选择资源。
5.4 示例说明
Kubernetes API 对象可以通过 JSON 或 YAML 定义,但推荐使用 YAML 进行手动配置。
下面是一个名为 demo-backend
的 Deployment 的 YAML 示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-backend
spec:
selector:
matchLabels:
app: demo-backend
tier: backend
replicas: 3
template:
metadata:
labels:
app: demo-backend
tier: backend
spec:
containers:
- name: demo-backend
image: demo-backend:latest
ports:
- containerPort: 8080
这个 Deployment 定义了以下内容:
- 使用
Deployment
控制器管理 Pod - 副本数为 3(
replicas: 3
) - 每个 Pod 包含一个容器,镜像为
demo-backend:latest
,监听 8080 端口 - 给 Pod 添加了两个标签:
app=demo-backend
和tier=backend
- 通过
matchLabels
将 Deployment 与对应的 Pod 绑定
当我们通过 kubectl get deployment
查看状态时,返回的内容可能如下:
Name: demo-backend
Namespace: default
CreationTimestamp: Thu, 22 Mar 2018 18:58:32 +0100
Labels: app=demo-backend
Annotations: deployment.kubernetes.io/revision=1
Selector: app=demo-backend
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=demo-backend
Containers:
demo-backend:
Image: demo-backend:latest
Port: 8080/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: demo-backend-54d955ccf (3/3 replicas created)
Events: <none>
可以看到,Deployment 已经成功部署,3 个 Pod 副本都处于可用状态。未在 YAML 中显式定义的字段,通常为默认值。
6. 如何开始使用 Kubernetes
Kubernetes 支持多种部署方式,从本地开发环境到云平台,甚至是裸金属服务器集群。
**推荐初学者使用 Minikube**,它可以在本地快速搭建一个单节点 Kubernetes 集群,非常适合学习和测试。
更多部署方式详见 Kubernetes 官方安装指南。
7. 总结
本文我们简要介绍了 Kubernetes 的基础知识,包括:
- 容器编排工具的必要性
- Kubernetes 的主要功能特性
- 核心组件和架构设计
- API 对象模型与操作方式
如果你计划在生产环境使用 Kubernetes,建议深入学习其调度策略、网络模型、安全机制等内容。后续我们也会陆续推出更深入的实践教程。