【k8s应用管理】kubernetes Pod控制器

news/2025/2/13 22:31:46/

文章目录

  • Kubernetes Pod 控制器
    • 概述
    • Deployment
    • StatefulSet
      • StatefulSet 核心特性
      • StatefulSet 组成
      • 创建 StatefulSet 的步骤
        • 配置 NFS 存储(示例)
        • 定义 PV 资源
        • 创建 StatefulSet
        • 应用配置
      • 验证与操作
        • 查看资源状态
        • 测试 DNS 解析
        • 滚动更新
        • 扩展与缩容
      • 与 Deployment 的对比
        • 注意
    • DaemonSet
      • DaemonSet 核心特性
      • DaemonSet 示例
        • 创建 DaemonSet
        • 应用配置
        • 查看 Pod 状态
      • DaemonSet 与 Deployment 的对比
      • 高级配置
        • 节点选择器(nodeSelector)
        • 污点与容忍(Taints and Tolerations)
        • 更新策略(updateStrategy)
      • 常用操作
        • 查看 DaemonSet 状态
        • 删除 DaemonSet
    • Job
    • CronJob
      • 总结
        • 1. Deployment + ReplicaSet
        • 2. StatefulSet(STS)
        • 3. DaemonSet
        • 4. Job
        • 5. CronJob
        • ConfigMap(CM)

Kubernetes Pod 控制器

Pod控制器,又称之为工作负载(workload),是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试进行重启,当根据重启策略无效,则会重新新建pod的资源。
Pod与控制器之间的关系
controllers:在集群上管理和运行容器的 pod 对象, 控制器 通过 label-selector 与 Pod 相关联。
Pod 通过控制器实现应用的运维,如伸缩,升级等。

概述

  • 作用:用于管理 Pod 的中间层,确保 Pod 资源符合预期状态。当 Pod 出现故障时,控制器会尝试重启或重建 Pod。
  • 常见类型
    • ReplicaSet:确保指定数量的 Pod 副本运行。
    • Deployment:管理无状态应用,支持滚动更新和回滚。
    • DaemonSet:确保每个节点运行一个 Pod 副本。
    • StatefulSet:管理有状态应用,支持稳定的网络标识和持久化存储。
    • Job:运行一次性任务。
    • CronJob:运行周期性任务。

Deployment

  • 功能:管理无状态应用,支持滚动更新、回滚和声明式配置。
  • 应用场景:Web 服务等无状态应用。
  • 示例
    apiVersion: apps/v1
    kind: Deployment
    metadata:name: nginx-deploymentlabels:app: nginx
    spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.15.4ports:- containerPort: 80
    
  • 常用命令
    kubectl create -f nginx-deployment.yaml #创建部署
    kubectl get pods,deploy,rs#获取Pods、部署和副本集信息
    kubectl rollout history deployment/nginx-deployment#查看部署的滚动更新历史
    

kubectl edit deployment/nginx-deployment

apiVersion: apps/v1
kind: Deployment
metadata:# 元数据,包括创建时间、标签、名称等annotations:deployment.kubernetes.io/revision: "1"  # 部署的修订版本creationTimestamp: "2021-04-19T08:13:50Z"  # 创建时间labels:app: nginx  # Deployment资源的标签,用于选择器和过滤name: nginx-deployment  # Deployment的名称namespace: default  # 所在的命名空间...
spec:# 规格说明,定义了Deployment的行为和配置replicas: 3  # 期望的Pod副本数量revisionHistoryLimit: 10  # 保留的旧修订版本数量selector:matchLabels:app: nginx  # 用于选择Pod的标签选择器strategy:# 滚动更新策略rollingUpdate:maxSurge: 25%  # 滚动更新时,允许的最大额外Pod数量(相对于期望副本数)maxUnavailable: 25%  # 滚动更新时,允许的最大不可用Pod数量(相对于期望副本数)type: RollingUpdate  # 更新类型,这里是滚动更新template:# Pod模板,定义了Pod的规格metadata:labels:app: nginx  # Pod的标签spec:containers:- image: nginx:1.15.4  # 容器使用的镜像imagePullPolicy: IfNotPresent  # 镜像拉取策略,如果镜像已经存在则不拉取name: nginx  # 容器的名称ports:- containerPort: 80  # 容器暴露的端口protocol: TCP  # 端口协议...restartPolicy: Always  # Pod的重启策略,总是重启

StatefulSet

