【云原生 | Kubernetes 实战】09、K8s 控制器 Replicaset 入门到企业实战应用

news2024/10/7 10:18:38

目录

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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第16章 母函数

第16章 母函数 母函数是离散数学领域最意外、最有用的发明之一。粗略来讲&#xff0c;母函数将序列问题转化为代数问题。 组合数学中常常出现普通型母函数、指数型母函数、狄利克雷型母函数 16.1 无穷级数 通俗地说,母函数F(x)就是无穷级数 符号[xnx^nxn]F(x)表示母函数F(x…

策略模式学习

0.引言 最近想整理一下代码。我的想法是使用继承的方案&#xff0c;使用多态写一个interface&#xff0c;然后不同的方法来继承它。最近ChatGPT比较火&#xff0c;顺便问了一下它&#xff1a; 在C代码设计中&#xff0c;我对同一算法设计了不同的实现&#xff0c;例如计算平均…

使用 Web 应用程序示例在 Java 中进行安全编码

使用 Web 应用程序示例在 Java 中进行安全编码 使用 Java 中的 Online Shop Web 应用程序示例了解最常见的漏洞以及如何避免它们 课程英文名&#xff1a;Secure coding Dive into Injections with Java & Spring boot 此视频教程共36.0小时&#xff0c;中英双语字幕&…

1x9 Dual SC Optical Transceivers

1、Pin Assignment & Description TD, TD-: DC coupled LVPECL inputs for the transmitter. 50Ω differential lines. RD, RD-: Open-emitter out circuits. DC coupled LVPECL outputs for the receiver. 50Ω differential lines. SD: Signal Detect. Normal opti…

【工业控制】多变量动态矩阵预测控制(DMC)【含Matlab源码 1499期】

⛄一、简介&#xff08;附课程报告&#xff09; 1引言 众所周知&#xff0c;上世纪 60 年代初形成的现代控制理论在航空、航天等领域取得了辉煌的成果。 然而人们不久就发现在完美的理论与控制之间还存在着巨大的鸿沟。主要表现在以下几个方面: 1.现代控制理论的基点是对象精确…

OneHotEncoder独热编码

首先了解机器学习中的特征类别&#xff1a;连续型特征和离散型特征。 拿到获取的原始特征&#xff0c;必须对每一特征分别进行归一化&#xff0c;比如&#xff0c;特征A的取值范围是[-1000,1000]&#xff0c;特征B的取值范围是[-1,1].如果使用logistic回归&#xff0c;w1*x1w2…

Docker-compose编排

一、Docker Compose前言 Docker Compose的前身是Fig&#xff0c;Fig被Docker收购之后正式更名为Compose&#xff0c;Compose向下兼容Fig Docker Compose是一个用于定义和运行多容器Docker应用的工具&#xff0c;只需要一个Compose的配置文件和一个简单的命令就可以创建并运行应…

STC 51单片机61——呼吸灯

#include "reg52.h" sbit LedHuxi1P1^0; #define time (65536-1000) // 单次定时1ms unsigned char T_High, T, ti, dir; void InitTimer0(void) { TMOD0x01; TL0 time; //initial timer1 low byte TH0 time >> 8; …

从来没有一家互联网公司不问【设计模式+SSM框架底层源码】

结构型模式 创建型模式 行为型模式 六大原则 免费分享学习设计模式整理的学习笔记文档 Spring5源码解读 **其实&#xff0c;学习编程不是学习配置东西&#xff0c;然后写编程套路。写程序最重要的是你能心中有自己的一套架构思路&#xff0c;比如我现在就没有写Java的项目…

还在公域流量里面投入大量广告费而无法变现,不如试试私域流量吧

大家好&#xff0c;我是林工&#xff0c;不知道大家听说过私域流量这个词没有&#xff0c;听起来是一个听起来很模糊的概念。很多人都知道它大概的意思&#xff0c;但具体要落实到“私域流量怎么做”这件事情上&#xff0c;大都都是一问三不知&#xff0c;不知道该如何入手。 其…

艾美捷魔力红组织蛋白酶B活性分析试剂盒研究手册

艾美捷ICT魔力红组织蛋白酶B活性分析试剂盒包含&#xff1a; 套件937:25测试 魔红基质&#xff08;MR-RR2&#xff09;&#xff0c;1 25测试小瓶&#xff0c;#6133 Hoechst 33342&#xff0c;1毫升&#xff0c;#639 吖啶橙&#xff0c;0.5 mL&#xff0c;#6130 工具包手册…

低版本docker cp报错Error: Path not specified未指定路径解决办法

大概就是版本过低。此时我们可以通过另外得途径解决 1&#xff1a;查找启动容器得id docker inspect -f ‘{{.Id}}’ 40e8c27c975f 例如我这里找es得 2&#xff1a;进入到docker容器挂在到本地得共享盘地址 一般就事 以我得乌班图为例 /var/lib/docker rootubuntu:/var/lib/do…

Android动画 补间动画

目录 1.什么是补间动画 2.XML实现方式 3.代码实现方式 4.展现形式 1.什么是补间动画 补间动画&#xff1a;属于Android中View动画的一种&#xff0c;就是涵盖了 平移、缩放、旋转 和 透明度四种变化的动画。实现方式有两种&#xff1a;xml文件 和 java代码。 四种补间动…

[附源码]计算机毕业设计大学生志愿者服务管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

擎创技术流 | ClickHouse实用工具—ckman教程(6)

哈喽~小伙伴们&#xff0c;今天依旧是每一周一期的技术分享~ 关于“ckman”的技术分享已经第6期了&#xff0c;大家是不是跟小编一样收获颇丰&#xff1f;新知识虽然新鲜有趣&#xff0c;但也别忘了回顾旧知识巩固基础噢~↓↓↓ 擎创技术流 | ClickHouse实用工具—ckman教程&…

10万字208道Java经典面试题总结(附答案)

前言 最近有很多粉丝问我&#xff0c;有什么方法能够快速提升自己&#xff0c;通过阿里、腾讯、字节跳动、京东等互联网大厂的面试&#xff0c;我觉得短时间提升自己最快的手段就是背面试题&#xff0c;最近总结了Java常用的面试题&#xff0c;分享给大家&#xff0c;希望大家都…

[附源码]Python计算机毕业设计SSM基于微信平台的车险投保系统设计与实现(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

VINS、MAVROS等的坐标系统一(草稿,未得出明确结果)

由于不同算法之间的坐标系不同&#xff0c;导致计算的结果混乱&#xff0c;该博客的目的是记录和统一不同算法之间的坐标系&#xff0c;保证坐标系的统一 一、VINS算法 vins算法&#xff0c;使用D435I相机。该坐标方向为&#xff1a;右前上分别为xyz。角度&#xff1a;由于是四…

SpringBoot+Vue实现前后端分离的心理咨询系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

代码随想录刷题记录 day38 最后一块石头的重量+目标和+1和0

代码随想录刷题记录 day38 最后一块石头的重量目标和1和0 参考&#xff1a;代码随想录 1049. 最后一块石头的重量 II 思想 把数组的石头尽可能地分成大小相等地两个集合 即sum/2&#xff1b; 容量为sum/2地背包尽可能地装满石头。 代码 class Solution {public int last…