Kubernetes 核心知识点总结
一、Pod 控制器(Workload)
控制器是管理 Pod 的中间层,通过 Label Selector 关联 Pod,确保 Pod 始终符合预期状态,并支持扩缩容、滚动更新等运维能力。
控制器类型总览
| 控制器 | 核心功能 | 适用场景 | 关键特性 |
|---|---|---|---|
| ReplicaSet | 维持指定数量的 Pod 副本 | 基础副本控制 | Deployment 的底层实现 |
| Deployment | 管理无状态应用 | Web 服务、API 服务 | 滚动更新、回滚、声明式配置 |
| StatefulSet | 管理有状态应用 | MySQL / Redis / ES | 稳定网络标识、独立 PVC、有序扩缩容 |
| DaemonSet | 每个节点运行一个 Pod | 日志采集、监控 Agent、网络插件 | 节点变化时自动调度/清理 |
| Job | 一次性任务 | 数据迁移、批处理 | 任务完成即退出,支持重试 |
| CronJob | 周期性任务 | 定时备份、报表 | 基于 Linux crontab 调度 |
核心控制器对比
| 特性 | Deployment | StatefulSet | DaemonSet | Job / CronJob |
|---|---|---|---|---|
| 应用类型 | 无状态 | 有状态 | 守护进程 | 短期任务 |
| 网络标识 | 随机 Pod 名 | 固定 Pod 名 | 无固定 | 无 |
| 存储 | 共享存储 | 每个 Pod 独立 PVC | 节点本地 / 共享 | 临时 / 共享 |
| 扩缩容 | 无序 | 0→N-1 / N-1→0 | 与节点数同步 | 无副本概念 |
| 典型命令 | kubectl rollout status deploy <name> |
kubectl scale sts <name> --replicas=5 |
kubectl get ds |
kubectl logs <job-pod> |
其他重要资源
| 资源 | 功能 | 使用方式 |
|---|---|---|
| ConfigMap | 存储非加密配置 | 1️⃣ 挂载为 Volume(支持热更新) 2️⃣ 注入为环境变量(不支持热更新) |
| Ingress | L7 负载均衡 | 对外暴露 HTTP / HTTPS 服务 |
二、Service 服务发现(5 种模式)
Service 类型总表
| 类型 | 别名 | 核心特点 | 是否分配 ClusterIP | 典型使用场景 |
|---|---|---|---|---|
| ClusterIP | 集群内部 Service | 仅集群内可访问 | ✅ 是 | 内部微服务 |
| NodePort | 节点端口 | 每个节点开放固定端口 | ✅ 是 | 开发测试、临时访问 |
| LoadBalancer | 云负载均衡 | 对接云厂商 LB | ✅ 是 | 公网服务暴露 |
| ExternalName | 外部服务映射 | DNS CNAME 无代理 | ❌ 否 | 访问集群外服务 |
| Headless Service | 无头 Service | 不分配 ClusterIP | ❌ 否 | 有状态应用、Pod 直连 |
1. ClusterIP(默认)
特点
-
分配 ClusterIP
-
仅集群内部访问
-
kube-proxy 转发流量
适用场景
✅ 微服务内部调用
✅ 前端 → 后端 API
✅ 不对外暴露的服务
yaml
yaml
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
type: ClusterIP
selector:
app: user
ports:
- port: 80
targetPort: 8080
📌 生产环境最常用
2. NodePort
特点
-
每个 Node 开放固定端口(30000--32767)
-
<NodeIP>:<NodePort>访问
适用场景
✅ 开发 / 测试
✅ 无云 LB 的裸机集群
yaml
yaml
apiVersion: v1
kind: Service
metadata:
name: web-nodeport
spec:
type: NodePort
selector:
app: web
ports:
- port: 80
targetPort: 80
nodePort: 30080
⚠️ 不建议生产环境直接暴露
3. LoadBalancer
特点
-
自动对接云厂商 LB
-
提供公网 IP
适用场景
✅ 公有云生产环境
✅ 对外 API / 官网
yaml
yaml
apiVersion: v1
kind: Service
metadata:
name: public-api
spec:
type: LoadBalancer
selector:
app: api
ports:
- port: 80
targetPort: 8080
📌 云环境首选
4. ExternalName
特点
-
不做代理
-
返回 CNAME DNS
适用场景
✅ 访问外部数据库
✅ 第三方 API
✅ 平滑迁移旧系统
yaml
yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-external
spec:
type: ExternalName
externalName: mysql.xxx.com
访问:
bash
bash
mysql.external.default.svc.cluster.local
📌 DNS 层服务发现
5. Headless Service
特点
-
clusterIP: None -
直接返回 Pod IP
适用场景
✅ StatefulSet
✅ 数据库 / 中间件
✅ Pod 直连
yaml
yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-headless
spec:
clusterIP: None
selector:
app: mysql
ports:
- port: 3306
DNS:
text
text
mysql-0.mysql-headless.default.svc.cluster.local
📌 StatefulSet 必备
Service 模式对比总结
| 模式 | 对外访问 | 内部访问 | Pod 直连 | 典型场景 |
|---|---|---|---|---|
| ClusterIP | ❌ | ✅ | ❌ | 内部微服务 |
| NodePort | ✅ | ✅ | ❌ | 测试 / 临时 |
| LoadBalancer | ✅ | ✅ | ❌ | 公网服务 |
| ExternalName | ✅ | ✅ | ❌ | 外部服务 |
| Headless | ❌ | ✅ | ✅ | 有状态应用 |
三、存储管理
基础存储卷类型
| 存储卷 | 持久化能力 | 共享范围 | 适用场景 | 缺点 |
|---|---|---|---|---|
| emptyDir | ❌ Pod 删除即丢失 | Pod 内 | 临时缓存 | 生命周期短 |
| hostPath | ✅ 节点本地 | 单节点 | 节点调试 | 节点故障丢失 |
| NFS | ✅ 服务端存储 | 跨节点 | 生产共享 | 依赖 NFS |
PV / PVC
| 组件 | 说明 |
|---|---|
| PV | 集群级存储资源 |
| PVC | 用户对存储的请求 |
| StorageClass | 动态 PV 模板 |
PV 状态流转
纯文本
纯文本
Available → Bound → Released → Failed
PV 访问模式
| 模式 | 说明 |
|---|---|
| RWO | 单节点读写 |
| ROX | 多节点只读 |
| RWX | 多节点读写 |
| RWOP | 单 Pod 读写 |
静态 PV vs 动态 PV
| 维度 | 静态 PV | 动态 PV |
|---|---|---|
| 创建方式 | 手动 | 自动 |
| 运维复杂度 | 高 | 低 |
| 适用场景 | 固定需求 | 弹性需求 |
四、实战示例速查
1. Deployment
yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
2. StatefulSet(含 Headless Service)
yaml
yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-svc
spec:
clusterIP: None
selector:
app: mysql
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql-svc
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
3. 动态 PV(NFS)
yaml
yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-sc
provisioner: nfs-subdir-external-provisioner
parameters:
archiveOnDelete: "false"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
spec:
accessModes: ["ReadWriteMany"]
storageClassName: nfs-sc
resources:
requests:
storage: 5Gi
五、常用运维命令
| 操作 | 命令 |
|---|---|
| 查看控制器 | kubectl get deploy,sts,ds,job,cronjob |
| 查看存储 | kubectl get pv,pvc,sc |
| Deployment 回滚 | kubectl rollout undo deploy/<name> |
| 更新历史 | kubectl rollout history deploy/<name> |
| 进入 Pod | kubectl exec -it <pod> -- /bin/sh |
| 查看详情 | kubectl describe <resource> <name> |