在 Kubernetes 中,YAML 文件是定义和部署资源的核心方式,不同的kind字段代表不同类型的资源。以下是常见的 YAML 类型及其作用
1. 应用部署类
| YAML 类型 | 作用 | 生活类比 |
|---|
| Deployment | 定义应用的多副本部署,自动管理 Pod 生命周期(如扩容、滚动更新)。 | 连锁餐厅:统一管理 10 家分店,保证每家店配置相同,可随时增减分店数量。 |
| StatefulSet | 部署有状态应用(如数据库),保证 Pod 有固定 ID 和持久化存储。 | 银行账户系统:每个账户必须有唯一 ID,数据永久保存,不能随意替换。 |
| DaemonSet | 确保每个节点上运行一个 Pod 副本(如监控 Agent)。 | 小区物业:每个楼必须有一个电梯监控器,实时上报运行状态。 |
| Job/CronJob | 运行一次性或定时任务(如数据备份、定时计算)。 | 快递员:送完今天的包裹就下班(Job),或每天早上 9 点准时送件(CronJob)。 |
2. 服务发现类
| YAML 类型 | 作用 | 生活类比 |
|---|
| Service | 为 Pod 提供固定 IP 和负载均衡,让外部或内部能访问应用。 | 公司总机:客户打 400 电话,自动转接到空闲的客服人员(Pod)。 |
| Ingress | 基于域名 / 路径的流量路由,实现 HTTP 层负载均衡(类似 Nginx 配置)。 | 商场导视牌:根据 “餐饮区”“服装区” 引导顾客到不同店铺(Service)。 |
| EndpointSlice | 记录 Service 对应的 Pod IP 列表,替代旧版 Endpoints,提升大规模集群性能。 | 快递分拨中心:记录每个区域的快递员(Pod)联系方式,方便分配任务。 |
3. 存储类
| YAML 类型 | 作用 | 生活类比 |
|---|
| PersistentVolume (PV) | 集群提供的物理存储资源(如硬盘、云盘)。 | 仓库:商场租用的外部仓库,用于存放商品库存。 |
| PersistentVolumeClaim (PVC) | 应用对存储的请求(类似 “申请仓库空间”)。 | 仓库申请表:店铺向商场申请 100㎡仓库,说明需要存放服装、保质期等要求。 |
| StorageClass | 动态创建 PV 的模板,简化存储管理(如自动分配 SSD 或普通硬盘)。 | 仓库类型选择:商场提供 “普通仓库”“冷藏仓库” 等模板,店铺按需选择。 |
4. 配置与密钥类
| YAML 类型 | 作用 | 生活类比 |
|---|
| ConfigMap | 存储应用配置(如数据库连接地址、配置文件),与容器解耦。 | 餐厅菜单:把菜品价格、配料写在菜单上,服务员(容器)按菜单上菜,菜单可随时换。 |
| Secret | 存储敏感信息(如密码、证书),加密存储,避免硬编码在代码中。 | 保险柜:存放餐厅的营业执照、财务章,只有授权人员(特定容器)能访问。 |
5. 权限与安全类
| YAML 类型 | 作用 | 生活类比 |
|---|
| Namespace | 将集群资源隔离成虚拟 “空间”,避免不同团队 / 项目冲突。 | 办公楼:不同公司租用不同楼层(Namespace),互相隔离,共享整栋楼的基础设施。 |
| Role/Binding | 定义用户或服务账户的权限(如 “只读”“可删除 Pod”)。 | 公司权限系统:给 HR 分配 “查看员工信息” 权限,给 IT 分配 “管理服务器” 权限。 |
| NetworkPolicy | 定义 Pod 间的网络访问规则(如 “只允许 Web 服务器访问数据库”)。 | 小区门禁:规定 “业主可自由出入,访客需登记,外卖只能到门口”。 |
6. 高级资源(了解即可)
| YAML 类型 | 作用 | 生活类比 |
|---|
| HorizontalPodAutoscaler (HPA) | 根据 CPU / 内存或自定义指标自动调整 Pod 数量。 | 餐厅自动排班:根据客流量自动增减服务员数量,高峰时加人,低谷时减人。 |
| CustomResourceDefinition (CRD) | 扩展 K8s API,自定义资源类型(如 “数据库集群”“AI 训练任务”)。 | 自定义表单:公司创建 “报销申请” 表单,扩展原有办公系统功能。 |
二、如何快速区分 YAML 类型?看kind字段!
每个 YAML 文件都有这几个核心字段:
apiVersion: v1 # API版本(不同资源类型版本不同)
kind: Service # 资源类型!关键看这里
metadata:
name: my-service # 资源名称
spec:
# 具体配置...
例如:
kind: Deployment → 部署应用;kind: Service → 暴露应用为服务;kind: PersistentVolumeClaim → 申请存储。
三、实战案例:部署一个带数据库的 Web 应用
1. 部署 Web 应用(Deployment + Service)
# web-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web-container
image: nginx:1.23
ports:
- containerPort: 80
2. 暴露 Web 服务(Service)
# web-service.yaml
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
type: LoadBalancer # 外部可访问
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 80
3. 部署数据库(StatefulSet + PVC)
# db-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "standard"
resources:
requests:
storage: 10Gi
- 部署应用 →
Deployment(无状态)或 StatefulSet(有状态); - 暴露服务 →
Service(内部 / 外部访问)或 Ingress(HTTP 路由); - 存储需求 →
PersistentVolumeClaim + StorageClass; - 配置管理 →
ConfigMap(普通配置)或 Secret(敏感信息); - 权限控制 →
Role + RoleBinding 或 ClusterRole + ClusterRoleBinding。