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
相关推荐
Linux运维技术栈14 分钟前
筑牢业务信息安全防线:雷池WAF+后端日志溯源的全链路防护体系落地实践
linux·安全·雷池
笨笨饿17 分钟前
#121_图传中的H.364编码与MP4的联系
linux·运维·前端·单片机·嵌入式硬件·面试·职场和发展
运维糕手21 分钟前
一次 EVS"disk doesn't exist"报错的完整排查:我差点删掉生产Kafka
运维
优化Henry23 分钟前
5G站点BBU功能模块集成化与偶发案例
运维·网络·学习·5g·tdd
Tanner_SL32 分钟前
Linux笔记之GIT常用命令
linux·git
GeW1 小时前
RHCE通关"捷径":实战经验+应试技巧双管齐下
linux
小HANN1 小时前
高可用架构实战:Keepalived+LVS(DR)+MariaDB主主集群搭建指南
linux·运维·服务器·经验分享
不会就选b1 小时前
Linux之线程池(三)
linux·开发语言
Sylvia-girl2 小时前
【一】:Linux基础指令
linux·运维·服务器