k8s学习 - 概念 - ReplicaSet

首先,ReplicaSet 和 ReplicationController 基本上一样,除了上篇说到的selector有不同之外,没有啥区别。(官网也是这么说的)。但是为什么官方建议的不是ReplicaController + Deployment的集合呢?咋们也不敢说,咋们也不敢问。反正我就知道,用 ReplicationController 的值得被鄙视,用ReplicationSet +deployment 的现在是正统。

ReplicaSet

它和ReplicationController一样用来控制pod的。ReplicationSet + deployment中,ReplicationSet都是由deployment自动生成的,我们不需要再写一个replicaset.yaml。因为我们看中的是deployment的回滚、版本记录等功能,deployment依赖的ReplicationSet自动生成会好过我们手动生成ReplicationSet。否则我们手动配置的哪个地方和deployment要求的不一样,就很难查了。

下面是我用deployment自动生成的一个ReplicationSet的yaml配置文件:

kubectl get rs frontend-5c548f4769 -o=yaml
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
annotations:
deployment.kubernetes.io/desired-replicas: "3"
deployment.kubernetes.io/max-replicas: "4"
deployment.kubernetes.io/revision: "1"
creationTimestamp: 2019-07-09T06:28:38Z
generation: 1
labels:
app: guestbook
pod-template-hash: "1710490325"
tier: frontend
name: frontend-5c548f4769
namespace: default
ownerReferences:
- apiVersion: extensions/v1beta1
blockOwnerDeletion: true
controller: true
kind: Deployment
name: frontend
uid: c970981e-a212-11e9-89ff-025000000001
resourceVersion: "1471299"
selfLink: /apis/extensions/v1beta1/namespaces/default/replicasets/frontend-5c548f4769
uid: c972e269-a212-11e9-89ff-025000000001
spec:
replicas: 3
selector:
matchLabels:
app: guestbook
pod-template-hash: "1710490325"
tier: frontend
template:
metadata:
creationTimestamp: null
labels:
app: guestbook
pod-template-hash: "1710490325"
tier: frontend
spec:
containers:
- env:
- name: GET_HOSTS_FROM
value: dns
image: gcr.io/google-samples/gb-frontend:v4
imagePullPolicy: IfNotPresent
name: php-redis
ports:
- containerPort: 80
protocol: TCP
resources:
requests:
cpu: 100m
memory: 100Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 3
fullyLabeledReplicas: 3
observedGeneration: 1
readyReplicas: 3
replicas: 3

spec.template就完全是一个pod的配置,前面章节已经说过了。所以整个配置文件缩略下来就是下面这个样子:

kubectl get rs frontend-5c548f4769 -o=yaml
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
...
generation: 1
...
ownerReferences:
- apiVersion: extensions/v1beta1
blockOwnerDeletion: true
controller: true
kind: Deployment
name: frontend
uid: c970981e-a212-11e9-89ff-025000000001
resourceVersion: "1471299"
selfLink: /apis/extensions/v1beta1/namespaces/default/replicasets/frontend-5c548f4769
uid: c972e269-a212-11e9-89ff-025000000001
spec:
replicas: 3
selector:
matchLabels:
app: guestbook
pod-template-hash: "1710490325"
tier: frontend
template:
...
status:
availableReplicas: 3
fullyLabeledReplicas: 3
observedGeneration: 1
readyReplicas: 3
replicas: 3

我们就一个个研究这些没有见过的配置:

metadata.generation & status.observedGeneration

这两个是对应的,metadata.generation 就是这个 ReplicationSet 的元配置数据被修改了多少次。这里就有个版本迭代的概念。每次我们使用 kuberctl edit 来修改 ReplicationSet 的配置文件,或者更新镜像,这个generation都会增长1,表示增加了一个版本。

这个版本迭代是配置文件只要有改动就进行版本迭代。observedGeneration就是最近观察到的可用的版本迭代。这两个只有在镜像升级的时候有可能不同,当我们使用 kubectl rollout status 来探测一个deployment的状态的时候,就是检查observedGeneration是否大于等于generation。

metadata.ownerReferences

这个字段就需要说到 owner 对象的概念了。文章中这个 ReplicaSet 是通过 Deployment 自动生成的,所以这个 ReplicaSet 是属于某个 Deployment的,那么那个 Deployment 就叫做它的 Owner,当前这个 ReplicaSet 就叫做那个 Deployment 的 Dependent。这个字段就是标注这个 ReplicaSet 的 Owner 信息。

blockOwnerDeletion 这个字段表示在删除 Owner 对象的时候,是否要先删除当前这个 Dependent。删除一个 Owner 对象有两种模式,一种是后台模式,就是先把 Owner 对象删除,再在后台删除它的 Dependent。另外一种是前台模式,先把所有的 Dependent 删除(标记删除),然后再删除 Owner 对象。这里的 blockOwnerDeletion 就是表示当它的 Owner 的删除策略是前台删除的时候,是否需要考虑先删除它。

controller 表示这个对象是否有管理它的控制器。

name, uid, kind 都是指向 Owner 对象的唯一标识。

metadata.resourceVersion

每个资源在底层数据库都有版本的概念,我们可以使用 watch 来看某个资源,某个版本之后的操作。这些操作是存储在 etcd 中的。当让,并不是所有的操作都会永久存储,只会保留有限的时间的操作。这个 resourceVersion 就是这个资源对象当前的版本号。

status

replicas 实际的 pod 副本数