StatefulSet 核心特性

  • 稳定的持久化存储

    • 通过 volumeClaimTemplates 自动创建 PVC,确保 Pod 重新调度后仍能访问相同数据。
    • 每个 Pod 拥有独立的存储卷,数据与 Pod 生命周期解耦。
  • 稳定的网络标识

    • 基于 Headless Service(无头服务)提供唯一且固定的 DNS 记录。
    • Pod 名称格式:<Pod名称>.<Headless Service名称>.<命名空间>.svc.cluster.local
  • 有序部署与伸缩

    • 部署/扩容时按顺序创建(0 → N-1),缩容时按逆序删除(N-1 → 0)。
    • 确保前一个 Pod 就绪后才操作下一个。

StatefulSet 组成

组件作用
Headless Service提供 Pod 的 DNS 解析,无 ClusterIP,直接暴露 Pod IP。
volumeClaimTemplates为每个 Pod 自动生成 PVC,绑定专用 PV,实现持久化存储。
StatefulSet管理 Pod 副本,确保网络标识和存储的稳定性。

创建 StatefulSet 的步骤

配置 NFS 存储(示例)
# 在 NFS 服务器创建共享目录
mkdir -p /data/volumes/v{1,2,3,4,5}# 配置 NFS 共享
vim /etc/exports
/data/volumes/v1 192.168.80.0/24(rw,no_root_squash)
...
exportfs -arv
systemctl restart nfs
定义 PV 资源
# pv-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: pv001
spec:nfs:path: /data/volumes/v1server: stor01accessModes: ["ReadWriteMany", "ReadWriteOnce"]capacity:storage: 1Gi
---
# 定义其他 PV(pv002-pv005)...
创建 StatefulSet
# stateful-demo.yaml
apiVersion: v1
kind: Service
metadata:name: myapp-svc
spec:clusterIP: None  # Headless Serviceports:- port: 80selector:app: myapp-pod
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: myapp
spec:serviceName: myapp-svcreplicas: 3selector:matchLabels:app: myapp-podtemplate:metadata:labels:app: myapp-podspec:containers:- name: myappimage: ikubernetes/myapp:v1volumeMounts:- name: myappdatamountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: myappdataspec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 2Gi
应用配置
kubectl apply -f pv-demo.yaml
kubectl apply -f stateful-demo.yaml

验证与操作

查看资源状态
kubectl get sts,pvc,pv,pods

输出示例:

NAME      READY   AGE
myapp     3/3     2mNAME                STATUS   VOLUME   CAPACITY
myappdata-myapp-0   Bound    pv002    2Gi
myappdata-myapp-1   Bound    pv003    2Gi
myappdata-myapp-2   Bound    pv004    2GiNAME      STATUS    AGE
pv001     Available 5m
pv002     Bound     5m
...NAME          READY   STATUS    AGE
myapp-0       1/1     Running   2m
myapp-1       1/1     Running   2m
myapp-2       1/1     Running   2m
测试 DNS 解析
kubectl exec -it myapp-0 -- nslookup myapp-1.myapp-svc
# 输出示例:
# Name: myapp-1.myapp-svc.default.svc.cluster.local
# Address: 10.244.1.14
滚动更新
# 修改镜像版本后重新应用
kubectl apply -f stateful-demo.yaml
kubectl get pods -w  # 观察更新顺序(倒序:2 → 1 → 0)
扩展与缩容
# 扩容到4个副本
kubectl scale sts myapp --replicas=4# 缩容到2个副本
kubectl patch sts myapp -p '{"spec":{"replicas":2}}'

与 Deployment 的对比

特性DeploymentStatefulSet
适用场景无状态应用(如 Web 服务)有状态应用(如数据库、中间件)
网络标识随机 Pod 名称,无固定 DNS固定 Pod 名称,稳定的 DNS 记录
存储共享存储卷每个 Pod 独立存储卷
扩缩容顺序无序有序(扩容 0→N-1,缩容 N-1→0)
服务发现通过 Service ClusterIP通过 Headless Service 直接解析 Pod IP
注意
  1. 删除 StatefulSet

    • 需先缩容到 0 副本再删除,否则可能残留 Pod。
    • PVC 默认保留,需手动清理。
  2. 存储回收策略

    • 静态 PV 默认策略为 Retain,动态 PV 默认为 Delete
  3. 滚动更新策略

    • 默认按倒序更新 Pod,可通过 updateStrategy 配置。
  • 功能:管理有状态应用,支持稳定的网络标识和持久化存储。
  • 应用场景数据库等有状态应用。
  • 示例
    apiVersion: v1
    kind: Service
    metadata:name: nginxlabels:app: nginx
    spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:name: web
    spec:serviceName: "nginx"replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: k8s.gcr.io/nginx-slim:0.8ports:- containerPort: 80volumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "my-storage-class"resources:requests:storage: 1Gi
    
  • 常用命令
    kubectl apply -f stateful-demo.yaml
    kubectl get sts,pvc,pv
    kubectl scale sts myapp --replicas=4
    

