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 调度核心控制器对比特性DeploymentStatefulSetDaemonSetJob / CronJob应用类型无状态有状态守护进程短期任务网络标识随机 Pod 名固定 Pod 名无固定无存储共享存储每个 Pod 独立 PVC节点本地 / 共享临时 / 共享扩缩容无序0→N-1 / N-1→0与节点数同步无副本概念典型命令kubectl rollout status deploy namekubectl scale sts name --replicas5kubectl get dskubectl logs job-pod其他重要资源资源功能使用方式ConfigMap存储非加密配置1️⃣ 挂载为 Volume支持热更新2️⃣ 注入为环境变量不支持热更新IngressL7 负载均衡对外暴露 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✅ 不对外暴露的服务yamlyamlapiVersion: v1 kind: Service metadata: name: user-service spec: type: ClusterIP selector: app: user ports: - port: 80 targetPort: 8080生产环境最常用2. NodePort特点每个 Node 开放固定端口30000–32767NodeIP:NodePort访问适用场景✅ 开发 / 测试✅ 无云 LB 的裸机集群yamlyamlapiVersion: 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 / 官网yamlyamlapiVersion: v1 kind: Service metadata: name: public-api spec: type: LoadBalancer selector: app: api ports: - port: 80 targetPort: 8080云环境首选4. ExternalName特点不做代理返回 CNAME DNS适用场景✅ 访问外部数据库✅ 第三方 API✅ 平滑迁移旧系统yamlyamlapiVersion: v1 kind: Service metadata: name: mysql-external spec: type: ExternalName externalName: mysql.xxx.com访问bashbashmysql.external.default.svc.cluster.localDNS 层服务发现5. Headless Service特点clusterIP: None直接返回 Pod IP适用场景✅ StatefulSet✅ 数据库 / 中间件✅ Pod 直连yamlyamlapiVersion: v1 kind: Service metadata: name: mysql-headless spec: clusterIP: None selector: app: mysql ports: - port: 3306DNStexttextmysql-0.mysql-headless.default.svc.cluster.localStatefulSet 必备Service 模式对比总结模式对外访问内部访问Pod 直连典型场景ClusterIP❌✅❌内部微服务NodePort✅✅❌测试 / 临时LoadBalancer✅✅❌公网服务ExternalName✅✅❌外部服务Headless❌✅✅有状态应用三、存储管理基础存储卷类型存储卷持久化能力共享范围适用场景缺点emptyDir❌ Pod 删除即丢失Pod 内临时缓存生命周期短hostPath✅ 节点本地单节点节点调试节点故障丢失NFS✅ 服务端存储跨节点生产共享依赖 NFSPV / PVC组件说明PV集群级存储资源PVC用户对存储的请求StorageClass动态 PV 模板PV 状态流转纯文本纯文本Available → Bound → Released → FailedPV 访问模式模式说明RWO单节点读写ROX多节点只读RWX多节点读写RWOP单 Pod 读写静态 PV vs 动态 PV维度静态 PV动态 PV创建方式手动自动运维复杂度高低适用场景固定需求弹性需求四、实战示例速查1. DeploymentyamlyamlapiVersion: 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 ServiceyamlyamlapiVersion: 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. 动态 PVNFSyamlyamlapiVersion: 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,scDeployment 回滚kubectl rollout undo deploy/name更新历史kubectl rollout history deploy/name进入 Podkubectl exec -it pod -- /bin/sh查看详情kubectl describe resource name