k8s 控制器管理

一、ReplicaSet 控制器

ReplicaSet 核心职责:保证集群中始终维持指定数量的 Pod 副本在运行。依靠标签选择器匹配 Pod,一旦副本数少于期望值就新建 Pod;多于期望值就删掉多余 Pod。

注意:日常几乎不会直接裸用 ReplicaSet,Deployment 底层就是封装了 ReplicaSet。

编写 ReplicaSet yaml

bash 复制代码
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  labels:
    app: webcluster
  name: webcluster
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webcluster
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: reg.timinglee.org/library/myapp:v1
        name: myapp

执行创建:

bash 复制代码
kubectl apply -f repset.yml

# 持续观察Pod以及标签变化
watch -n 1 kubectl get pods --show-labels

扩缩容操作

bash 复制代码
# 副本扩到4个
kubectl scale replicaset webcluster --replicas 4

# 缩回到2个
kubectl scale replicaset webcluster --replicas 2

# 副本置0,所有Pod全部删除,控制器对象还保留
kubectl scale replicaset webcluster --replicas 0

修改 yaml 里面 replicas 的数值,再执行 kubectl apply -f repset.yml 同样可以完成扩缩容。

提醒:ReplicaSet不支持滚动升级。直接改镜像再 apply,不会触发 Pod 更新,只能手动删除 Pod,才会拉取新镜像重建。这也是生产不用它直接管理业务的主要原因。

二、Deployment 控制器

Deployment 是业务最常用控制器,基于 ReplicaSet 实现,增加滚动更新、版本回退、暂停 / 恢复发布能力。无状态业务优先选 Deployment。

编写 Deployment 配置

bash 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: webcluster
  name: webcluster
spec:
  minReadySeconds: 5
  replicas: 2
  selector:
    matchLabels:
      app: webcluster
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: reg.timinglee.org/library/myapp:v1
        name: myapp
bash 复制代码
# 通过--dry-run导出yaml模板
kubectl create deployment webcluster --image reg.timinglee.org/library/myapp:v1 --dry-run=client -o yaml > dep.yml

kubectl apply -f dep.yml

# 同时监控Pod和底层ReplicaSet
watch -n 1 " kubectl get pods --show-labels;echo ====;kubectl get replicasets.apps"

把 Deployment 暴露成 Service,提供集群访问:

bash 复制代码
kubectl expose deployment webcluster --port 80 --target-port 80

kubectl describe services webcluster

# 使用ClusterIP访问测试
curl 10.107.142.60

版本升级与回滚

修改 yaml 中容器镜像版本,执行 apply,Deployment 会自动创建新 ReplicaSet,逐步销毁旧 Pod、拉起新 Pod。

bash 复制代码
# 修改镜像为 v2
kubectl apply -f dep.yml

# 访问验证新版本
curl 10.107.142.60

如果新版本出问题,两种回退方式:

  1. 修改 yaml 镜像改回 v1,apply 重新发布
  2. 使用 kubectl rollout undo 直接回退历史版本

三、更新策略配置与发布优化

Deployment 默认滚动更新策略:maxSurge:25%、maxUnavailable:25%。

  • maxSurge:升级过程中,允许最多比期望副本数多出多少 Pod
  • maxUnavailable:升级过程中,允许最多多少个 Pod 处于不可用状态

查看当前更新策略:

bash 复制代码
kubectl describe deployments.apps webcluster

自定义更新策略示例,业务零停机升级,不允许任何副本不可用:

bash 复制代码
spec:
  minReadySeconds: 5
  replicas: 6
  selector:
    matchLabels:
      app: webcluster
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: reg.timinglee.org/library/myapp:v1
        name: myapp

maxUnavailable:0:升级时不会先杀掉旧 Pod,先启动新 Pod 就绪之后,再销毁旧 Pod,实现业务不断流。

发布暂停、恢复

有些场景,想批量修改多处配置,不想每改一次就触发一次滚动更新,可以先 pause,全部改完再 resume 一次性发布。

bash 复制代码
# 暂停滚动更新,修改配置不会触发实际发布
kubectl rollout pause deployment webcluster

# 此时修改yaml镜像版本,apply不会执行滚动
kubectl apply -f dep.yml

