首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Kubernetes(十五)Kubernetes ReplicaSet 的实现原理

  • 23-11-14 12:43
  • 3120
  • 13870
blog.csdn.net

Kubernetes 中的 ReplicaSet 主要的作用是维持一组Pod副本的运行,它的主要作用就是保证一定数量的 Pod 能够在集群中正常运行,它会持续监听这些 Pod 的运行状态,在 Pod 发生故障重启数量减少时重新运行新的 Pod 副本。

这篇文章会介绍 ReplicaSet 的工作原理,其中包括在 Kubernetes 中是如何被创建的、如何创建并持有 Pod 并在出现问题时重启它们。

概述

在具体介绍 ReplicaSet 的实现原理之前,我们还是会先简单介绍它的使用,与其他的 Kubernetes 对象一样,我们会在 Kubernetes 集群中使用 YAML 文件创建新的 ReplicaSet 对象,一个常见的 ReplicaSet 的定义其实是这样的:

  1. apiVersion: apps/v1
  2. kind: ReplicaSet
  3. metadata:
  4. name: frontend
  5. labels:
  6. app: guestbook
  7. tier: frontend
  8. spec:
  9. replicas: 3
  10. selector:
  11. matchLabels:
  12. tier: frontend
  13. template:
  14. metadata:
  15. labels:
  16. tier: frontend
  17. spec:
  18. containers:
  19. - name: php-redis
  20. image: gcr.io/google_samples/gb-frontend:v3

YAML

这里的 YAML 文件除了常见的 apiVersion、kind 和 metadata 属性之外,规格中总共包含三部分重要内容,也就是 Pod 副本数目 replicas、选择器 selector 和 Pod 模板 template,这三个部分共同定义了 ReplicaSet 的规格:

同一个 ReplicaSet 会使用选择器 selector 中的定义查找集群中自己持有的 Pod 对象,它们会根据标签的匹配获取能够获得的 Pod,下面就是持有三个 Pod 对象的 Replica 拓扑图:

  1. graph TD
  2. ReplicaSet-.->Pod1
  3. ReplicaSet-.->Pod2
  4. ReplicaSet-.->Pod3

被 ReplicaSet 持有的 Pod 有一个 metadata.ownerReferences 指针指向当前的 ReplicaSet,表示当前 Pod 的所有者,这个引用主要会被集群中的 垃圾收集器 使用以清理失去所有者的 Pod 对象。

如果需要删除全部的 Pod 就不对传入的 filteredPods 进行排序,否则就会按照三个不同的维度对 Pod 进行排序:

  1. NotReady < Ready
  2. Unscheduled < Scheduled
  3. Pending < Running

按照上述规则进行排序的 Pod 能够保证删除在早期阶段的 Pod 对象,简单总结一下,manageReplicas 方法会在与已经存在的 Pod 建立关系之后,对持有的数量和期望的数量进行比较之后,会根据 Pod 模板创建或者删除 Pod:

到这里整个处理 ReplicaSet 的主要工作就结束了,syncReplicaSet 中剩下的代码会更新 ReplicaSet 的状态并结束同步 ReplicaSet 的工作。

删除

如果我们在 Kubernetes 集群中删除一个 ReplicaSet 持有的 Pod,那么控制器会重新同步 ReplicaSet 的状态并启动一个新的 Pod,但是如果删除集群中的 ReplicaSet 所有相关的 Pod 也都会被删除:

  1. $ kubectl delete rs example
  2. replicaset.extensions "example" deleted
  3. $ kubectl get pods --watch
  4. example-z4fvc 0/1 Terminating 0 54s
  5. example-zswpk 0/1 Terminating 0 54s
  6. example-v8wwn 0/1 Terminating 0 54s

Bash

删除相关 Pod 的工作并不是 ReplicaSetController 负责的,而是由集群中的垃圾收集器也就是 GarbageCollector 实现的。

Kubernetes 中的垃圾收集器会负责删除以前有所有者但是现在没有的对象,metadata.ownerReference 属性标识了一个对象的所有者,当垃圾收集器发现对象的所有者被删除时,就会自动删除这些无用的对象,这也是 ReplicaSet 持有的 Pod 被自动删除的原因,我们会在 垃圾收集器垃圾收集器​​​​​​​ 一节中具体介绍垃圾收集器的原理。

总结

Kubernetes 中的 ReplicaSet 并不是一个工程师经常需要直接接触的对象,常用的 Deployment 其实使用 ReplicaSet 实现了很多复杂的特性,例如滚动更新,虽然作为使用者我们并不会经常直接与 ReplicaSet 这一对象打交道,但是如果需要对 Kubernetes 进行一些定制化开发,可能会用 ReplicaSet 和其他对象实现一些更复杂的功能。

注:本文转载自blog.csdn.net的liu_weiliang10405的文章"https://blog.csdn.net/liu_weiliang10405/article/details/123934840"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top