找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1167

积分

0

好友

167

主题
发表于 3 天前 | 查看: 7| 回复: 0

Pod是Kubernetes集群中最小的可管理单元。根据创建方式,Pod可以分为两类:

  • 自主式Pod:由用户直接创建,删除后不会重建。
  • 控制器创建的Pod:通过Pod控制器创建,此类Pod在删除后能够根据预期状态自动重建。

Pod控制器扮演着Pod资源管理的中间层角色。用户只需向控制器声明期望的Pod数量和状态,控制器便会负责创建并持续维护这些Pod,确保其始终符合预期。当Pod在运行中出现故障时,控制器会根据预定义的策略自动重新调度或重建。Kubernetes提供了多种控制器,以适应不同的应用场景:

  • ReplicationController:早期控制器,已被ReplicaSet取代。
  • ReplicaSet (RS):确保指定数量的Pod副本持续运行,支持扩缩容和镜像升级。
  • Deployment:通过管理ReplicaSet间接管理Pod,支持声明式更新、滚动升级和版本回滚。
  • Horizontal Pod Autoscaler (HPA):根据监控指标自动水平调整Pod副本数,实现集群负载的动态平衡。
  • DaemonSet:确保集群中每个(或指定)节点上都运行一个Pod副本,常用于日志收集、节点监控等守护进程。
  • Job:用于执行一次性任务,任务完成后Pod即退出。
  • CronJob:基于时间调度,用于执行周期性的任务。
  • StatefulSet:用于管理有状态应用。

ReplicaSet (RS)

ReplicaSet的核心职责是确保指定数量的Pod副本持续处于运行状态。它会持续监听所管理Pod的健康状况,一旦发现Pod故障,便自动重启或重建。同时,它也支持Pod数量的手动扩缩容以及容器镜像版本的升级或回退。

ReplicaSet示意图

ReplicaSet的资源清单(YAML)结构如下:

apiVersion: apps/v1 # 版本号
kind: ReplicaSet # 资源类型
metadata: # 元数据
  name: rs-name # RS名称
  namespace: dev # 所属命名空间
  labels: # 标签
    controller: rs
spec: # 规格详情
  replicas: 3 # 期望的Pod副本数量
  selector: # 标签选择器,用于筛选被管理的Pod
    matchLabels: # 标签匹配规则
      app: nginx-pod
    matchExpressions: # 表达式匹配规则
      - {key: app, operator: In, values: [nginx-pod]}
  template: # Pod模板,用于创建新的Pod副本
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80

ReplicaSet组件关系

关键配置项说明:

  • replicas:定义期望的Pod副本数。
  • selector:标签选择器,通过匹配Pod模板中定义的标签(template.metadata.labels),建立起控制器与Pod之间的管理关系。
  • template:Pod模板,定义了当副本数不足时,新Pod的创建规格。

创建与操作ReplicaSet

  1. 创建RS:编写资源文件pc-replicaset.yaml并应用。

    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: pc-replicaset
      namespace: dev
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx-pod
      template:
        metadata:
          labels:
            app: nginx-pod
        spec:
          containers:
          - name: nginx
            image: nginx:1.17.1
    # 创建RS
    kubectl create -f pc-replicaset.yaml
    # 查看RS详情
    kubectl get rs pc-replicaset -n dev -o wide
    # 查看由RS创建的Pod
    kubectl get pod -n dev

    创建RS结果

  2. 扩缩容:可以通过编辑YAML文件或使用kubectl scale命令动态调整副本数。

    # 方法一:编辑YAML,修改 `spec.replicas` 字段
    kubectl edit rs pc-replicaset -n dev
    # 方法二:使用scale命令
    kubectl scale rs pc-replicaset --replicas=2 -n dev
    # 查看Pod变化
    kubectl get pods -n dev
  3. 镜像升级:更新Pod模板中的镜像版本。

    # 方法一:编辑YAML,修改 `spec.template.spec.containers.image` 字段
    kubectl edit rs pc-replicaset -n dev
    # 方法二:使用set image命令
    kubectl set image rs pc-replicaset nginx=nginx:1.17.1 -n dev
    # 查看更新后的RS
    kubectl get rs -n dev -o wide
  4. 删除RS:默认删除操作会同时删除其管理的所有Pod。

    # 删除RS及其Pod(推荐)
    kubectl delete -f pc-replicaset.yaml
    # 或
    kubectl delete rs pc-replicaset -n dev
    # 仅删除RS对象,保留Pod(不推荐,Pod将变为自主式)
    kubectl delete rs pc-replicaset -n dev --cascade=false

