【云原生

2023-11-16

目录

K8s 控制器 Replicaset

一、Replicaset 控制器:概念、原理解读

1.1 Replicaset 概述

1.2 Replicaset 工作原理:如何管理 Pod ?

二、Replicaset 资源清单文件编写技巧 

三、Replicaset 使用案例:部署 Guestbook 留言板 

四、Replicaset 管理 pod:扩容、缩容、更新

4.1 Replicaset 实现 pod 的动态扩容

4.2 Replicaset 实现 pod 的动态缩容

4.3 Replicaset 实现 pod 的更新

4.4 总结


K8s 控制器 Replicaset

K8s 常见的控制器:replicaset、deployment、statefulset、daemonset、job、cronjobe等。

        前面我们学习了Pod,那我们在定义pod资源时,可以直接创建一个kind:Pod类型的自主式pod,但是这存在一个问题,假如pod被删除了,那这个pod就不能自我恢复,就会彻底被删除,线上这种情况非常危险,所以今天就给大家讲解下pod的控制器,所谓控制器就是能够管理pod,监测pod运行状况,当pod发生故障,可以自动恢复pod。也就是说能够代我们去管理pod中间层,并帮助我们确保每一个pod资源始终处于我们所定义或者我们所期望的目标状态,一旦pod资源出现故障,那么控制器会尝试重启pod或者里面的容器,如果一直重启有问题的话那么它可能会基于某种策略来进行重新布派或者重新编排;如果pod副本数量低于用户所定义的目标数量,它也会自动补全;如果多余,也会自动终止pod资源。

一、Replicaset 控制器:概念、原理解读

1.1 Replicaset 概述

        ReplicaSet 是kubernetes中的一种副本控制器,简称rs,主要作用是控制由其管理的pod,使pod副本的数量始终维持在预设的个数。它的主要作用就是保证一定数量的Pod能够在集群中正常运行,它会持续监听这些Pod的运行状态,在Pod发生故障时重启pod,pod数量减少时重新运行新的 Pod副本。官方推荐不要直接使用ReplicaSet,用Deployments取而代之,Deployments是比ReplicaSet更高级的概念,它会管理ReplicaSet并提供很多其它有用的特性,最重要的是Deployments支持声明式更新,声明式更新的好处是不会丢失历史变更。所以Deployment控制器不直接管理Pod对象,而是由 Deployment 管理ReplicaSet,再由ReplicaSet负责管理Pod对象。

1.2 Replicaset 工作原理:如何管理 Pod ?

        Replicaset 核心作用在于代用户创建指定数量的pod副本,并确保pod副本一直处于满足用户期望的数量, 起到多退少补的作用,并且还具有自动扩容缩容等机制。

        Replicaset 控制器主要由三个部分组成: 

  1. 用户期望的 pod 副本数:用来定义由这个控制器管控的pod副本有几个。
  2. 标签选择器:选定哪些pod是自己管理的,如果通过标签选择器选到的pod副本数量少于我们指定的数量,需要用到下面的组件。
  3. pod 资源模板:如果集群中现存的pod数量不够我们定义的副本中期望的数量怎么办,需要新建pod,这就需要pod模板,新建的pod是基于模板来创建的。

二、Replicaset 资源清单文件编写技巧 

# 查看定义 Replicaset 资源需要的字段有哪些?
[root@k8s-master01 ~]# kubectl explain rs
KIND:     ReplicaSet
VERSION:  apps/v1

DESCRIPTION:
     ReplicaSet ensures that a specified number of pod replicas are running at
     any given time.

FIELDS:
   # 当前资源使用的api 版本,跟VERSION: apps/v1 保持一致
   apiVersion	<string>
    
   # 资源类型,跟KIND: ReplicaSet 保持一致
   kind	<string>
    
   # 元数据,定义Replicaset 名字的
   metadata	<Object>
     
   # 定义副本数、定义标签选择器、定义Pod 模板
   spec	<Object>
    
   # 状态信息,不能改 
   status	<Object>
 

[root@k8s-master01 ~]# kubectl explain rs.metadata

[root@k8s-master01 ~]# kubectl explain rs.metadata.labels