DaemonSet

DaemonSet 核心特性

  • 功能:确保每个节点(或部分节点)运行一个 Pod 副本。

  • 特点

    • 当新节点加入集群时,自动创建 Pod。
    • 当节点从集群移除时,自动删除 Pod。
    • 删除 DaemonSet 会删除其创建的所有 Pod。
  • 适用场景

    • 集群存储守护进程(如 glusterdceph)。
    • 日志收集守护进程(如 fluentdlogstash)。
    • 监控守护进程(如 Prometheus Node ExporterDatadog 代理)。

DaemonSet 示例

创建 DaemonSet
# ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:name: nginx-daemonSetlabels:app: nginx
spec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.15.4ports:- containerPort: 80
应用配置
kubectl apply -f ds.yaml
查看 Pod 状态
kubectl get pods -o wide

输出示例:

NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE
nginx-daemonSet-4kr6h    1/1     Running   0          35s   10.244.1.2    node01
nginx-daemonSet-8jrg5    1/1     Running   0          35s   10.244.2.3    node02

DaemonSet 与 Deployment 的对比

特性DeploymentDaemonSet
副本分布根据副本数随机分配到节点每个节点运行一个 Pod 副本
适用场景无状态应用(如 Web 服务)守护进程类应用(如日志收集、监控)
扩缩容通过 replicas 控制副本数自动与节点数量同步
节点变化不感知节点变化自动根据节点变化调整 Pod

高级配置

节点选择器(nodeSelector)

通过 nodeSelector 指定 DaemonSet 在特定节点上运行:

spec:template:spec:nodeSelector:disktype: ssd
污点与容忍(Taints and Tolerations)

通过 tolerations 允许 DaemonSet 在带有污点的节点上运行:

spec:template:spec:tolerations:- key: "key"operator: "Equal"value: "value"effect: "NoSchedule"
更新策略(updateStrategy)

通过 updateStrategy 配置 DaemonSet 的更新策略:

spec:updateStrategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1

常用操作

查看 DaemonSet 状态
kubectl get daemonset

输出示例:

NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
nginx-daemonSet   2         2         2       2            2           <none>          5m
删除 DaemonSet
kubectl delete daemonset nginx-daemonSet
  • DaemonSet 是 Kubernetes 中用于管理守护进程类应用的核心控制器。
  • 通过自动与节点同步,确保每个节点运行一个 Pod 副本。
  • 适用于日志收集、监控代理、存储守护进程等场景。
  • 支持节点选择器、污点容忍和滚动更新等高级配置。

Job

  • 功能:运行一次性任务。
  • 应用场景数据库迁移、批处理脚本、kube-bench扫描、离线数据处理,视频解码等业务等。
  • 示例
    apiVersion: batch/v1
    kind: Job
    metadata:name: pi
    spec:template:spec:containers:- name: piimage: perlcommand: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]restartPolicy: NeverbackoffLimit: 4
    

.spec.template.spec.restartPolicy该属性拥有三个候选值:OnFailure,Never和Always。默认值为Always。它主要用于描述Pod内容器的重启策略。在Job中只能将此属性设置为OnFailure或Never,否则Job将不间断运行。

.spec.backoffLimit用于设置job失败后进行重试的次数,默认值为6。默认情况下,除非Pod失败或容器异常退出,Job任务将不间断的重试,此时Job遵循 .spec.backoffLimit上述说明。 一旦.spec.backoffLimit达到,作业将被标记为失败。

  • 常用命令
    kubectl apply -f job.yaml
    kubectl get pods
    kubectl logs pi-bqtf7
    

CronJob

  • 功能:运行周期性任务,像Linux的Crontab一样。
  • 应用场景:定时备份、通知等。
  • 示例
    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:name: hello
    spec:schedule: "*/1 * * * *"jobTemplate:spec:template:spec:containers:- name: helloimage: busyboxargs:- /bin/sh- -c- date; echo Hello from the Kubernetes clusterrestartPolicy: OnFailure
    