Deployment (Deploy)

Deployment是比ReplicaSet更高级的抽象,它通过管理ReplicaSet来间接管理Pod(Deployment -> ReplicaSet -> Pod),提供了更强大的发布和回滚能力,是现代Kubernetes中进行无状态应用部署的首选控制器

Deployment示意图

Deployment在ReplicaSet功能基础上,新增了以下核心能力:

  • 支持发布过程的暂停(pause)与继续(resume)。
  • 支持滚动更新(RollingUpdate)版本回滚(rollback)

Deployment更新流程

Deployment资源清单文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-name
  namespace: dev
  labels:
    controller: deploy
spec:
  replicas: 3
  revisionHistoryLimit: 3 # 保留的历史ReplicaSet版本数量,用于回滚
  paused: false # 是否暂停部署
  progressDeadlineSeconds: 600 # 部署超时时间(秒)
  strategy: # 更新策略
    type: RollingUpdate # 滚动更新
    rollingUpdate:
      maxSurge: 30% # 升级过程中可以额外创建的Pod数量比例(相对于`replicas`)
      maxUnavailable: 30% # 升级过程中最大不可用Pod的比例
  selector:
    matchLabels:
      app: nginx-pod
  template: # Pod模板
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80

创建与基础操作

  1. 创建Deployment

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: pc-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx-pod
      template:
        metadata:
          labels:
            app: nginx-pod
        spec:
          containers:
          - name: nginx
            image: nginx:1.17.1
    # 创建Deployment,--record记录命令以便在历史中查看
    kubectl create -f pc-deployment.yaml --record=true
    # 查看Deployment
    kubectl get deploy pc-deployment -n dev
    # 查看其管理的ReplicaSet
    kubectl get rs -n dev
    # 查看最终创建的Pod
    kubectl get pods -n dev

    Deployment状态
    Deployment-ReplicaSet-Pod关系

  2. 扩缩容:与ReplicaSet操作类似。

    # 使用scale命令
    kubectl scale deploy pc-deployment --replicas=5 -n dev
    # 或编辑YAML文件
    kubectl edit deploy pc-deployment -n dev

更新策略与版本控制

Deployment支持两种更新策略,在spec.strategy.type中定义:

  • Recreate (重建更新):先终止所有旧Pod,再创建新Pod。会导致服务短暂中断。
    strategy:
      type: Recreate
  • RollingUpdate (滚动更新):逐渐用新Pod替换旧Pod,保证服务不中断。这是默认策略,也是云原生应用部署的核心实践。
    strategy:
      type: RollingUpdate
      rollingUpdate:
        maxSurge: 25%
        maxUnavailable: 25%

执行更新与回滚

# 1. 更新镜像(触发滚动更新)
kubectl set image deployment pc-deployment nginx=nginx:1.17.2 -n dev
# 观察更新过程
kubectl get pods -n dev -w

# 2. 查看更新状态和历史
kubectl rollout status deploy pc-deployment -n dev
kubectl rollout history deploy pc-deployment -n dev

# 3. 版本回滚
# 回滚到上一个版本
kubectl rollout undo deployment pc-deployment -n dev
# 回滚到指定历史版本(通过--to-revision指定)
kubectl rollout undo deployment pc-deployment --to-revision=1 -n dev

金丝雀发布 (Canary Release)

利用Deployment的暂停(pause)功能,可以实现金丝雀发布:先让一小部分流量接入新版本,验证通过后再全量更新。

