Pod控制器与配置资源管理 【K8S (七)】

目录

一、Pod控制器

[1、Pod 控制器概述](#1、Pod 控制器概述)

[2、Pod 控制器的类型](#2、Pod 控制器的类型)

[3、Deployment 控制器](#3、Deployment 控制器)

[3.1 特点](#3.1 特点)

[3.2 案列](#3.2 案列)

[3.3 查看控制器配置](#3.3 查看控制器配置)

[4、StatefulSet 控制器(有状态)](#4、StatefulSet 控制器(有状态))

[4.1 特点](#4.1 特点)

[4.2 三个核心组件](#4.2 三个核心组件)

[4.3 StatefulSet + NFS 持久卷(案列)](#4.3 StatefulSet + NFS 持久卷(案列))

[4.3.1 定义 Headless Service](#4.3.1 定义 Headless Service)

[4.3.2 定义 StatefulSet 动态](#4.3.2 定义 StatefulSet 动态)

[4.3.3 创建与验证](#4.3.3 创建与验证)

[4.3.4 滚动更新](#4.3.4 滚动更新)

[4.3.5 总结](#4.3.5 总结)

[5、DaemonSet 控制器](#5、DaemonSet 控制器)

[5.1 功能](#5.1 功能)

[5.2 案列](#5.2 案列)

[6、Job 控制器](#6、Job 控制器)

[6.1 功能](#6.1 功能)

[7、CronJob 控制器](#7、CronJob 控制器)

[7.1 功能](#7.1 功能)

[8、无状态 vs 有状态 应用对比](#8、无状态 vs 有状态 应用对比)

[9、常规 Service 与 Headless Service 对比](#9、常规 Service 与 Headless Service 对比)

10、总结


一、Pod控制器

1、Pod 控制器概述

Pod 控制器(Controller) 又称为 工作负载(Workload),是 Kubernetes 中用于 管理 Pod 的中间层。

它的职责是确保集群中的 Pod 资源始终符合用户定义的"期望状态"。

功能

  • 保证 Pod 副本数量与期望一致
  • Pod 异常退出时,自动根据重启策略重建
  • 支持伸缩(扩容/缩容)、滚动更新、回滚

2、Pod 控制器的类型

|-------------|---------------------------------------------------|----------------|
| 控制器 | 功能 | 应用场景 |
| ReplicaSet | 保证指定数量的 Pod 副本存在,支持滚动扩缩容。通常不直接使用,由 Deployment 管理。 | 无状态应用 |
| Deployment | 管理 ReplicaSet,实现声明式部署、滚动升级、回滚等。 | Web 服务 |
| StatefulSet | 管理有状态应用,提供稳定的网络标识与存储。 | 数据库、 Zookeeper |
| DaemonSet | 每个 Node 上运行一个 Pod。 | 日志、监 控、Agent |
| Job | 执行一次性任务。 | 定期备份、 通知 |
| CronJob | 周期性任务(类似 Crontab)。 | 定期备份、通知 |

3、Deployment 控制器

3.1 特点
  • 管理无状态应用
  • 支持滚动更新与回滚
  • 声明式配置更新
  • 与 ReplicaSet 协作使用
3.2 案列
bash 复制代码
vim nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx  
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80
        
kubectl create -f nginx-deployment.yaml

kubectl get pods,deploy,rs
3.3 查看控制器配置
bash 复制代码
kubectl edit deployment/nginx-deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2021-04-19T08:13:50Z"
  generation: 1
  labels:
    app: nginx                  #Deployment资源的标签
  name: nginx-deployment
  namespace: default
  resourceVersion: "167208"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/nginx-
deployment
  uid: d9d3fef9-20d2-4196-95fb-0e21e65af24a
spec:
  progressDeadlineSeconds: 600
  replicas: 3                   #期望的pod数量,默认是1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
    maxSurge: 25%             #升级过程中会先启动的新Pod的数量不超过期望的Pod数量的25%,也可以是一个绝对值
    maxUnavailable: 25%       #升级过程中在新的Pod启动好后销毁的旧Pod的数量不超过期望的Pod数量的25%,也可以是一个绝对值
    type: RollingUpdate         #滚动升级
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx              #Pod副本关联的标签
    spec:
      containers:
      - image: nginx:1.15.4             #镜像名称
        imagePullPolicy: IfNotPresent   #镜像拉取策略
        name: nginx
        ports:
        - containerPort: 80             #容器暴露的监听端口
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always             #容器重启策略
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
......
##查看历史版本
[root@master01 ~]# kubectl rollout history deployment nginx-deployment 
deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>

4、StatefulSet 控制器(有状态)

4.1 特点
  1. 稳定存储:基于 PVC 实现,每个 Pod 独立存储

  2. 稳定网络标识:Pod 名称和 DNS 名称固定

  3. 有序部署/删除:从 0 → N-1 创建,从 N-1 → 0 删除

  4. 依赖 Headless Service

4.2 三个核心组件
  1. Headless Service(无头服务):用于为Pod资源标识符生成可解析的DNS记录。

  2. volumeClaimTemplates(存储卷申请模板):基于静态或动态PV供给方式为Pod资源提供专有的固定存储。

  3. StatefulSet:用于管控Pod资源。

4.3 StatefulSet + NFS 持久卷(案列)
4.3.1 定义 Headless Service
bash 复制代码
vim  stateful-headless.yaml

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: myapp-pod
    
kubectl apply -f stateful-headless.yaml
4.3.2 定义 StatefulSet 动态
bash 复制代码
vim stateful-demo.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: myapp
spec:
  serviceName: myapp-svc
  replicas: 3
  selector:
    matchLabels:
      app: myapp-pod
  template:
    metadata:
      labels:
        app: myapp-pod
    spec:
        containers:
        - name: myapp
          image: ikubernetes/myapp:v1
          ports:
          - containerPort: 80
            name: web
          volumeMounts:
          - name: myappdata
            mountPath: /usr/share/nginx/html
    volumeClaimTemplates:
    - metadata:
        name: myappdata
        annotations:          #动态PV创建时,使用annotations在PVC里声明一个StorageClass对象的标识进行关联
          volume.beta.kubernetes.io/storage-class: nfs-client-storageclass
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 2Gi

解析上例:由于 StatefulSet 资源依赖于一个实现存在的 Headless 类型的 Service 资源,所以需要先定义一个名为 myapp-svc 的 Headless Service 资源,用于为关联到每个 Pod 资源创建 DNS 资源记录。接着定义了一个名为 myapp 的 StatefulSet 资源,它通过 Pod 模板创建了 3 个 Pod 资源副本,并基于 volumeClaimTemplates 向前面创建的PV进行了请求大小为 2Gi 的专用存储卷。

4.3.3 创建与验证

kubectl apply -f stateful-demo.yaml

kubectl get sts,pvc,pv,pods

4.3.4 滚动更新

#StatefulSet 控制器将在 StatefulSet 中删除并重新创建每个 Pod。它将以与 Pod 终止相同的顺序进行(从最大的序数到最小的序数),每次更新一个 Pod。在更新其前身之前,它将等待正在更新的 Pod 状态变成正在运行并就绪。如下操作的滚动更新是按照2-0的顺序更新。

修改镜像版本

kubectl edit sts myapp

kubectl get pods -w # 观察按序更新 2→1→0

4.3.5 总结

无状态:

1)deployment 认为所有的pod都是一样的

2)不用考虑顺序的要求

3)不用考虑在哪个node节点上运行

4)可以随意扩容和缩容

有状态:

1)实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper

2)实例之间不对等的关系,以及依靠外部存储的应用。

常规service和无头服务区别:

service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。

Headless service:无头服务,不需要cluster-IP,而是直接以DNS记录的方式解析出被代理Pod的IP地址。

5、DaemonSet 控制器

5.1 功能

确保每个 Node 上都运行一个 Pod 副本。

常用于运行系统级后台任务(守护进程)。

典型场景:

  • Fluentd / Logstash 日志收集
  • Prometheus Node Exporter、collectd、Datadog 代理、New Relic 代理,或 Ganglia gmond 监控代理
  • 存储服务如 Ceph、GlusterFS
5.2 案列
bash 复制代码
vim ds.yaml 

apiVersion: apps/v1
kind: DaemonSet 
metadata:
  name: nginx-daemonSet
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
      spec:
        containers:
        - name: nginx
          image: nginx:1.15.4
          ports:
          - containerPort: 80

DaemonSet会在每个node节点都创建一个Pod
kubectl get pods
nginx-deployment-4kr6h   1/1     Running     0          35s
nginx-deployment-8jrg5   1/1     Running     0          35s

6、Job 控制器

6.1 功能

用于执行一次性任务,任务完成后即退出。

应用场景:

  • 数据迁移
  • 批处理
  • 安全扫描
  • 离线数据处理

7、CronJob 控制器

7.1 功能

周期性任务(类似 Linux Crontab)。

应用场景:

  • 定期备份
  • 定时通知
  • 日志清理

8、无状态 vs 有状态 应用对比

|---------|---------------------|----------------------|
| 对比项 | 无状态(Deployment) | 有状态(StatefulSet) |
| Pod 名称 | 随机生成 | 固定、有序(0→N-1) |
| 存储 | 共享存储或无持久卷 | 每个 Pod 独立 PVC |
| 网络标识 | 不固定 | 稳定 DNS 名称 |
| 扩缩容顺序 | 无序 | 有序(依次创建/删除) |
| 应用示例 | Web、API | MySQL、ZooKeeper |

9、常规 Service 与 Headless Service 对比

|------------------|------------------|--------------|----------------------|
| 类型 | 是否有ClusterIP | 访问方式 | 作用 |
| Service | 有 | 负载均衡 + 服务发现 | 集群统一访问入口 |
| Headless Service | 无 | 直接解析到 Pod IP | StatefulSet 中 DNS 定位 |

10、总结

相关推荐
小趴菜吖2 小时前
Ralph部署文档
容器
乐之者v2 小时前
如何访问k8s集群部署的微服务内部服务接口
微服务·容器·kubernetes
mr_orange_klj2 小时前
关于K8s身份权限的AI问答(豆包)
java·容器·kubernetes
Leo July2 小时前
Kubernetes全解析:从容器编排到云原生实战
云原生·容器·kubernetes
岁岁种桃花儿2 小时前
K8s Nginx Pod 出现 CrashLoopBackOff?从配置排查到彻底解决
运维·nginx·kubernetes
峰顶听歌的鲸鱼11 小时前
Kubernetes介绍和部署
运维·笔记·云原生·容器·kubernetes·学习方法
Ka1Yan12 小时前
Docker:基本概念与快速入门
运维·docker·容器
文静小土豆14 小时前
Rocky Linux 二进制 安装K8S-1.35.0高可用集群
linux·运维·kubernetes
汪碧康17 小时前
一文掌握k8s的升级更新策略
云原生·容器·kubernetes·k8s·亲和性·xkube