cronjob其它可用参数的配置
spec:concurrencyPolicy: Allow			#声明了 CronJob 创建的任务执行时发生重叠如何处理(并发性规则仅适用于相同 CronJob 创建的任务)。spec仅能声明下列规则中的一种:●Allow (默认):CronJob 允许并发任务执行。●Forbid:CronJob 不允许并发任务执行;如果新任务的执行时间到了而老任务没有执行完,CronJob 会忽略新任务的执行。●Replace:如果新任务的执行时间到了而老任务没有执行完,CronJob 会用新任务替换当前正在运行的任务。startingDeadlineSeconds: 15		#它表示任务如果由于某种原因错过了调度时间,开始该任务的截止时间的秒数。过了截止时间,CronJob 就不会开始任务,且标记失败.如果此字段未设置,那任务就没有最后期限。successfulJobsHistoryLimit: 3		#要保留的成功完成的任务数(默认为3)failedJobsHistoryLimit:1         #要保留多少已完成和失败的任务数(默认为1)suspend:true                     #如果设置为 true ,会被挂起后续发生的执行。 这个设置对已经开始的执行不起作用。默认是 false。schedule: '*/1 * * * *'			#必需字段,作业时间表。在此示例中,作业将每分钟运行一次jobTemplate:						#必需字段,作业模板。这类似于工作示例
  • 常用命令
    kubectl create -f cronjob.yaml
    kubectl get cronjob
    kubectl get pods
    kubectl logs hello-1621587180-mffj6
    

如果报错:Error from server (Forbidden): Forbidden (user=system:anonymous, verb=get, resource=nodes, subresource=proxy) ( pods/log hello-1621587780-c7v54)
解决办法:绑定一个cluster-admin的权限
kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous


总结

1. Deployment + ReplicaSet
  • 功能:部署无状态应用(无需本地存储实时数据的应用)。
  • 特点
    • Deployment 负责创建和管理 ReplicaSet(RS)。
    • ReplicaSet 负责维护 Pod 副本数与期望状态一致。
    • 支持滚动更新(默认策略)和回滚操作。
  • 常用命令
    kubectl create deployment <name> --image=<image>  # 创建 Deployment
    kubectl expose deployment <name> --port=<port>    # 暴露 Deployment 为 Service
    kubectl set image deployment <name> <container>=<image>  # 更新镜像
    kubectl rollout undo deployment <name>            # 回滚 Deployment
    kubectl delete deployment <name>                  # 删除 Deployment
    
2. StatefulSet(STS)
  • 功能:部署有状态应用(需要本地存储实时数据且数据有上下文关系的应用)。
  • 特点
    • 需要提前创建 Headless Service(ClusterIP 为 None)。
    • 每个 Pod 名称唯一且固定(标识为 0 到 n-1)。
    • 支持通过 <Pod名称>.<Headless Service名称>.<命名空间> 解析 Pod IP。
    • 每个 Pod 可拥有专属持久化存储(通过 volumeClaimTemplates 配置)。
    • 默认有序部署、扩容、缩容和滚动更新(可通过 podManagementPolicy 修改为并行)。
  • Service 类型
    • 4 种常规类型:ClusterIP、NodePort、LoadBalancer、ExternalName。
    • 1 种特殊类型:Headless Service。
3. DaemonSet
  • 功能:在每个 Node 节点上部署守护进程级别的无状态应用。
  • 特点
    • 每个 Node 节点上运行一个 Pod 副本(受污点和调度策略影响)。
    • 无需设置 replicas 字段。
  • 适用场景:日志收集、监控代理、网络插件等。
4. Job
  • 功能:一次性部署短期任务 Pod,任务完成后容器成功退出且不再重启。
  • 特点
    • 容器重启策略 restartPolicy 不能为 Always,通常为 NeverOnFailure
    • 任务失败时,根据 backoffLimit 字段重试(默认 6 次)。
  • 适用场景:批处理任务、数据处理任务。
5. CronJob
  • 功能:周期性部署短期任务 Pod。
  • 特点
    • 容器重启策略 restartPolicy 不能为 Always,通常为 NeverOnFailure
    • 根据 schedule 字段配置任务周期(格式:分 时 日 月 周)。
  • 适用场景:定时任务、周期性任务。