# 1. 更新镜像并立即暂停部署
kubectl set image deploy pc-deployment nginx=nginx:1.17.4 -n dev && \
kubectl rollout pause deployment pc-deployment -n dev

# 2. 观察,此时会创建部分新版本Pod,旧版本Pod仍在运行
kubectl get pods -n dev

# 3. 验证新版本无误后,继续完成更新
kubectl rollout resume deploy pc-deployment -n dev

删除Deployment

kubectl delete -f pc-deployment.yaml

DaemonSet (DS)

DaemonSet确保集群中每个节点(或通过节点选择器指定的节点)上都运行一个Pod副本。它非常适合运行节点级别的守护进程,如日志收集代理(Fluentd)、监控采集器(Node Exporter)或网络插件。

DaemonSet示意图

其特点如下:

  • 向集群添加新节点时,自动在该节点上创建Pod副本。
  • 节点被移除时,其上的Pod会被自动垃圾回收。

资源清单示例:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: pc-daemonset
spec:
  updateStrategy: # 更新策略
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1

创建与查看:

# 创建DaemonSet
kubectl create -f pc-daemonset.yaml
# 查看DaemonSet,会显示在多少个节点上部署了Pod
kubectl get ds -n dev -o wide
# 查看Pod,每个节点一个
kubectl get pods -n dev -o wide

这种在每个节点部署一个实例的模式,是运维监控和日志采集的常见做法。

Job

Job用于执行一次性的批处理任务。它创建的一个或多个Pod会运行至任务成功完成(而非持续运行),完成后Pod状态变为Completed

Job示意图

关键参数:

  • completions:指定Job需要成功运行多少次。例如设为6,则Job会运行Pod直到有6次成功记录。
  • parallelism:指定同时运行的Pod数量。
  • restartPolicy:只能为NeverOnFailure,不能是Always

Job资源清单示例:

apiVersion: batch/v1
kind: Job
metadata:
  name: pc-job
  namespace: dev
spec:
  completions: 6 # 总共需要成功6次
  parallelism: 3 # 同时运行3个Pod
  manualSelector: true
  selector:
    matchLabels:
      app: counter-pod
  template:
    metadata:
      labels:
        app: counter-pod
    spec:
      restartPolicy: Never # 任务失败后创建新Pod,而不是重启容器
      containers:
      - name: counter
        image: busybox:1.30
        command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]

操作命令:

# 创建Job
kubectl create -f pc-job.yaml
# 查看Job执行状态
kubectl get job -n dev -w
# 查看Pod,完成后状态为Completed
kubectl get pods -n dev

CronJob (CJ)

CronJob基于时间调度来周期性地运行Job,类似于Linux系统的Crontab。它用于执行周期性的定时任务。

CronJob示意图

核心字段:

  • schedule:Cron格式的时间调度表达式,例如"*/1 * * * *"表示每分钟执行一次。
  • concurrencyPolicy
    • Allow(默认):允许并发执行。
    • Forbid:禁止并发,如果上次任务未完成则跳过本次。
    • Replace:取消当前正在运行的任务,用新任务替换。

资源清单示例:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: pc-cronjob
  namespace: dev
spec:
  schedule: "*/1 * * * *" # 每分钟执行一次
  jobTemplate: # Job模板
    spec:
      template:
        spec:
          restartPolicy: Never
          containers:
          - name: counter
            image: busybox:1.30
            command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]

操作命令:

# 创建CronJob
kubectl create -f pc-cronjob.yaml
# 查看CronJob
kubectl get cronjobs -n dev
# CronJob会按计划创建Job,再通过Job创建Pod
kubectl get jobs -n dev
kubectl get pods -n dev

CronJob非常适合处理像数据库备份、定期报告生成、数据清理等批量任务处理场景。




上一篇:Superscalar超标量CPU微架构解析:性能优化原理与并发指令设计
下一篇:ARM Cortex-M程序崩溃分析:零依赖捕获调用栈的CmBacktrace实战
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-17 18:48 , Processed in 0.141230 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表