Kubernetes的Pod控制器深度解析

1.1 Pod控制器介绍

在Kubernetes中,Pod是最小的管理单元,用于运行容器。根据Pod的创建方式,可以将其分为两类:

  • 自主式Pod(Stateless Pods):这些Pod是直接由用户或管理员创建的,通常是通过直接使用kubectl run命令或通过YAML文件定义来创建的。这些Pod在创建后由Kubernetes直接管理,但它们的生命周期是独立的。这意味着如果这些Pod被删除,Kubernetes不会自动重建它们。自主式Pod通常用于运行短生命周期的任务或服务,例如批处理作业、数据迁移等。

  • 控制器创建的Pod(Managed Pods):这些Pod是由Kubernetes控制器创建和管理的。控制器是Kubernetes中的高级对象,它们负责根据定义的规则创建、更新和删除Pod。控制器创建的Pod通常是为了实现更复杂的应用部署和管理需求,例如部署、复制集(ReplicaSet)、状态集(StatefulSet)、DaemonSet等。这些Pod的生命周期是由控制器管理的,如果Pod被删除,控制器会根据其配置自动重建Pod,以确保集群中始终有足够数量的Pod在运行。

Pod控制器(Pod Controller)是Kubernetes中的一种对象,用于管理一组具有相同配置的Pod。Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod。

1.1.1 常见使用场景

Pod控制器用于管理一组Pod,确保它们按照预定的规则运行和扩展。以下是Kubernetes中常见的几种Pod控制器及其适用场景的整理:

  • ReplicationController:这是早期用于确保指定数量的Pod副本始终运行的控制器,但现在已经不推荐使用,其功能被ReplicaSet所替代。

  • ReplicaSet:用于保证Pod的副本数量维持在用户指定的数量。它支持Pod数量的扩缩容,以及Pod模板的更新,但不涉及应用状态的管理。

  • Deployment:是ReplicaSet的扩展,提供了应用的声明式更新能力。它允许用户定义应用的期望状态,自动处理Pod的创建、更新和删除,支持滚动更新和版本回退。

  • Horizontal Pod Autoscaler (HPA):根据CPU使用率或其他选择的度量指标自动扩展Pod的数量,适用于需要根据负载动态调整Pod数量的场景。

  • DaemonSet:确保在集群中的每个Node上都运行一个Pod的副本,通常用于运行集群存储、日志收集等守护进程类任务。

  • Job:用于运行批处理任务,即执行一次性任务。当Pod完成其工作后,Job控制器会负责清理这些Pod。

  • CronJob:用于周期性地创建Job对象,执行定时任务,类似于Unix中的crontab。

  • StatefulSet:用于管理有状态的服务,它为Pod提供了稳定的网络标识、顺序部署、缩放以及扩展和滚动更新的能力。

1.1.2 Pod控制器分类

Kubernetes的控制器分为以下几类:

  • 无状态应用:由Deployment和ReplicaSet管理,适用于不需要持久化存储的应用。

  • 有状态应用:由StatefulSet管理,适用于需要持久化存储和有序部署的应用。

  • 守护型应用:由DaemonSet管理,适用于需要在所有或特定Node上运行的服务。

  • 批处理应用:由Job和CronJob管理,适用于执行一次性或周期性任务。

1.2 Pod与控制器之间的关系

  • Pod与控制器之间的关系是,控制器是Kubernetes中用于管理一组Pod的高级对象,而Pod是Kubernetes中运行容器的最小单元。

  • 控制器通过定义一组标签选择器来跟踪和控制具有这些标签的Pod。

  • 当Pod因故障而终止时,控制器会根据定义的规则自动创建新的Pod来替换它,从而确保应用的持续运行和所需的副本数量

  • 此外,控制器还负责处理Pod的水平扩展、版本更新和滚动升级等运维任务,而Pod本身只负责运行容器化的应用。

  • 控制器为Pod提供了生命周期管理和运维自动化的框架。

image-20240511105927782

1.3 ReplicaSet(RS)控制器

  • ReplicaSet(RS)是一种Kubernetes控制器,用于确保指定数量的Pod副本始终运行,从而提供高可用性和负载均衡。副本集通过监控和管理Pod的副本数量,自动进行Pod的创建、更新和删除,以维护用户定义的副本数量。

image-20240511110654582

1.3.1 清单文件写法

