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 | 与节点数同步 | 无副本概念 |
典型命令 |
|
|
|
|
其他重要资源
资源 | 功能 | 使用方式 |
|---|---|---|
ConfigMap | 存储非加密配置 | 1️⃣ 挂载为 Volume(支持热更新) |
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: 3306DNS:
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 → FailedPV 访问模式
模式 | 说明 |
|---|---|
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: 802. 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: 10Gi3. 动态 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五、常用运维命令
操作 | 命令 |
|---|---|
查看控制器 |
|
查看存储 |
|
Deployment 回滚 |
|
更新历史 |
|
进入 Pod |
|
查看详情 |
|