k8s(11) Pod 控制器,服务发现与存储管理

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>
相关推荐
武子康2 小时前
调查研究-167 Docker Compose 详解:从单容器到多服务编排的工程化入口
运维·docker·云原生·容器·kubernetes·k8s·docker-compose
Shacoray5 小时前
K8s 中 Ingress 的 HTTPS 证书 如何生成?
容器·https·kubernetes
开发者联盟league5 小时前
使用Jenkins整合Sonarqube/Gitlab/Harbor/Kubernetes的Demo工程
kubernetes·gitlab·jenkins
Patrick_Wilson5 小时前
Node.js SSR 内存治理:为什么 --max-old-space-size 不等于进程内存
kubernetes·node.js·v8
开发者联盟league5 小时前
使用k8s安装Jenkins
容器·kubernetes·jenkins
成为你的宁宁6 小时前
【基于 Prometheus Operator 实现 K8s 环境下 Redis Cluster 集群监控部署】
redis·kubernetes·prometheus
是一个Bug7 小时前
Docker 与 Kubernetes:从“集装箱”到“远洋舰队”
docker·容器·kubernetes
java_cj7 小时前
阅读 k8s 源码的准备工作
云原生·容器·kubernetes