---
apiVersion: apps/v1  # 版本号
kind: ReplicaSet  # 类型
metadata:    # 元数据
  name: rs-nginx  # rs名称
  namespace: default  # 所属命名空间
  labels:   # 标签
    controller: rs
spec:   # 详情描述
  replicas: 3  # 副本数量
  selector:    # 选择器,通过它指定该控制器管理哪些pod
    matchLabels:
      app: nginx-pod  # Labels匹配规则
    matchExpressions: # Expressions匹配规则
      - {key: app, operator: In, values: [nginx-pod]}  # Expressions匹配规则
  template:        # 模板,当副本数量不足时,会根据下面的模板创建pod副本
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: nginx:1.11.1
          ports:
            - containerPort: 80

ReplicaSet配置中spec字段下的三个关键选项:

  • replicas:这个字段指定了ReplicaSet应该维护的Pod副本的数量。默认情况下,如果未指定,它会设置为1。通过增加副本数量,可以提高应用的可用性和容错性。

  • selector:选择器用于确定ReplicaSet管理的Pod集合。它通过标签选择器(Label Selector)机制工作。ReplicaSet的选择器必须与Pod的标签匹配,这样ReplicaSet才能跟踪和控制这些Pod。选择器由两部分组成:

    • matchLabels:这是一个匹配所有标签的字典,只有当Pod的所有这些标签都与选择器中的标签完全匹配时,ReplicaSet才会管理该Pod。

    • matchExpressions:这是一个更复杂的匹配,允许使用特定的操作符(如In, NotIn, Exists, DoesNotExist等)来匹配标签。

  • template:这是一个Pod模板,ReplicaSet使用它来创建新的Pod。当Pod数量少于replicas指定的数量时,或者当现有的Pod失败需要替换时,ReplicaSet会根据这个模板创建新的Pod。模板中定义了Pod的详细规格,包括容器的镜像、名称、端口、环境变量、存储卷等。

1.3.2 创建ReplicaSet

[root@K8s-master ~]# vim pc-replicaset.yaml
---
apiVersion: apps/v1   # 指定了API版本,这是ReplicaSet所使用的API版本
kind: ReplicaSet
metadata:
  name: pc-rs
  namespace: test
spec:
  replicas: 3   # 指定了ReplicaSet应该确保在运行的Pod的数量。
  selector:     # 定义了哪些Pod应该被ReplicaSet管理
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.11.1

