k8s--控制器介绍和 ReplicaSet 控制器

简介: k8s--控制器介绍和 ReplicaSet 控制器

控制器介绍


pod 是 kubernetes 的最小管理单元,在 kubernetes 中,按照 pod 的创建方式可以将其分为两类

  • 自主式 pod:kubernetes 直接创建出来的 pod,这种 pod 删除后就没有了,也不会重新创建
  • 控制器创建的 pod:kubernetes 通过控制器创建的 pod,这种 pod 删除了之后还会自动创建

什么是 pod 控制器

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

在 kubernetes 中,有很多类型的 pod 控制器,每种都有自己适合的场景,常见的控制器有下面这些

  • ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代
  • ReplicaSet:保证副本数量一直维持在期望值,并支持pod数量扩缩容,镜像版本升级
  • Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、回退版本
  • Horizontal Pod Autoscaler:可以根据集群负载自动水平调整Pod的数量,实现削峰填谷
  • DaemonSet:在集群中的指定Node上运行且仅运行一个副本,一般用于守护进程类的任务
  • Job:它创建出来的pod只要完成任务就立即退出,不需要重启或重建,用于执行一次性任务
  • Cronjob:它创建的Pod负责周期性任务控制,不需要持续后台运行
  • StatefulSet:管理有状态应用


ReplicaSet(RS) 控制器


ReplicaSet 的主要作用是保证一定数量的 pod 正常运行,它会持续监听这些 pod 的运行状态,一旦 pod 发生故障,就会重启或者新建,同时它还支持对 pod 数量的扩缩容和镜像版本的升降级

  • Replication Controller 为 Kubernetes 的一个核心内容,应用托管到 Kubernetes 之后,需要保证应用能够持续的运行,Replication Controller 就是这个保证的 key,主要的功能如下:
  • 确保 pod 数量:它会确保 Kubernetes 中有指定数量的 Pod 在运行。如果少于指定数量的 pod,Replication Controller 会创建新的,反之则会删除掉多余的以保证 Pod 数量不变。
  • 确保 pod 健康:当 pod 不健康,运行出错或者无法提供服务时,Replication Controller 也会杀死不健康的 pod,重新创建新的。
  • 弹性伸缩 :在业务高峰或者低峰期的时候,可以通过 Replication Controller 动态的调整 pod 的数量来提高资源的利用率。同时,配置相应的
  • 监控功能(Hroizontal Pod Autoscaler),会定时自动从监控平台获取 Replication Controller 关联 pod 的整体资源使用情况,做到自动伸缩。
  • 滚动升级:滚动升级为一种平滑的升级方式,通过逐步替换的策略,保证整体系统的稳定,在初始化升级的时候就可以及时发现和解决问题,避免问题不断扩大。

ReplicaSet 的资源清单文件:

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

在这里面,需要新了解的配置项就是 spec 下面的几个选项

  • replicas:指定副本数量,其实就是当前 rs 创建出来的 pod 的数量,默认为 1
  • selector:选择器。它的作用是建立 pod 控制器和 pod 之间的关联关系,采用的 Label Selector 机制,在 pod 模板上定义 label,在控制器上定义选择器,就可以表明当前控制器能管理哪些 pod 了
  • template:模板,就是当前控制器创建的 pod 所使用的模板,里面其实就是 pod 的定义


创建 ReplicaSet


创建 pc-replicaset.yaml 文件,内容如下:

apiVersion: apps/v1
kind: ReplicaSet # 类型为 RS 控制器
metadata:
  name: pc-replicaset # 这个就是 rs 的名字,生成的 pod 会在这个后面加上随机字符
  namespace: zouzou
spec:
  replicas: 3  # 副本数为 3 个
  selector: 
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.14

创建 RS 控制器

# 创建 RS 控制器
kubectl apply -f pc-replicaset.yaml

查看 RS 控制器和 pod