# 查看 replicaset 的 spec 字段如何定义?
[root@k8s-master01 ~]# kubectl explain rs.spec
KIND:     ReplicaSet
VERSION:  apps/v1

RESOURCE: spec <Object>

DESCRIPTION:
     Spec defines the specification of the desired behavior of the ReplicaSet.
     More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

     ReplicaSetSpec is the specification of a ReplicaSet.

FIELDS:
   minReadySeconds	<integer>

   
   # 定义的pod 副本数,根据我们指定的值创建对应数量的pod
   replicas	<integer>

   # 用于匹配pod 的标签选择器
   selector	<Object> -required-

   # 定义Pod 的模板,基于这个模板定义的所有pod 是一样的
   template	<Object>
     

[root@k8s-master01 ~]# kubectl explain rs.spec.selector

# 查看replicaset 的spec.template 字段如何定义?
# 对于template 而言,其内部定义的就是pod,pod 模板是一个独立的对象
[root@k8s-master01 ~]# kubectl explain rs.spec.template
KIND:     ReplicaSet
VERSION:  apps/v1

RESOURCE: template <Object>

DESCRIPTION:
     Template is the object that describes the pod that will be created if
     insufficient replicas are detected. More info:
     https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#pod-template

     PodTemplateSpec describes the data a pod should have when created from a
     template

FIELDS:
   metadata	<Object>
     Standard object's metadata. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

   spec	<Object>
     Specification of the desired behavior of the pod. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

[root@k8s-master01 ~]# kubectl explain rs.spec.template.spec

[root@k8s-master01 ~]# kubectl explain rs.spec.template.spec.containers

[root@k8s-master01 ~]# kubectl explain rs.spec.template.spec.containers.ports

[root@k8s-master01 ~]# kubectl explain rs.spec.template.spec.containers.startupProbe

[root@k8s-master01 ~]# kubectl explain rs.spec.template.spec.containers.startupProbe.httpGet

        通过上面可以看到,ReplicaSet 资源中有两个spec 字段。第一个spec 声明的是ReplicaSet 定义多少个Pod 副本(默认将仅部署1 个Pod)、匹配Pod 标签的选择器、创建pod 的模板。第二个spec 是spec.template.spec:主要用于Pod 里的容器属性等配置。
        .spec.template 里的内容是声明Pod 对象时要定义的各种属性,所以这部分也叫做PodTemplate(Pod 模板)。还有一个值得注意的地方是:在 .spec.selector 中定义的标签选择器必须能够匹配到 spec.template.metadata.labels 里定义的Pod 标签,否则Kubernetes 将不允许创建ReplicaSet。

参考官方文档:ReplicaSet | Kubernetes

三、Replicaset 使用案例:部署 Guestbook 留言板 

把 frontend.tar.gz 上传到 node2 和 node1 上,解压

[root@k8s-node1 ~]# ctr -n=k8s.io images import frontend.tar.gz
[root@k8s-node1 ~]# ctr -n=k8s.io images import frontend.tar.gz

# 编写一个 ReplicaSet 资源清单
[root@k8s-master01 ~]# vim replicaset.yaml
apiVersion: apps/v1        # ReplicaSet 这个控制器属于的核心群组
kind: ReplicaSet           # 创建的资源类型
metadata:
  name: frontend           # 控制器的名字
  namespace: default
  labels:
    app: guestbook
    tire: frontend
spec:
  replicas: 3              # 管理的pod 副本数量
  selector:
    matchLabels: 
      tire1: frontend1
  template:                # 定义pod 的模板
    metadata: 
      labels:
        tire1: frontend1   # pod 标签,一定要有,这样上面控制器就能找到它要管理的pod 是哪些了
    spec:
      containers:          # 定义pod 里运行的容器
      - name: php-redis    # 定义容器的名字
        image: docker.io/yecc/gcr.io-google_samples-gb-frontend:v3
        imagePullPolicy: IfNotPresent
        ports:             # 定义端口
        - containerPort: 80 #定义容器暴露的端口
        startupProbe:
          periodSeconds: 5
          initialDelaySeconds: 20
          timeoutSeconds: 10
          httpGet:
            scheme: HTTP
            port: 80
            path: /
        livenessProbe:
          periodSeconds: 5 
          initialDelaySeconds: 20
          timeoutSeconds: 10
          httpGet:
            scheme: HTTP
            port: 80
            path: /
        readinessProbe:
          periodSeconds: 5 
          initialDelaySeconds: 20
          timeoutSeconds: 10
          httpGet:
            scheme: HTTP
            port: 80
            path: /      


