1.Pod Controller控制器介绍

  • 控制器是管理pod的中间层,只需要告诉Pod控制器,想要创建多少个什么样的Pod,它会创建出满足条件的Pod,相当于一个状态机,用来控制Pod的具体状态和行为。controller会自动创建相应的pod资源,并在当pod发生故障的时候按照策略进行重新编排
  • 通过它来实现对pod的管理,比如启动pod、停止pod、扩展pod的数量等等
    通俗来说就是【幕后老板】
  • yaml文件中 kind 填写对应的类型即可

以下是 Kubernetes 中常见的几种 Pod 控制器:

  • ReplicaSet(副本集):ReplicaSet 用于确保指定数量的 Pod 副本正在运行。它通过标签选择器选择要管理的 Pod,并根据定义的副本数进行自动扩展或缩减。当 Pod 发生故障或需要扩展时,ReplicaSet 将自动创建或删除 Pod。

  • Deployment(部署):Deployment 是一个高级控制器,它在 ReplicaSet 的基础上提供了更高级的功能。它允许用户定义滚动升级策略、回滚到先前的版本以及管理应用程序的发布和更新。Deployment 通过创建和管理 ReplicaSet 来确保应用程序的可靠性和可伸缩性。

  • StatefulSet(有状态副本集):StatefulSet 用于管理有状态的应用程序,例如数据库。与 ReplicaSet 不同,StatefulSet 提供了稳定的网络标识和稳定的存储卷,确保每个 Pod 有唯一的标识和持久化存储。它还支持有序部署和伸缩,以确保有状态应用程序的一致性和可靠性。

  • DaemonSet(守护进程集):DaemonSet 用于在集群中的每个节点上运行一个 Pod 副本。它适用于在每个节点上运行一组特定的系统任务或守护进程,例如日志收集、监控代理等。DaemonSet 会自动在新加入集群的节点上创建 Pod,同时在节点离开集群时自动删除 Pod。

  • Job(工作):用于管理一次性任务(One-time task)。它负责确保 Pod 完成任务并维持所需的副本数。

这些 Pod 控制器可以根据不同的需求选择适合的控制器来管理和控制 Pod。它们提供了对 Pod 的生命周期、自动化管理、故障恢复和伸缩等功能的支持,从而简化了应用程序的部署和管理。

2.ReplicaSet控制器

一种副本控制器,简称rs,主要是控制由其管理的pod,使pod副本的数量始终维持在预设的个数,并支持pod数量扩缩容,镜像版本升级,官方建议不要直接使用ReplicaSet,用Deployments更好,并提供很多其它有用的特性。

示例文件 replicaset-nginx.yaml:

apiVersion: apps/v1
kind: ReplicaSet   
metadata:
  name: gq-rs
  namespace: dev
spec:
  replicas: 5
  selector: 
    matchLabels:
      app: gq-nginx-pod
  template:
    metadata:
      labels:
        app: gq-nginx-pod
    spec:
      containers:
      - name: gq-nginx
        image: nginx:1.23.0

执行:

#创建
kubectl apply -f replicaset-nginx.yaml

其他操作:

#查看
kubectl get pods,deploy,replicaset -o wide -n dev

# 命令行缩容
kubectl scale rs xdclass-rs --replicas=2 -n dev

# 删除,可以直接删除rs;也可以通过yaml删除
kubectl delete -f replicaset-nginx.yaml

3.Deployment控制器

  • 通过控制ReplicaSet来控制Pod,并支持滚动升级、回退版本,适合无状态的服务部署
  • 当某个应用有新版本发佈时,Deployment会同时操作两个版本的ReplicaSet
  • 其内置多种滚动升级策略,会按照既定策略降低老版本的Pod数量,同时也创建新版本的Pod
  • Deployment控制器不直接管理Pod对象,而是 Deployment 管理ReplicaSet, 再由ReplicaSet管理Pod对象
  • 总结:Deployment、ReplicaSet、Pod三者之间是一种阶梯控制的关系