availableReplicas 现在可用的 Pod 的副本数量,有的副本可能还处在未准备好,或者初始化状态

readyReplicas 是处于 ready 状态的 Pod 的副本数量

fullyLabeledReplicas 意思是这个 ReplicaSet 的标签 selector 对应的副本数量,不同纬度的一种统计

k8s学习 - 概念 - ReplicaSet的更多相关文章

  1. k8s学习 - 概念 - ReplicationController

    k8s学习 - 概念 - ReplicationController 我们有了 pod,那么就需要对 pod 进行控制,就是同一个服务的 podv我需要启动几个?如果需要扩容了,怎么办?这里就有个控制 ...

  2. k8s学习 - 概念 - Deployment

    k8s学习 - 概念 - Deployment 有了 ReplicaSet 还需要有 Deployment 的原因是希望有一个控制器能管理部署更新时候的版本控制问题.一个 Deployment 可以管 ...

  3. k8s学习 - 概念 - master/node

    k8s学习 - 概念 - master/node 在k8s中,有各种各样的概念和术语.这些概念是必须要学习和掌握的.我们先罗列下所有概念,然后再一个个看具体实例. 大概说一下这些概念: Master: ...

  4. k8s学习 - 概念 - Pod

    k8s学习 - 概念 - Pod 这篇继续看概念,主要是 Pod 这个概念,这个概念非常重要,是 k8s 集群的最小单位. 怎么才算是理解好 pod 了呢,基本上把 pod 的所有 describe ...

  5. ASP.NET Core on K8S学习初探(2)K8S基本概念快速一览

    在上一篇<单节点环境搭建>中,通过Docker for Windows在Windows开发机中搭建了一个单节点的K8S环境,接下来就是动人心弦的部署ASP.NET Core API到K8S ...

  6. ASP.NET Core on K8S学习初探(1)K8S单节点环境搭建

    当近期的一个App上线后,发现目前的docker实例(应用服务BFF+中台服务+工具服务)已经很多了,而我司目前没有专业的运维人员,发现运维的成本逐渐开始上来,所以容器编排也就需要提上议程.因此我决定 ...

  7. ASP.NET Core on K8S学习初探(3)部署API到K8S

    在上一篇<基本概念快速一览>中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程. Section ...

  8. .NET Core on K8S学习实践系列文章索引(Draft版)

    一.关于这个系列 自从去年(2018年)底离开工作了3年的M公司加入X公司之后,开始了ASP.NET Core的实践,包括微服务架构与容器化等等.我们的实践是渐进的,当我们的微服务数量到了一定值时,发 ...

  9. ASP.NET Core on K8S学习之旅(12)Ingress

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.关于Ingress Kubernetes对外暴露Service主要有三种方 ...

随机推荐

  1. 零元学Expression Blend 4 - Chapter 9 用实例了解布局容器系列-「Canvas」

    原文:零元学Expression Blend 4 - Chapter 9 用实例了解布局容器系列-「Canvas」 本系列将教大家以实做案例认识Blend 4 的布局容器,此章介绍的布局容器是Blen ...

  2. 教你如何在Deepin搭建Qt开发环境(sudo apt-get install qt5-default qt5-qmake g++ qtcreator,也许对龙芯版的Deepin也有用)

    首先教大家一种很简单的方法,打开终端输入以下命令: sudo apt-get install qt5-default qt5-qmake g++ qtcreator 上面的命令会自动帮你安装qt5开发 ...

  3. Tomcat请求过程

    Tomcat请求过程 1.用户点击网页内容,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得. 2.Connector把该请求交给它所在的Servic ...

  4. jQuery仪表盘指示器动画插件 6种仪表样式

    土豆网同步更新:http://www.tudou.com/plcover/VHNh6ZopQ4E/   使用HTML 创建Mac OS App 视频教程. 官方QQ群: (1)App实践出真知 434 ...

  5. GetParent、SetParent、MoveWindow - 获取、指定父窗口和移动窗口,IsChild - 判断两个窗口是不是父子关系

    提示: SetParent 应该 Windows.SetParent, 因为 TForm 的父类有同名方法. //声明: {获取父窗口句柄} GetParent(hWnd: HWND): HWND; ...

  6. c# Lambda扩展

    扩展类 public static class LinqExtensions { /// <summary> /// 创建lambda表达式:p=>true /// </sum ...

  7. 30441数据定义语言DDL

    数据定义:指对数据库对象的定义.删除和修改操作. 数据库对象主要包括数据表.视图.索引等. 数据定义功能通过CREATE.ALTER.DROP语句来完成. 按照操作对象分类来介绍数据定义的SQL语法. ...

  8. Libra 加密稳定币:Facebook的"野心"?

    2008年11月1日,有一个传说叫中本聪的日裔美国人,发表了一篇名为<比特币:一种点对点式的电子现金系统>的论文.2009年,比特币出世,从此开启了电子货币这个收割机器,全世界的韭菜都是一 ...

  9. 【转载】Spring Boot引起的“堆外内存泄漏”排查及经验总结

    背景 为了更好地实现对项目的管理,我们将组内一个项目迁移到MDP框架(基于Spring Boot),随后我们就发现系统会频繁报出Swap区域使用量过高的异常.笔者被叫去帮忙查看原因,发现配置了4G堆内 ...

  10. QSqlRelationalTableModel的Select语句会改变列的名字

    不解释QSqlRelationalTableModel是什么东西.看以下代码: //3.1 创建model model = new QSqlRelationalTableModel(); model- ...