[root@k8s-master01 ~]# kubectl apply -f replicaset.yaml

[root@k8s-master01 ~]# kubectl get rs
[root@k8s-master01 ~]# kubectl get pods

pod 的名字是由 控制器的名字-随机数 组成的:

我们删除一个 pod,看是否会自动恢复:

[root@k8s-master01 ~]# kubectl get pods -o wide 
NAME             READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
frontend-5qxtq   1/1     Running   0          5m47s   10.244.169.180   k8s-node2   <none>           <none>
frontend-sqrzl   1/1     Running   0          5m47s   10.244.169.179   k8s-node2   <none>           <none>
frontend-tzj55   1/1     Running   0          5m47s   10.244.36.99     k8s-node1   <none>           <none>

[root@k8s-master01 ~]# kubectl delete pods frontend-5qxtq 
pod "frontend-5qxtq" deleted

[root@k8s-master01 ~]# kubectl get pods -o wide 
NAME             READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
frontend-sqrzl   1/1     Running   0          6m43s   10.244.169.179   k8s-node2   <none>           <none>
frontend-txzg7   1/1     Running   0          29s     10.244.169.181   k8s-node2   <none>           <none>
frontend-tzj55   1/1     Running   0          6m43s   10.244.36.99     k8s-node1   <none>           <none>

四、Replicaset 管理 pod:扩容、缩容、更新

4.1 Replicaset 实现 pod 的动态扩容

        ReplicaSet 最核心的功能是可以动态扩容和回缩,如果我们觉得两个副本太少了,想要增加,只需要修改配置文件replicaset.yaml 里的replicas 的值即可,原来replicas: 3,现在变成replicaset:4,修改之后,执行如下命令更新: 

[root@k8s-master01 ~]# kubectl apply -f replicaset.yaml 
replicaset.apps/frontend configured
[root@k8s-master01 ~]# kubectl get pods -o wide 
NAME             READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
frontend-lwtzd   1/1     Running   0          42s   10.244.36.100    k8s-node1   <none>           <none>
frontend-sqrzl   1/1     Running   0          46m   10.244.169.179   k8s-node2   <none>           <none>
frontend-txzg7   1/1     Running   0          40m   10.244.169.181   k8s-node2   <none>           <none>
frontend-tzj55   1/1     Running   0          46m   10.244.36.99     k8s-node1   <none>           <none>
[root@k8s-master01 ~]# kubectl get rs
NAME       DESIRED   CURRENT   READY   AGE
frontend   4         4         4       46m

4.2 Replicaset 实现 pod 的动态缩容

        如果我们觉得4 个Pod 副本太多了,想要减少,只需要修改配置文件replicaset.yaml 里的
replicas 的值即可,把replicaset:4 变成replicas: 2,修改之后,执行如下命令更新: 

[root@k8s-master01 ~]# kubectl apply -f replicaset.yaml 
replicaset.apps/frontend configured
[root@k8s-master01 ~]# kubectl get rs
NAME       DESIRED   CURRENT   READY   AGE
frontend   2         2         2       49m
您在 /var/spool/mail/root 中有新邮件
[root@k8s-master01 ~]# kubectl get pods -o wide 
NAME             READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
frontend-sqrzl   1/1     Running   0          49m   10.244.169.179   k8s-node2   <none>           <none>
frontend-txzg7   1/1     Running   0          43m   10.244.169.181   k8s-node2   <none>           <none>

4.3 Replicaset 实现 pod 的更新

把 myapp-v2.tar.gz 上传到 node1 和 node2 上,手动解压