# 查看 RS 控制器,rs 是 replicaset 的简写
# DESIRED:期望的副本数量
# CURRENT:当前的副本数量
# READY:已经准备好提供服务的副本数量
[root@dce-10-6-215-215 tmp]# kubectl get rs pc-replicaset -n zouzou -o wide
NAME            DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES       SELECTOR
pc-replicaset   3         3         3       89s   nginx        nginx:1.14   app=nginx-pod
# 查看 pod,这里发现控制器创建出来的 pod 名称是在控制器名称后面拼接了-xxxxx 随机码
[root@dce-10-6-215-215 tmp]#
[root@dce-10-6-215-215 tmp]# kubectl get pod -n zouzou
NAME                         READY   STATUS      RESTARTS   AGE
pc-replicaset-5vbjj          1/1     Running     0          110s
pc-replicaset-qddc4          1/1     Running     0          110s
pc-replicaset-qr7wc          1/1     Running     0          110s


扩缩容


扩缩容就是 pod 的数量,对应 yaml 里的 spec:replicas

1.可以通过编辑 rs 的副本数量,修改 spec:replicas: 6 即可

# 通过 edit 实现,改完文件保存之后就会自动生效
[root@dce-10-6-215-215 tmp]# kubectl edit rs pc-replicaset -n zouzou
replicaset.apps/pc-replicaset edited
# 查看 pod 的数量,变成了 6 个 pod
[root@dce-10-6-215-215 tmp]# kubectl get pod -n zouzou
NAME                     READY   STATUS    RESTARTS   AGE
pc-replicaset-5vbjj      1/1     Running   0          24m
pc-replicaset-6sb4z      1/1     Running   0          9s
pc-replicaset-7z8tv      1/1     Running   0          9s
pc-replicaset-qddc4      1/1     Running   0          24m
pc-replicaset-qr7wc      1/1     Running   0          24m
pc-replicaset-twbzm      1/1     Running   0          9s

2.通过命令来实现,使用 scale 命令实现扩缩容, 后面 --replicas=n 直接指定目标数量即可

# 通过命令修改副本数量,改为两个副本数
[root@dce-10-6-215-215 tmp]# kubectl scale rs pc-replicaset --replicas=2 -n zouzou
replicaset.apps/pc-replicaset scaled
# 查看pod,发现有四个的状态是 Terminating
[root@dce-10-6-215-215 tmp]# kubectl get pod -n zouzou
NAME                     READY   STATUS        RESTARTS   AGE
pc-replicaset-5vbjj      1/1     Terminating   0          27m
pc-replicaset-6sb4z      1/1     Terminating   0          2m47s
pc-replicaset-7z8tv      1/1     Terminating   0          2m47s
pc-replicaset-qddc4      1/1     Running       0          27m
pc-replicaset-qr7wc      1/1     Running       0          27m
pc-replicaset-twbzm      1/1     Terminating   0          2m47s
# 在等会查看,副本数就只有两个了
[root@dce-10-6-215-215 tmp]# kubectl get pod -n zouzou
NAME                     READY   STATUS    RESTARTS   AGE
pc-replicaset-qddc4      1/1     Running   0          27m
pc-replicaset-qr7wc      1/1     Running   0          27m

3.vim 编辑修改 pc-replicaset.yaml 文件,改好副本数保存后,在 apply 一下,我这里把副本数改为了 5

# 修改副本数,改为 5
[root@dce-10-6-215-215 tmp]# vim pc-replicaset.yaml
# 修改完文件后重新配置一下
[root@dce-10-6-215-215 tmp]# kubectl apply -f pc-replicaset.yaml
replicaset.apps/pc-replicaset configured
# 查看发现有三个 pod 正在创建
[root@dce-10-6-215-215 tmp]# kubectl get pod -n zouzou
NAME                     READY   STATUS              RESTARTS   AGE
pc-replicaset-96ngk      0/1     ContainerCreating   0          4s
pc-replicaset-b8fhc      0/1     ContainerCreating   0          4s
pc-replicaset-bqhvz      0/1     ContainerCreating   0          4s
pc-replicaset-qddc4      1/1     Running             0          30m
pc-replicaset-qr7wc      1/1     Running             0          30m
# 五个pod 都已经运行了
[root@dce-10-6-215-215 tmp]# kubectl get pod -n zouzou
NAME                     READY   STATUS    RESTARTS   AGE
pc-replicaset-96ngk      1/1     Running   0          11s
pc-replicaset-b8fhc      1/1     Running   0          11s
pc-replicaset-bqhvz      1/1     Running   0          11s
pc-replicaset-qddc4      1/1     Running   0          30m
pc-replicaset-qr7wc      1/1     Running   0          30m


镜像升级