# 恢复发布,此时才真正执行版本更新
kubectl rollout resume deployment webcluster

# 查看版本变更历史
kubectl rollout history deployment webcluster

四、DaemonSet 控制器

DaemonSet 的特点:集群每一个符合条件的 Node 上,都会运行一个副本 Pod。新增节点加入集群,会自动在新节点拉起 Pod;节点下线,对应 Pod 随之销毁。

典型使用场景:日志采集、监控 agent、网络插件(flannel、calico)这类节点级组件。

基础示例 yaml:

bash 复制代码
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: daemonset
  name: daemonset
spec:
  selector:
    matchLabels:
      app: daemonset
  template:
    metadata:
      labels:
        app: daemonset
    spec:
      containers:
      - image: reg.timinglee.org/library/myapp:v1
        name: myapp
bash 复制代码
kubectl apply -f daemonset.yml

实验现象:当新节点 node3 执行 kubeadm join 加入集群,节点就绪后立刻自动启动这个 DaemonSet 的 Pod,不需要人工干预。
补充:可以通过 nodeSelector /nodeAffinity 限制,只在部分节点部署 DaemonSet,而不是全部节点。

五、Job 控制器

Job 用来运行一次性任务。任务跑完就结束,Pod 状态变成 Completed,保证任务可以成功完成指定次数。

⚠️重要:Job 的重启策略只能是 Never 或者 OnFailure,禁止使用 Always,否则任务完成会无限重启。

字段说明

  • completions:总共需要成功执行完成多少次任务
  • parallelism:最多同时并行运行多少个 Pod
  • backoffLimit:任务失败最大重试次数,超过直接放弃
bash 复制代码
apiVersion: batch/v1
kind: Job
metadata:
  name: pi-job
spec:
  completions: 6
  parallelism: 2
  backoffLimit: 4
  template:
    spec:
      containers:
      - name: busybox
        image: reg.timinglee.org/library/busybox:latest
        command: ["/bin/sh","-c","echo task finish `date` ; head -c 16 /dev/urandom | od -An -t x1"]
      restartPolicy: Never
bash 复制代码
kubectl apply -f job.yml

# 查看job产生的pod
kubectl get pods |grep pi-job

# 查看任务输出日志
kubectl logs pi-job-qzhw9

观察:Pod 执行完业务命令,状态变为 Completed,不会自动删除,需要手动清理 Job 资源。

六、CronJob 定时任务控制器

CronJob 基于 Job,增加 cron 定时调度,相当于 k8s 内部的 crontab。按 cron 表达式周期性创建 Job,由 Job 去执行实际任务。

bash 复制代码
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob
spec:
  schedule: '* * * * *'
  jobTemplate:
    metadata:
      name: cronjob
    spec:
      template:
        spec:
          containers:
          - image: reg.timinglee.org/library/busybox:latest
            name: cronjob
            command:
              - /bin/sh
              - -c
              - echo "hello timinglee"
          restartPolicy: OnFailure
bash 复制代码
kubectl apply -f cronjob.yml

# 查看定时任务状态
kubectl get cronjobs.batch

# 查看定时任务Pod日志
kubectl logs hello-cron-29792316-vsqct
相关推荐
阳光九叶草LXGZXJ12 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
奔跑的大白啊12 小时前
多容器共享目录权限踩坑记
linux·ubuntu·共享目录·linux权限·docker 容器化部署
黄大刀13 小时前
DataPulse一款开箱即用的SCADA(四)-历史记录
运维·scada·动环
归秋14215 小时前
2026 企业 AI 办公工具选型指南:从评估框架到产品适配
大数据·运维·人工智能
Android系统攻城狮15 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
H.莓飛16 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
91刘仁德16 小时前
IP协议详解:从IP协议头到网段划分、路由与NAT
linux·服务器·网络·网络协议·tcp/ip
硅基手札17 小时前
【Linux内核专栏 14】网络协议栈
linux·运维·网络协议
沫璃染墨19 小时前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式
工作10年+,存储芯片行业19 小时前
Linux NVMe 中断排查与性能优化:CPU 亲和性
linux·运维·服务器·windows·性能优化·ssd·pcie