[root@k8s-node1 ~]# ctr -n=k8s.io images import myapp-v2.tar.gz
unpacking docker.io/ikubernetes/myapp:v2 (sha256:ebc427841ba631350f7b630bce441b21d11dd2e700f529bf7b33e3db7a329240)...done
[root@k8s-node2 ~]# ctr -n=k8s.io images import myapp-v2.tar.gz
unpacking docker.io/ikubernetes/myapp:v2 (sha256:ebc427841ba631350f7b630bce441b21d11dd2e700f529bf7b33e3db7a329240)...done

# 修改镜像 image,变成 docker.io/ikubernetes/myapp:v2
[root@k8s-master01 ~]# vim replicaset.yaml
    spec:
      containers:
      - name: php-redis
        image: docker.io/ikubernetes/myapp:v2
        imagePullPolicy: IfNotPresent

[root@k8s-master01 ~]# kubectl apply -f replicaset.yaml 
replicaset.apps/frontend configured

[root@k8s-master01 ~]# curl 10.244.169.179
<html ng-app="redis">
  <head>
    <title>Guestbook</title>
    <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">

        但是上面可以看到,虽然replicaset.yaml 修改了镜像,执行了kubectl apply -f replicaset.yaml,但是 pod 还是用的 frontend:v3 这个镜像,没有实现自动更新

# 需手动把10.244.169.179 这个 ip 对应的 pod 删除
[root@k8s-master01 ~]# kubectl delete pods frontend-sqrzl 
pod "frontend-sqrzl" deleted

# 重新生成了一个新的 pod:frontend-bmhz6
[root@k8s-master01 ~]# kubectl get pods -o wide 
NAME             READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
frontend-bmhz6   1/1     Running   0          29s   10.244.36.101    k8s-node1   <none>           <none>
frontend-txzg7   1/1     Running   0          53m   10.244.169.181   k8s-node2   <none>           <none>

# 新生成的pod 的镜像已经变成了myapp 的,说明更新完成了
[root@k8s-master01 ~]# curl 10.244.36.101
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

参考官方文档:ReplicaSet | Kubernetes 

4.4 总结

        生产环境如果升级,可以删除一个pod,观察一段时间之后没问题再删除另一个pod,但是这样需要人工干预多次;实际生产环境一般采用蓝绿发布,原来有一个rs(Replicaset)1,再创建一个rs2(控制器),通过修改service 标签,修改service 可以匹配到rs2 的控制器,这样才是蓝绿发布,这个也需要我们精心的部署规划,我们有一个控制器就是建立在rs 之上完成的,叫做 Deployment。这个控制器下一篇讲解!

上一篇文章:【云原生 | Kubernetes 实战】08、零故障升级之 Pod 健康探测——启动、存活、就绪探测_Stars.Sky的博客-CSDN博客

下一篇文章:【云原生 | Kubernetes 实战】10、K8s 控制器 Deployment 入门到企业实战应用(上)_Stars.Sky的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【云原生 的相关文章