目前我们用的镜像是 nginx:1.14的。现在我们要升级为 1.15

也有三种修改的方式

1.可以通过编辑rs的容器镜像 - image: nginx:1.15

# 通过 edit 实现,改完文件保存之后就会自动生效
[root@dce-10-6-215-215 tmp]# kubectl edit rs pc-replicaset -n zouzou
replicaset.apps/pc-replicaset edited
# 控制器 pc-replicaset 的 nginx 镜像已经成了 1.15 之前是1.14
[root@dce-10-6-215-215 tmp]# kubectl get rs -n zouzou -o wide
NAME               DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES       SELECTOR
nginx3-c5d7c9466   1         1         1       21m   nginx        nginx:1.14   app=nginx3,pod-template-hash=c5d7c9466
pc-replicaset      5         5         5       36m   nginx        nginx:1.15   app=nginx-pod

2.通过命令来实现,kubectl set image rs rs名称 容器=镜像版本 -n namespace

# 通过命令的方式,将镜像版本改为 1.14
[root@dce-10-6-215-215 tmp]# kubectl set image rs pc-replicaset nginx=nginx:1.14 -n zouzou
replicaset.apps/pc-replicaset image updated
# 查看 rs,发现镜像版本从原来的 1.15 改为了 1.14
[root@dce-10-6-215-215 tmp]# kubectl get rs -n zouzou -o wide
NAME               DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES       SELECTOR
nginx3-c5d7c9466   1         1         1       26m   nginx        nginx:1.14   app=nginx3,pod-template-hash=c5d7c9466
pc-replicaset      5         5         5       41m   nginx        nginx:1.14   app=nginx-pod

3.vim 编辑修改 pc-replicaset.yaml 文件,把镜像改为 1.15

# 修改文件,改镜像,保存
[root@dce-10-6-215-215 tmp]# vim pc-replicaset.yaml
# 重新 apply 一下 pc-replicaset.yaml
[root@dce-10-6-215-215 tmp]# kubectl apply -f pc-replicaset.yaml
replicaset.apps/pc-replicaset configured
# 查看 rs,发现镜像又变成了 1.15
[root@dce-10-6-215-215 tmp]# kubectl get rs -n zouzou -o wide
NAME               DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES       SELECTOR
nginx3-c5d7c9466   1         1         1       28m   nginx        nginx:1.14   app=nginx3,pod-template-hash=c5d7c9466
pc-replicaset      5         5         5       43m   nginx        nginx:1.15   app=nginx-pod


删除 ReplicaSet


删除 RS 控制器也有三种方法

# 使用 kubectl delete 命令会删除此 RS 以及它管理的 Pod
# 在 kubernetes 删除 RS 前,会将 RS 的 replicasclear 调整为 0,等待所有的 Pod 被删除后,在执行 RS 对象的删除
[root@dce-10-6-215-215 tmp]# kubectl delete rs pc-replicaset -n zouzou
replicaset.apps "pc-replicaset" deleted
# 如果希望仅仅删除 RS 对象(保留 Pod ),可以使用 kubectl delete 命令时添加 --cascade=false 选项(不推荐)。
[root@dce-10-6-215-215 tmp]# kubectl delete rs pc-replicaset -n dev --cascade=false
replicaset.apps "pc-replicaset" deleted
[root@dce-10-6-215-215 tmp]# kubectl get pods -n dev
NAME                  READY   STATUS    RESTARTS   AGE
pc-replicaset-cl82j   1/1     Running   0          75s
pc-replicaset-dslhb   1/1     Running   0          75s
# 也可以使用yaml直接删除(推荐)
[root@dce-10-6-215-215 tmp]# kubectl delete -f pc-replicaset.yaml
replicaset.apps "pc-replicaset" deleted


RS 的选择器


rs 在标签选择器上,除了可以定义键值对的选择方式。还支持 matchExpressions 字段,可以提供多种选择,目前支持的操作有

  • In:label 的值在某个列表中
  • NotIn:列表的值不在某个列表中
  • Exists:某个 label 存在
  • DoesNotExist:某个 label 不存在

如下面的 rs.yaml 加上 matchExpressions  字段