[root@K8s-master ~]# kubectl apply -f pc-replicaset.yaml 
replicaset.apps/pc-rs created
[root@K8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS    RESTARTS   AGE     IP            NODE          NOMINATED NODE   READINESS GATES
pc-rs-75hwq   1/1     Running   0          2m46s   10.244.2.30   k8s-node-02   <none>           <none>
pc-rs-jgrc9   1/1     Running   0          2m46s   10.244.2.32   k8s-node-02   <none>           <none>
pc-rs-zwllg   1/1     Running   0          2m46s   10.244.2.31   k8s-node-02   <none>           <none>

# 建出来的pod的名称是在控制器名称后面拼接了-xxxxx随机码

[root@K8s-master ~]# kubectl get rs pc-rs -n test -o wide  #查看rs
NAME    DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES         SELECTOR
pc-rs   3         3         3       170m   nginx        nginx:1.11.1   app=nginx-pod

# DESIRED:期望副本数量
# CURRENT:当前副本数量
# READY:已经准备好提供服务的副本数量

1.3.3 ReplicaSet扩缩容

  • 方法一编辑ReplicaSet pc-rs

# 将rs的副本数改成6
[root@K8s-master ~]# kubectl edit rs pc-rs -n test  
...
spec:
  replicas: 6
...
[root@K8s-master ~]# kubectl get rs pc-rs -n test -o wide
NAME    DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES         SELECTOR
pc-rs   6         6         6       175m   nginx        nginx:1.11.1   app=nginx-pod
[root@K8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS    RESTARTS   AGE    IP            NODE          NOMINATED NODE   READINESS GATES
pc-rs-75hwq   1/1     Running   0          176m   10.244.2.30   k8s-node-02   <none>           <none>
pc-rs-84qbg   1/1     Running   0          62s    10.244.2.35   k8s-node-02   <none>           <none>
pc-rs-8d8l8   1/1     Running   0          62s    10.244.2.33   k8s-node-02   <none>           <none>
pc-rs-g4792   1/1     Running   0          62s    10.244.2.34   k8s-node-02   <none>           <none>
pc-rs-jgrc9   1/1     Running   0          176m   10.244.2.32   k8s-node-02   <none>           <none>
pc-rs-zwllg   1/1     Running   0          176m   10.244.2.31   k8s-node-02   <none>           <none>
  • 方法二使用命令修改

# 使用scale命令实现扩缩容, 后面--replicas=n直接指定目标数量即可
[root@K8s-master ~]# kubectl scale rs pc-rs --replicas 2 -n test
replicaset.apps/pc-rs scaled
[root@K8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS    RESTARTS   AGE    IP            NODE          NOMINATED NODE   READINESS GATES
pc-rs-jgrc9   1/1     Running   0          3h1m   10.244.2.32   k8s-node-02   <none>           <none>
pc-rs-zwllg   1/1     Running   0          3h1m   10.244.2.31   k8s-node-02   <none>           <none>

1.3.4 ReplicaSet镜像更新

  • 方法一编辑ReplicaSet pc-rs

[root@K8s-master ~]# kubectl edit rs pc-rs -n test
...
spec:
      containers:
      - image: nginx:1.11.2
...
[root@K8s-master ~]# kubectl get rs pc-rs -n test -o wide   #从nginx:1.11.1更新到了nginx:1.11.2
NAME    DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES         SELECTOR
pc-rs   2         2         2       3h9m   nginx        nginx:1.11.2   app=nginx-pod
  • 方法二使用命令修改

# kubectl set image rs rs名称 容器=镜像版本 -n namespace
[root@K8s-master ~]# kubectl set image rs pc-rs nginx=nginx:1.11.3 -n test
replicaset.apps/pc-rs image updated
[root@K8s-master ~]# kubectl get rs pc-rs -n test -o wide
NAME    DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES         SELECTOR
pc-rs   2         2         2       3h12m   nginx        nginx:1.11.3   app=nginx-pod

1.3.5 ReplicaSet删除

[root@K8s-master ~]# kubectl delete rs pc-rs -n test
replicaset.apps "pc-rs" deleted
[root@K8s-master ~]# kubectl get rs pc-rs -n test -o wide
Error from server (NotFound): replicasets.apps "pc-rs" not found
[root@K8s-master ~]# kubectl get pod -n test -o wide
No resources found in test namespace.
​
# 如果希望仅仅删除RS对象(保留Pod),可以使用kubectl delete命令时添加--cascade=false选项(不推荐)
[root@K8s-master ~]# kubectl delete rs pc-rs -n test --cascade=orphan
replicaset.apps "pc-rs" deleted
[root@K8s-master ~]# kubectl get rs pc-rs -n test -o wide
Error from server (NotFound): replicasets.apps "pc-rs" not found
[root@K8s-master ~]# kubectl get pod -n test -o wide   #Pod保留
NAME          READY   STATUS    RESTARTS   AGE    IP            NODE          NOMINATED NODE   READINESS GATES
pc-rs-4rdpw   1/1     Running   0          108s   10.244.2.40   k8s-node-02   <none>           <none>
pc-rs-7n9qj   1/1     Running   0          108s   10.244.2.41   k8s-node-02   <none>           <none>
pc-rs-rkgmr   1/1     Running   0          108s   10.244.2.39   k8s-node-02   <none>           <none>
​
[root@K8s-master ~]# kubectl delete pod pc-rs-4rdpw -n test   #没有了控制器Pod不会创建
pod "pc-rs-4rdpw" deleted
[root@K8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS    RESTARTS   AGE     IP            NODE          NOMINATED NODE   READINESS GATES
pc-rs-7n9qj   1/1     Running   0          4m10s   10.244.2.41   k8s-node-02   <none>           <none>
pc-rs-rkgmr   1/1     Running   0          4m10s   10.244.2.39   k8s-node-02   <none>           <none>
​
[root@K8s-master ~]# kubectl delete -f pc-replicaset.yaml   #也可以直接删文件
replicaset.apps "pc-rs" deleted
[root@K8s-master ~]# kubectl get pod -n test -o wide
No resources found in test namespace.

1.4 Deployment(Deploy)控制器

  • 从Kubernetes 1.2版本开始,引入了Deployment控制器,它提供了一种更高级别的抽象来管理应用的生命周期,包括应用的声明式更新、回滚、暂停和恢复等。Deployment的设计目标是简化应用的部署和扩展࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值