Kubernetes最核心的功能就是编排,而编排操作都是依靠控制器对象来完成的,高级的控制器对象控制基础的控制器对象,基础的控制器对象再去控制PodPod里面再包容器。Kubernetes项目里API对象的层级结构大概就是这样。前面的文章:(Kubernetes Pod入门指南) 已经介绍了Pod概念和使用方法,今天我们来介绍管理Pod的最基础的一个控制器ReplicaSet

ReplicaSet是什么

光从ReplicaSet这个控制器的名字(副本集)也能想到它是用来控制副本数量的,这里的每一个副本就是一个PodReplicaSet它是用来确保我们有指定数量的Pod副本正在运行的Kubernetes控制器,意在保证系统当前正在运行的Pod数等于期望状态里指定的Pod数目。

一般来说,Kubernetes建议使用Deployment控制器而不是直接使用ReplicaSetDeployment是一个管理ReplicaSet并提供Pod声明式更新、应用的版本管理以及许多其他功能的更高级的控制器。所以Deployment控制器不直接管理Pod对象,而是由 Deployment 管理ReplicaSet,再由ReplicaSet负责管理Pod对象。

明白了这个逻辑后就明白为什么要在学习Deployment前先来了解ReplicaSet这个控制器对象了。

ReplicaSet 怎么管理Pod

ReplicaSet会通过标签选择器(Label-Selector)管理所有带有与选择器匹配的标签的容器。创建Pod时,它会认为所有Pod 是一样的,是无状态的,所以在创建顺序上不会有先后之分。如果使用相同的标签选择器创建另一个ReplicaSet,则之前的ReplicaSet会认为是它创建了这些Pod,会触发控制循环里的逻辑删掉多余的Pod ,新的ReplicSet又会再次创建Pod。双方的当前状态始终不等于期望状态,这就会引发问题,因此确保ReplicaSet标签选择器的唯一性这一点很重要。

定义ReplicaSet对象

下面这个配置文件的模板里罗列了定义ReplicaSet对象的YAML文件内容的主要组成部分:

apiVersion: apps/v1
kind: ReplicaSet
metadata: name: some-namelabels:app: some-Apptier: some-Tier
spec: replicas: 3 # 告诉k8s需要多少副本Selector: # 用于匹配Pod的标签选择器matchLabels:tier: someTiertemplate:metadata:labels:app: some-Apptier: someTierspec: # 与Pod对象的spec定义类似Containers:

Kubernetes里所有的API对象都由四部分组成:

  • apiVersion -- 当前使用的Kubernetes的API版本。

  • kind -- 你想创建的对象的种类。

  • metadata -- 元数据,用于唯一表示当前的对象,比如name、namespace等。

  • spec -- 当前对象的指定配置。

但是ReplicaSet的spec部分的定义看起来与其他对象的spec定义略有不同。上面的示例中有两个spec字段。第一个spec声明的是ReplicaSet的属性--定义有多少个Pod副本(默认将仅部署1个Pod)、匹配Pod标签的选择器等。第二个spec用于Pod里的容器属性等配置。

实际上" .spec.template"里的内容就是声明Pod对象时要定义的各种属性,所以这部分也叫做PodTemplate(Pod模板)。还有一个值得注意的地方是:在.spec.selector中定义的标签选择器必须能够匹配到spec.template.metadata.labels里定义的Pod标签,否则Kubernetes将不允许创建ReplicaSet

ReplicaSet使用示例

了解了什么是副本集,以及如何编写副本集的声明文件后,接下来我们动手创建一个副本集。在此示例中,我们将通过replica.yaml文件创建一个具有3个Pod副本的nginx应用。

# replica.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:name: myapp-replicaslabels:app: myapptier: frontend
spec:replicas: 3selector:matchLabels:tier: frontendmatchExpressions:- {key: tier, operator: In, values: [frontend]}template:metadata:labels:app: myapptier: frontendspec:containers:- name: nginximage: nginxports:- containerPort: 80

首先我们运行kubectl create命令使用上面定义的声明文件创建对象。

$ kubectl create -f replica.yaml
replicaset.apps "myapp-replicas" created

接下来通过命令确保副本集创建成功

$ kubectl get replicaset
NAME                            DESIRED   CURRENT   READY     AGE
myapp-replicas                  3         3         3         15s

上面的命令返回显示了myapp-replicas副本集部署了三个副本,三个都是就绪状态。接下来我们再看一下每个Pod副本的运行状态:

$ kubectl get pod
NAME                            READY     STATUS    RESTARTS   AGE
myapp-replicas-67rkp            1/1       Running   0          33s
myapp-replicas-6kfd8            1/1       Running   0          33s
myapp-replicas-s96sg            1/1       Running   0          33s

所有3个都处于运行状态,重启次数都是0,这意味着目前为止我们的应用程序没有崩溃过。我们还可以使用kubectl describe命令查询副本集对象的详细信息,信息里的Events部分详细显示了ReplicaSet控制器进行过哪些编排动作。

$ kubectl describe replicaset myapp-replicas
Name:         myapp-replicas
Namespace:    default
Selector:     tier=frontend,tier in (frontend)
Labels:       app=myapptier=frontend
Annotations:
Replicas:     3 current / 3 desired
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:Labels:  app=myapptier=frontendContainers:nginx:Image:        nginxPort:         80/TCPHost Port:    0/TCPEnvironment:  Mounts:       Volumes:
Events:Type    Reason            Age   From                   Message----    ------            ----  ----                   -------Normal  SuccessfulCreate  12m   replicaset-controller  Created pod: myapp-replicas-6kfd8Normal  SuccessfulCreate  12m   replicaset-controller  Created pod: myapp-replicas-67rkpNormal  SuccessfulCreate  12m   replicaset-controller  Created pod: myapp-replicas-s96sg