apiVersion: apps/v1
kind: ReplicaSet # 使用 rs 选择器
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  replicas: 3
  selector:
    matchExpressions:
      - key: tier # 只要有 key,且 key 的值为 tier 就行,不管 tier 对应的 value 是什么
        operator: Exists # 某个 label 存在
  template:
    metadata:
      labels:
        tier: frontend  # 这里存在 tier 的 key,就可以匹配上
    spec:
      containers:
      - name: php-redis
        image: yecc/gcr.io-google_samples-gb-frontend:v3
        imagePullPolicy:  IfNotPresent

In 的用法

apiVersion: apps/v1
kind: ReplicaSet # 使用 rs 选择器
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  replicas: 3
  selector:
    matchExpressions:
      - key: tier #
        operator: In # 在某个列表里面 ,在 values 里面
        values: 
          - spring-k8s
          - haha
  template:
    metadata:
      labels:
        tier: sg-k8s # 匹配不上,要么是 spring-k8s 或者 haha
    spec:
      containers:
      - name: php-redis
        image: yecc/gcr.io-google_samples-gb-frontend:v3
        imagePullPolicy:  IfNotPresent

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
Kubernetes 监控 调度
【赵渝强老师】K8s的DaemonSet控制器
DaemonSet控制器确保每个节点上运行一个Pod副本,适用于监控、日志收集等场景。通过示例创建DaemonSet并查看Pod信息,展示了其自动扩展和回收的能力。视频讲解和代码示例详细说明了DaemonSet的使用方法和调度机制。
|
1月前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Job控制器单工作队列的串行方式
Kubernetes中的Job控制器用于管理一次性任务,确保任务完成后不再重启。本文介绍了Job的工作原理、运行方式及示例,包括创建Job、查看Job和Pod信息等步骤,并附有视频讲解。
|
1月前
|
Kubernetes 双11 容器
【赵渝强老师】Kubernetes中的控制器
Kubernetes通过控制器管理Pod的生命周期,以应对不同场景需求,如Deployment、DaemonSet、Job等。控制器可自动调整Pod数量和重启故障Pod,确保系统稳定运行。视频讲解和详细内容见下文。
|
1月前
|
Kubernetes 应用服务中间件 nginx
【赵渝强老师】K8s中的Deployment控制器
Kubernetes中的Deployment用于部署无状态应用程序,管理Pod的数量、更新方式和资源限制。通过创建和管理ReplicaSet,Deployment可以实现Pod的自动扩缩容、滚动更新和回滚。本文介绍了Deployment的基本概念,并通过一个具体的示例演示了如何使用Deployment创建、更新和管理Pod。
|
1月前
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。
|
1月前
|
存储 Kubernetes 调度
【赵渝强老师】K8s的有状态控制器StatefulSet
在Kubernetes中,StatefulSets用于部署有状态应用程序,提供持久存储和唯一标识符。与Deployment不同,StatefulSets确保Pod的标识符在重新调度后保持不变,适用于需要稳定网络标识符和持久存储的场景。本文介绍了StatefulSets的创建、扩容与缩容、更新与回滚等操作,并提供了具体示例和视频讲解。
|
1月前
|
Kubernetes Linux 调度
【赵渝强老师】K8s的周期性任务控制器CronJob
本文介绍了K8s中的CronJob控制器,它类似于Linux的crontab命令,用于管理和调度定时作业。CronJob可以设置在未来某一时间运行作业一次或在指定时间点重复运行作业。文章通过一个示例展示了如何创建和使用CronJob控制器,包括创建配置文件、应用配置、查看Pod信息和日志等步骤。同时,还解释了CronJob的时间表示方式及其限制。
|
1月前
|
Kubernetes 调度 容器
【赵渝强老师】K8s的Job控制器多工作队列的并行方式
Kubernetes Job 是一次性任务控制器,用于控制 Pod 中的容器执行特定任务。本文介绍了 Job 控制器的工作原理、运行方式及多工作队列并行执行的示例。示例中创建了 5 个作业,以 3 个队列并行执行,整个过程需 2 分钟。文中还提供了详细的 YAML 文件配置和执行命令。
|
7月前
|
运维 Kubernetes 监控
Kubernetes详解(十九)——Kubernetes Pod控制器
Kubernetes详解(十九)——Kubernetes Pod控制器
104 3
|
4月前
|
Kubernetes Perl 容器
在K8S中,replicaset 和deploy有何区别?
在K8S中,replicaset 和deploy有何区别?