示例文件 deploy-nginx-pod.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: gq-deploy
  namespace: dev
spec:
  replicas: 5
  selector: 
    matchLabels:
      app: gq-nginx-pod
  template:
    metadata:
      labels:
        app: gq-nginx-pod
    spec:
      containers:
      - name: gq-nginx
        image: nginx:1.23.0

执行:

#创建
kubectl apply -f deploy-nginx-pod.yaml

# 查看deployment
kubectl get deployment -n dev

#查看
kubectl get pods,deploy,replicaset -o wide -n dev


# 删除,通过yaml删除
kubectl delete -f deploy-nginx-pod.yaml

检查集群中的 Deployment 时,所显示的字段有:

  • NAME 列出了集群中 Deployment 的名称。
  • READY 显示应用程序的可用的“副本”数,格式是“就绪个数/期望个数”。
  • UP-TO-DATE 显示为了达到期望状态已经更新的副本数。
  • AVAILABLE 显示可用的副本数。
  • AGE 应用程序运行的时间。

Deployment 控制器滚动升级(Rolling Update)

K8S的Deployment控制器滚动升级 (金丝雀发布 or 灰度发布)

  • 对各个实例批次进行单独更新,而非同一时刻对所有实例进行全部更新,达到不中断服务的更新升级方式
  • Deployment控制器 给旧版本(old_rs)副本数减少至0、给新版本(new_rs)副本数量增至期望值(replicas)
  • Deployment更新有两种方式
    • Recreate : 删除全部旧的pod,然后创建新的pod
    • RollingUpdate:滚动升级更新,删除部分,更新部分,在整个更新过程中,存在两个版本的pod

yaml示例 deploy-myapp-pod.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3  # 副本数量
  revisionHistoryLimit: 5  # 保存的修订版本历史记录数量
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:latest  # 需要更新的镜像版本
        ports:
        - containerPort: 8080  # 容器的端口
      strategy:
        type: RollingUpdate  # 使用 Rolling Update 策略
        rollingUpdate:
          maxUnavailable: 1  # 在升级过程中最多允许的不可用 Pod 数量
          maxSurge: 1  # 在升级过程中最多允许的额外创建的 Pod 数量

解析:

  • maxUnavailable
升级过程中不可用Pod的最大数量,默认为25%
在滚动更新时,我们可以忍受多少个 Pod 无法提供服务
值越小越能保证服务稳定,更新越平滑
  • maxSurge
升级过程中可以超过期望的Pod的最大数量,默认为25%;
在滚动更新时,可以有多少个额外的 Pod
值调的越大,副本更新速度越快

查看控制器

kubectl describe deploy my-app 

滚动升级

升级 nginx 版本,可以使用以下命令执行滚动升级操作:

#追加 --record 以保存正在更改资源的 kubectl 命令,方便查看history版本列表修改命令
kubectl set image deployment/nginx-deployment nginx=nginx:1.24.0 --record

动态查看升级过程,存在多个不同版本

kubectl get pods -n dev -w

发布回滚

  • kubectl rollout 版本升级相关介绍
    • history 升级历史记录
    • undo 默认回滚上一版本 ,使用–to-revision回滚到指定版本
    • pause 暂停版本升级发布
    • resume 继续恢复刚暂停的版本升级
    • status 升级状态
  • 查看历史版本列表
kubectl rollout history deployment/my-app -n dev
  • 查看具体某一个历史版本信息
kubectl rollout history deployment/my-app -n dev --revision=2
  • 回滚上一版本
kubectl rollout undo deployment/my-app -n dev
  • 查看升级情况
kubectl rollout status deployment/my-app -n dev
  • 回滚指定版本
kubectl rollout undo deployment/my-app -n dev --to-revision=2
  • 删除deployment
kubectl delete -f deploy-myapp-pod.yaml