随机推荐

  • 【深度好文】企业数字化转型的核心要素及能力架构分析

    数字化转型究竟是什么 首先我们还是摘录下百度词条上对数字化转型的一个简单说明如下 数字化转型是建立在数字化转换和数字化升级基础上 进一步触及公司核心业务 以新建一种商业模式为目标的高层次转型 数字化转型是开发数字化技术及支持能力以新建一个富
  • 72. Edit Distance

    Given two words word1 and word2 find the minimum number of steps required to convert word1 to word2 each operation is co
  • Self-attention计算方法

    三个矩阵 首先 Inputs为x1 x4 是一个sequence 每一个Input先通过一个Embedding 乘上一个Matrix得到 a1 a4 然后放入self attention 在self attention当中 每一个Input
  • Qt中的C++指针

    Qt中的C 指针 q ptr 在私有类中定义一个名字为q ptr 类型为公有类的数据指针 通过这个指针来访问公有类的数据 d ptr 在公有类中定义一个名字为d ptr 类型为私有类的数据指针 通过这个指针来访问私有类的数据 具体定义在qg
  • C语言

    要求设计的管理系统能够实现以下功能 1 每一条记录包括一个学生的学号 姓名 3个成绩 平时成绩 作业成绩 考试成绩 2 成绩录入功能 成绩信息用文件保存 可以一次完成若干条记录 3 成绩信息显示浏览功能 完成全部学生记录的显示 4 查询功能
  • elasticsearch 集群no known master node

    为什么80 的码农都做不了架构师 gt gt gt It is usually handled automatically If autodiscovery doesn t work Edit the elastic search conf
  • 装饰器在js中的实现原理

    在项目中总是能看到 connect Debounce 巴拉巴拉 通过百度才知道它叫做装饰器 装饰器有什么好 比如说 当我们写好了一个组件它叫做纯洁 当时在创造它的时候我们只想让它做一件事 但是突然有人告诉你我要加一个功能 可是我又不想让我的
  • 医学图像配准软件 ANTs(Advanced Normalization Tools)的安装和使用说明

    本文是关于医学图像配准软件 ANTs Advanced Normalization Tools 的安装和使用说明 ANTs ANTs 是 Advanced Normalization Tools 的缩写 是基于 C 语言的一个医学图像处理的
  • 利用openslide-python处理病理

    参考 博客总结https www jianshu com p bd5b572b5269 官方文档 https openslide org api python module openslide 获取元信息 如每个像素有多少微米 import
  • 杭电ACM 第2036题

    include
  • Linux 定时备份mysql数据并同步到其他mysql服务器中

    备份还原操作 导出数据库 usr bin mysqldump u root pwd database gt database sql 导入数据库 mysql u root p database lt database sql 备份到压缩文件
  • Android 实现WebView

    activity main xml
  • Git首次提交代码到仓库步骤(资料)

    第一步 登陆码云 第二步 创建一个 新的项目 第三步 创建成功后到这个页面 Git 全局设置 git config global user name 意米 git config global user email 142453222851
  • 数据结构<1>时间复杂度详解和leetcode例题

    文章目录 什么是时间复杂度和空间复杂度 前言 算法效率 时间复杂度的计算 空间复杂度的计算 oj练习 什么是时间复杂度和空间复杂度 前言 算法效率 算法效率分析分为两种 第一种是时间效率 第二种是空间效率 时间效率被称为时间复杂度 而空间效
  • Java与WCF交互(一):Java客户端调用WCF服务

    第一步 生成WCF服务 新建WCF解决方案 分别添加三个项目 HelloTimeService 类库 HelloTimehost 控制台程序 HelloTimeClient 控制台程序 项目结构如图 各个项目的主要代码 service Ho
  • 无人机的基本知识

    一 无人机的定义 无人驾驶飞机是指由动力驱动 不搭载操作人员的一种空中飞行器 它依靠空气动力为飞行器提供升力 能够自主或遥控飞行 能携带多种任务设备 执行多种任务 可一次性或多次重复使用的无人驾驶航空器 简称无人机 Unmanned Aer
  • Java Web JSP开发模型

    看之前先点赞 1 JSP开发模型 为了方便使用JSP技术 SUN公司玮JSP技术提供了两种开发模型 JSP Mode1 和 JSP Mode2 JSP Mode1 JSP Mode2 我们将按照Model2思想来完成用户注册功能 1 创建项
  • LUA延时控制

    LUA延时控制 与C 交互实现 其它可参考方式 Lua封装延时执行函数 LUA的延时调用功能 Sleep Function 与C 交互实现 通过C 提供Sleep函数给LUA调用即可 可以任意实现 比如超过5秒再提示相应倒计时功能 if f
  • 听说你搞过架构设计?来,我这里有个系统设计一下...

    V xin ruyuan0330 获得600 页原创精品文章汇总PDF 目录 一 前情提示 二 选择性订阅部分核心数据 三 RabbitMQ的queue与exchange的绑定回顾 四 direct exchange实现消息路由 五 按需订
  • 【云原生

    目录 K8s 控制器 Replicaset 一 Replicaset 控制器 概念 原理解读 1 1 Replicaset 概述 1 2 Replicaset 工作原理 如何管理 Pod 二 Replicaset 资源清单文件编写技巧 三