ConfigMap(CM)
  • 功能:保存配置文件、环境变量等非加密信息,实现配置与应用程序解耦。
  • 创建与查看
    kubectl create cm <name> -n <namespace> --from-file=<file> --from-literal=<key>=<value>  # 创建 CM
    kubectl get cm <name> -n <namespace> -o yaml  # 查看 CM 详情
    kubectl describe cm <name> -n <namespace>     # 查看 CM 描述
    
  • 使用方式
    1.作为存储卷挂载的方式
    • 在Pod资源配置中使用 volumes 字段设置 configMap 类型的卷
    • 容器配置中使用 volumeMounts.mountPath 字段将卷挂载到指定的容器目录,cm资源数据的键名会作为文件名,键值会作为文件内容生成在挂载点目录中,支持cm热更新配置
    • 容器配置中使用 volumeMounts.mountPath 字段指定的容器文件,volumeMounts.subPath 字段指定文件名,实现将卷挂载到容器的文件上,不支持cm热更新配置
  1. 作为容器环境变量的方式(不支持cm热更新配置)
    • 容器配置中使用 env.name 指定自定义的环境变量名,使用 env.valueFrom.configMapKeyRef.name|key 字段指定环境变量的值从哪个cm资源的key获取
    • 容器配置中使用 envFrom.configMapRef.name 字段指定cm资源名称,实现将cm资源数据的键值直接作为容器环境变量名和值

  • Deployment:适合无状态应用,支持滚动更新和回滚。
  • StatefulSet:适合有状态应用,支持有序部署和专属存储。
  • DaemonSet:适合在每个节点上运行的守护进程。
  • Job:适合一次性短期任务。
  • CronJob:适合周期性短期任务。
  • ConfigMap:用于管理配置信息,支持挂载和环境变量注入。

http://www.ppmy.cn/news/1571812.html

相关文章

Conda 包管理:高效安装、更新和删除软件包

Conda 包管理&#xff1a;高效安装、更新和删除软件包 1. 引言 在使用 Anaconda 进行 Python 开发时&#xff0c;包管理是日常操作的核心内容。Conda 提供了一整套高效的工具来管理 Python 环境中的软件包&#xff0c;避免了版本冲突&#xff0c;并确保了环境的一致性。 本篇…

C# 上位机--常量

引言 在 C# 上位机开发过程中&#xff0c;常量是一个基础且重要的概念。合理使用常量可以提高代码的可读性、可维护性和安全性。本文将深入探讨 C# 上位机中常量的定义、使用场景以及相关的示例程序&#xff0c;并通过图文结合的方式让读者更直观地理解常量的作用。 一、什么…

Apache Kafka 中的认证、鉴权原理与应用

编辑导读&#xff1a;本篇内容将进一步介绍 Kafka 中的认证、鉴权等概念。AutoMQ 是与 Apache Kafka 100% 完全兼容的新一代 Kafka&#xff0c;可以帮助用户降低 90%以上的 Kafka 成本并且进行极速地自动弹性。作为 Kafka 生态的忠实拥护者&#xff0c;我们也会持续致力于传播 …

网络安全抑制 缓解 根除 恢复 网络安全如何解决

一、网络安全 网络是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 二、如何防范网络安全问题 1、防范网络病毒。 2、配置防火墙。 3、采…

Unity URP的2D光照简介

官网工程&#xff0c;包括2d光照&#xff0c;动画&#xff0c;动效介绍&#xff1a; https://unity.com/cn/blog/games/happy-harvest-demo-latest-2d-techniques https://docs.unity3d.com/6000.0/Documentation/Manual/urp/Lights-2D-intro.html 人物脸部光照细节和脚上的阴影…

jenkins手动安装插件

现象&#xff1a;有些时候因为网络问题或者因为版本问题下载不了或使用不了&#xff0c;我们可以在插件市场选择合适的版本手动安装。 确认jenkins版本 我们可以在jenkins页面右下角看到具体版本&#xff0c;为了选择相应版本插件 选择插件 我这里想要安装的是ThinBackup插…

UITableView的复用原理

UITableView复用的基本原理是Cell复用机制&#xff0c;它通过重用已经创建的Cell来减少内存开始并提高性能&#xff0c;避免频繁创建和销毁Cell。 复用的流程 1.队列管理 UITableView维护一个可复用队列&#xff08;reuse queue&#xff09;&#xff0c;存储离屏的UITableVi…

第二章:Matlab 编程基础

第二章&#xff1a;Matlab 编程基础 2.1 变量与赋值 2.1.1 变量的命名规则 变量名必须以字母开头&#xff0c;可以包含字母、数字和下划线 (_)。变量名区分大小写&#xff0c;例如 myVar 和 myvar 是不同的变量。变量名不能与 MATLAB 的关键字相同&#xff0c;例如 if, for,…