DaemonSet控制器

DaemonSet是Kubernetes中的一种控制器,用于确保在集群中的每个节点上运行一个Pod的副本。它适用于需要在每个节点上运行后台任务或守护进程的场景。

示例:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: my-daemonset  # DaemonSet的名称
  labels:
    app: my-app  # 标签用于选择DaemonSet控制的Pod
spec:
  selector:
    matchLabels:
      app: my-app  # 选择器标签,用于选择控制的Pod
  template:
    metadata:
      labels:
        app: my-app  # Pod的标签
    spec:
      containers:
      - name: my-container  # 容器的名称
        image: my-image  # 容器的镜像
        # 容器的其他配置...

      # 如果有多个容器,可以继续在这里添加容器的定义
      # - name: another-container
      #   image: another-image
      #   ...

  # 更新策略
  updateStrategy:
    type: RollingUpdate  # 使用滚动更新策略
    rollingUpdate:
      maxUnavailable: 1  # 每次更新不可用的最大Pod数量
      maxSurge: 1  # 允许超出所需Pod数量的最大副本数

执行命令

#创建
kubectl apply -f daemonset-nginx.yaml

#只有一个节点,多个节点的话,每个节点都有一个pod
kubectl get pod,deploy,rs,ds -n dev

DaemonSet的更新策略:

  • 在更新DaemonSet时,可以指定不同的更新策略,例如"RollingUpdate"或"OnDelete"。
  • "RollingUpdate"策略逐步更新每个节点上的Pod,以确保高可用性。
  • "OnDelete"策略只有在旧的DaemonSet被删除后,才会创建新的DaemonSet。

Job控制器

Job控制器是Kubernetes中的一种资源控制器,用于管理一次性任务(One-Time Tasks)。它负责确保Pod中的任务成功完成,并可以按需创建多个Pod来并行或串行地执行任务。

Job控制器的主要特点和用途包括:

  • 一次性任务:Job控制器用于管理一次性的任务,例如批处理作业、定时任务等。每个任务只会执行一次,不会自动重启。

  • 并行执行:Job控制器可以并行创建多个Pod来执行任务。可以通过设置Pod数量来控制并发度。

  • 任务完成检查:Job控制器会监控任务的执行情况,并确保任务成功完成。当一个Pod成功完成任务后,Job控制器会终止该Pod并创建下一个Pod继续执行任务,直到所有任务完成。

  • 任务重试:如果任务失败或超时,Job控制器会根据重试策略重新创建Pod来重新执行任务,直到达到最大重试次数。

  • 完成状态:当所有任务成功完成后,Job控制器会将Job的状态标记为完成。可以根据Job的完成状态进行相应的操作,例如清理资源、发送通知等。

示例:

apiVersion: batch/v1
kind: Job
metadata:
  name: my-app
  namespace: dev
spec:
  parallelism: 3 #job并发运行Pods的数量,默认 1
  completions: 4 #job需要成功运行Pods的次数,默认 1
  backoffLimit: 5 #job失败后进行重试的次数,默认是6
  activeDeadlineSeconds: 100 #job运行超时时间,当job超过timeout时间,则job的状态也会更新为failed
  template:
    spec:
      restartPolicy: Never #job重启策略,OnFailure或Never 
      containers:
      - name: demo
        image: busybox:1.35.0 
        # 容器的启动命令列表,在pod中的容器初始化完毕后运行命令
        command: ["sh", "-c", "echo Performing backup... && sleep 10 && echo Backup completed."]  

在上述示例中,completions字段指定了要完成的Pod数量,这里设置为1,表示只需要一个Pod成功完成任务即可。template字段定义了Pod的模板,包含了容器的配置信息。

通过创建和管理Job资源,可以方便地执行一次性的任务,并确保任务的成功完成。你可以根据实际需求来配置Job控制器的参数,例如设置重试策略、定义任务的并发度等。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