总结

总体来说ReplicaSet需要掌握的基本概念就这么多,从上面的YAML文件中我们可以看到,一个 ReplicaSet对象的定义,其实就是由副本数目的定义和一个 Pod 模板组成的。等下篇文章讲到Deployment对象时你就会发现,ReplicaSet对象定义文件里的内容其实是Deployment对象的子集。

实际应用中我们不直接创建使用ReplicaSet对象,而是直接使用更高级的控制器对象Deployment,由 Deployment 管理ReplicaSet

Kubernetes入门实践--部署运行Go项目

如何避免用动态语言的思维写Go代码

❤️爱心三连

1.看到这了就点个「在看」吧,你点一次小编涨工资两毛。

2.关注公众号网管叨bi叨,「每周为您分享原创技术文章」!

“在看转发”是最大的支持

Kubernetes控制器--副本集ReplicaSet相关推荐

  1. k8s初面考点ReplicaSet副本集极限9连击你懂了吗?

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  2. MongoDB副本集、分片集的伪分布式部署(保姆级教程)

    目录 1 集群架构(概念篇) 1.1 MongoDB核心组件 1.2 主从复制 1.3 副本集 1.4 分片集 2 集群搭建 2.1 部署副本集(伪分布式) 2.2 分片集部署(伪分布式) 2.3 副 ...

  3. MySQL 集群 3副本,Kubernetes经典实践——运行MySQL多副本集群

    JFrog 在线课堂 Kubernetes经典实践--运行MySQL多副本集群 课程背景 Kubernetes以其先进的理念.活跃的社区,已成为当前容器集群化编排.部署和运行的事实标准.越来越多的企业 ...

  4. Docker应用:Kubernetes(容器集群)

    Docker应用:Kubernetes(容器集群) 原文:Docker应用:Kubernetes(容器集群) 阅读目录: Docker应用:Hello World Docker应用:Docker-co ...

  5. 9、Kubernetes控制器Controller详解

    文章目录 一.Statefulset(有状态应用) 1.1 无状态应用 1.2 有状态应用 1.3 部署有状态应用 二.DaemonSet(守护进程) 三Job和CronJob(定时任务) 3.1 J ...

  6. 用Java开发自己的Kubernetes控制器,想试试吗?

    作者 | Nicolas Fränkel 译者 | 天道酬勤 责编 | 徐威龙 封图| CSDN 下载于视觉中国 在本文中,我们将开始开发自己的Kubernetes控制器. 技术栈可以是Python. ...

  7. 用 Java 开发自己的 Kubernetes 控制器,想试试吗?

    作者 | Nicolas Fränkel 译者 | 天道酬勤,责编 | 徐威龙 封图 | CSDN 下载于视觉中国 在本文中,我们将开始开发自己的Kubernetes控制器. 技术栈可以是Python ...

  8. mongo 副本集部署

    当前我们使用docker-compose 的方式部署mongodb 副本集.当然,最佳还是使用kubernetes进行mongodb副本集的部署. 环境准备 1.安装docker,docker-com ...

  9. 二进制搭建kubernetes多master集群【三、配置k8s master及高可用】

    前面两篇文章已经配置好了etcd和flannel的网络,现在开始配置k8s master集群. etcd集群配置参考:二进制搭建kubernetes多master集群[一.使用TLS证书搭建etcd集 ...

最新文章

  1. 云知声CEO黄伟:AI对产业的驱动不仅是创新更是颠覆
  2. iOS-开启arc之后 NSNotificationCenter removeObserver 是否需要调用
  3. linux设备和驱动加载的先后顺序
  4. 【Paper】23_[14]A Decentralized Approach to Formation Maneuvers
  5. 四年努力,梦归阿里,和大家聊聊成长感悟
  6. sunPKCS11加载动态库(转)
  7. 内网渗透-域内信息收集
  8. R语言观察日志(part18)--.C和.Call
  9. linux配置ip地址 suse_suse linux中为单网卡配置多IP的方法
  10. 【探索HTML5第二弹05】响应式布局(中),一步一步响应式布局
  11. SVN学习2020.8.9
  12. 华为盒子 原生android,华为悦盒/各种安卓盒子找回原生设置以及适配蓝牙遥控器...
  13. 解决Chrome谷歌浏览器Flash插件已被屏蔽
  14. 360c301路由器安装openwrt18.06usb打印服务器
  15. html遮罩层样式,遮罩层样式
  16. CATransform3D 矩阵 m11–m44每个的含义
  17. 绝地求生发生错误服务器维护,绝地求生更新时发生错误无法连接服务器解决办法最新版...
  18. 王传宝老师--宏观经济学家--金融研究专家---沪师经纪刘建
  19. JAVA 人工神经网络实现,机器学习,人工智能
  20. IBM Websphere Premises Server V6.1入门介绍和API实践

热门文章

  1. JavaWeb 后端 三 之 Response Request 学习笔记
  2. MySQL里的日期技巧
  3. Windows 查看程序占用的端口
  4. git多人合作时,恢复误删文件
  5. C语言自学《三》---- 条件判断
  6. infopath视图切换
  7. 培养女人味的12条妙方
  8. Redis内核原理及读写一致企业级架构深入剖析1-综合组件环境实战
  9. Java算法面试题:编写一个程序,将e:\neck目录下的所有.java文件复制到e:\jpg目录下,并将原来文件的扩展名从.java改为.jpg...
  10. 打造智能家居安防系统 七个选购常识你需懂