kubernetes k8s 控制器 Replicaset 配置管理

目录

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

1.1 Replicaset概述

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

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

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

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

文档中的YAML文件配置直接复制粘贴可能存在格式错误,故实验中所需要的YAML文件以及本地包均打包至网盘

链接:https://pan.baidu.com/s/18fetfpFNZdomYrCjLnkxpw 
提取码:4xy2 

作者:韩先超老师

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

1、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是基于模板来创建的。

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

#查看定义Replicaset资源需要的字段有哪些?

[root@xianchaomaster1 ~]# 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:

   apiVersion   <string>  #当前资源使用的api版本,跟VERSION:  apps/v1保持一致

   kind <string>     #资源类型,跟KIND: ReplicaSet保持一致

   metadata <Object> #元数据,定义Replicaset名字的

   spec <Object>     ##定义副本数、定义标签选择器、定义Pod模板

   status   <Object> #状态信息,不能改

#查看replicaset的spec字段如何定义?

[root@xianchaomaster1 ~]# 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>

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

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

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

#查看replicaset的spec.template字段如何定义?

#对于template而言,其内部定义的就是pod,pod模板是一个独立的对象

[root@xianchaomaster1 ~]# 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。PodTemplateSpec describes the data a pod should have when created from a

     template

FIELDS:

   metadata <Object>

   spec <Object>

[root@xianchaomaster1 ~]# kubectl explain rs.spec.template.spec

通过上面可以看到,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。

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

#把frontend.tar.gz上传到xianchaonode2和xianchaonode1上,解压

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

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

#编写一个ReplicaSet资源清单

[root@xianchaomaster1 rs]# cat replicaset.yaml

apiVersion: apps/v1

kind: ReplicaSet

metadata:

  name: frontend

  namespace: default

  labels:

    app: guestbook

    tier: frontend

spec:

  replicas: 3

  selector:

    matchLabels:

      tier1: frontend1

  template:

    metadata:

      labels:

        tier1: frontend1

    spec:

      containers:

      - 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@xianchaomaster1 ~]# kubectl apply -f replicaset.yaml

replicaset.apps/frontend created

[root@xianchaomaster1 ~]# kubectl get rs

NAME       DESIRED   CURRENT   READY   AGE

frontend      3          3            3        53m

[root@xianchaomaster1 ~]# kubectl get pods

NAME             READY   STATUS    RESTARTS   AGE

frontend-82p9b   1/1      Running   0            36m

frontend-j6twz    1/1       Running   0            36m

frontend-lcnq6    1/1       Running   0            36m

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

#资源清单详细说明

apiVersion: apps/v1  #ReplicaSet 这个控制器属于的核心群组

kind: ReplicaSet  #创建的资源类型

metadata:

  name: frontend  #控制器的名字

  labels:

    app: guestbook

    tier: frontend

spec:

  replicas: 3   #管理的pod副本数量

  selector:

    matchLabels:

      tier1: frontend1  #管理带有tier=frontend标签的pod

  template:  #定义pod的模板

    metadata:

      labels:

        tier1: frontend 1

#pod标签,一定要有,这样上面控制器就能找到它要管理的pod是哪些了

    spec:

      containers: #定义pod里运行的容器

      - name: php-redis #定义容器的名字

        image: yecc/gcr.io-google_samples-gb-frontend:v3

         ports:    #定义端口

- name: http  #定义容器的名字

containerPort:  80 #定义容器暴露的端口

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

#Replicaset实现pod的动态扩容

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

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

replicaset.apps/frontend configured

[root@xianchaomaster1 ~]# kubectl get rs

NAME       DESIRED   CURRENT   READY   AGE

frontend       4            4         4        62m

[root@xianchaomaster1 ~]# kubectl get pods

NAME             READY   STATUS    RESTARTS   AGE

frontend-82p9b    1/1     Running   0          62m

frontend-j6twz     1/1     Running   0          62m

frontend-kzjm7    1/1     Running   0          33s

frontend-lcnq6    1/1     Running   0          62m

     

#Replicaset实现pod的动态缩容

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

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

replicaset.apps/frontend configured

[root@xianchaomaster1 ~]# kubectl get rs

NAME       DESIRED   CURRENT   READY   AGE

frontend   2         2         2       70m

[root@xianchaomaster1 ~]# kubectl get pods

NAME             READY   STATUS    RESTARTS   AGE

frontend-j6twz   1/1     Running   0          70m

frontend-lcnq6   1/1     Running   0          70m

#Replicaset实现pod的更新

#把myapp-v2.tar.gz上传到xianchaonode1和xianchaonode2上,手动解压

[root@xianchaonode1 ~]# ctr -n=k8s.io images import  myapp-v2.tar.gz

[root@xianchaonode2 ~]# ctr -n=k8s.io images import  myapp-v2.tar.gz

vim replicaset.yaml

修改镜像,变成ikubernetes/myapp:v2

[root@xianchaomaster1]# kubectl apply -f replicaset.yaml

[root@xianchaomaster1 ~]# kubectl get pods -o wide

NAME             READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES

frontend-glb2c   1/1     Running   0          34s   10.244.209.133   xianchaonode1            

frontend-lck9t   1/1     Running   0          34s   10.244.187.74    xianchaonode2                 

[root@xianchaomaster1 ~]# curl 10.244.209.133

div style="width: 50%; margin-left: 20px">

 <h2>Guestbook</h2>

[root@xianchaomaster1 ~]# curl 10.244.209.74

div style="width: 50%; margin-left: 20px">

 <h2>Guestbook</h2>

 

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

#10.244.209.133这个ip对应的pod删除

[root@xianchaomaster1 ~]# kubectl delete pods frontend-glb2c

pod "frontend-glb2c" deleted

[root@xianchaomaster1 ~]# kubectl get pods -o wide

NAME             READY   STATUS    RESTARTS   AGE     IP              NODE      

frontend-hkhdw   1/1     Running   0          15s     10.244.187.75   xianchaonode2  

frontend-lck9t   1/1     Running   0          2m37s   10.244.187.74   xianchaonode2  

#重新生成了一个新的pod:frontend-hkhdw

[root@xianchaomaster1 ~]# curl 10.244.187.75

Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

#新生成的pod的镜像已经变成了myapp的,说明更新完成了

总结:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CUDA编程00 - 配置CUDA开发环境

第一步&#xff1a;在一台装有Nvidia显卡和驱动的机器上&#xff0c;用nvidia-smi命令查看显卡所支持cuda版本 第二步&#xff1a; 到Nvidia官网下载CUDA Toolkit并安装&#xff0c;CUDA Toolkit Archive | NVIDIA Developer 安装时按提示下一步即可&#xff0c;安装完成用 nv…

【Harmony】SCU暑期实训鸿蒙开发学习日记Day1

关于ArkTS和ArkUI&#xff0c;基础语法请看&#x1f449;官方开发手册 系统学习后&#xff0c;聊聊几个点&#xff0c;面向刚学习这门语言的小白&#xff0c;用于巩固和回顾&#x1f60b; 目录 类型推断应用 函数相关 布局方式 线性布局 堆叠布局 网格布局 弹性布局 …

补充.IDEA的使用

首先我们要了解在idea中Java工程由项目&#xff08;project&#xff09;、模块&#xff08;module&#xff09;包&#xff08;package&#xff09;、类&#xff08;class&#xff09;组成。 他们之间的关系是project包含module包含package包含class。 所以我们要按照先建一个pr…

睡前故事—绿色科技的未来:可持续发展的梦幻故事

欢迎来到《Bedtime Stories Time》。这是一个我们倾听、放松、并逐渐入睡的播客。感谢你收听并支持我们&#xff0c;希望你能将这个播客作为你睡前例行活动的一部分。今晚我们将讲述绿色科技的未来&#xff1a;可持续发展的梦幻故事的故事。一个宁静的夜晚&#xff0c;希望你现…

1千多看图猜成语游戏ACCESS\EXCEL数据库

今天闲来无事想写个代码自己搞定&#xff0c;我不写代码已经很久了&#xff0c;主要是年纪不小了对新技术的学习比较吃力&#xff0c;兴趣也被生活打磨的体无完肤。今天又捡起VB&#xff08;暴露了年纪&#xff09;搞了一下。 当然&#xff0c;很多事情都是这样&#xff0c;自己…

PySide(PyQt)判断QLineEdit的输入是否合规

判断QLineEdit的输入是否符合要求&#xff0c;比如是否为整数或者浮点数。 1、使用正则表达式来判断 符合正则表达式则输入合规 import sys import re from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLineEdit, QLabelclass ExampleWidget(QWidget):…

一个用于管理多个 Node.js 版本的安装和切换开源工具

大家好&#xff0c;今天给大家分享一个用于管理多个Node.js版本的工具 NVM&#xff08;Node Version Manager&#xff09;&#xff0c;它允许开发者在同一台机器上安装和使用不同版本的Node.js&#xff0c;解决了版本兼容性问题&#xff0c;为开发者提供了极大的便利。 在开发环…

Kafka深入解析

一、kafka存储结构 1.kafka为什么使用磁盘作为存储介质 2.分析文件存储格式 3.快速检索消息 1.kafka存储结构 Kafka 的基本存储单元是分区&#xff08;partition&#xff09; &#xff08;1&#xff09;每个partition相当于一个大文件被平均分配到多个大小相等的segment段(数…

【Godot4.2】MLTag类:HTML、XML通用标签类

概述 HTML和XML采用类似的标签形式。 之前在Godot中以函数库形式实现了网页标签和内容生成。能用&#xff0c;但是缺点也很明显。函数之间没有从属关系&#xff0c;但是多有依赖&#xff0c;而且没有划分出各种对象和类型。 如果以完全的面向对象形式来设计标签类或者元素类…

stm32精密控制步进电机(升级篇)

这一篇文章里会深入的对步进电机控制方法进行论述 如何避免步进电机丢转的问题 1.机械结构&#xff1a;排查一下传动的问题&#xff0c;举个例子&#xff0c;我的毕设里大臂机械臂的步进电机有时会有丢转问题&#xff0c;造成无法运动到指定位置&#xff0c;后面发现是因为皮带…

爬虫代理访问超时怎么解决?

一、为什么会出现访问超时 爬虫使用代理可能会遇到访问超时的情况&#xff0c;主要和以下几个方面有关&#xff1a; 1.代理服务器性能&#xff1a; 代理服务器作为中间层&#xff0c;承担着转发请求和响应的任务。如果代理服务器性能不佳或超载&#xff0c;请求的响应时间可能…

ELK日志管理

文章目录 一、ELK概述什么是ELK?为什么使用ELK&#xff1f;ELK的工作原理 二、安装部署ELK前期准备安装部署Elasticsearch 软件修改系统配置安装插件在应用服务器上部署 Logstash安装 kibana 一、ELK概述 什么是ELK? 通俗来讲&#xff0c;ELK 是由 Elasticsearch、Logstash…

LeetCode热题100刷题16:74. 搜索二维矩阵、33. 搜索旋转排序数组、153. 寻找旋转排序数组中的最小值、98. 验证二叉搜索树

74. 搜索二维矩阵 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int row matrix.size();int col matrix[0].size();for(int i0;i<row;i) {//先排除一下不存在的情况if(i>0&&matrix[i][0]>target…

计算机网络——网络层(路由选择协议、路由器工作原理、IP多播、虚拟专用网和网络地址转换)

目录 路由选择协议 因特网的路由选择协议特点 路由信息协议RIP RIP衡量目的网络距离 RIP选择路由器的方式 RIP具有以下三个重要特点 RIP的基本工作流程 RIP的距离向量算法 ​编辑 ​编辑 RIP存在的问题——“坏消息传播得慢” RIP的封装 开放最短路径优先协议OSPF…

重学PyTorch,粗略笔记(二)dataset,dataloader

dataset 对于单个样本 dataloader 批量样本 Dataset 存储样本和它们相应的标签&#xff0c;DataLoader 在 Dataset 基础上添加了一个迭代器&#xff0c;迭代器可以迭代数据集&#xff0c;以便能够轻松地访问 Dataset 中的样本(变为mini-batch形式&#xff0c;多个样本组合成…

自动驾驶车道线检测系列—3D-LaneNet: End-to-End 3D Multiple Lane Detection

文章目录 1. 摘要概述2. 背景介绍3. 方法3.1 俯视图投影3.2 网络结构3.2.1 投影变换层3.2.2 投影变换层3.2.3 道路投影预测分支 3.3 车道预测头3.4 训练和真实值关联 4. 实验4.1 合成 3D 车道数据集4.2 真实世界 3D 车道数据集4.3 评估结果4.4 评估图像仅车道检测 5. 总结和讨论…

怎样在 PostgreSQL 中优化对多表关联的连接条件选择?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 怎样在 PostgreSQL 中优化对多表关联的连接条件选择一、理解多表关联的基本概念二、选择合适的连接条件…

深入解析HTTPS与HTTP

在当今数字化时代&#xff0c;网络安全已成为社会各界关注的焦点。随着互联网技术的飞速发展&#xff0c;个人和企业的数据安全问题日益凸显。在此背景下&#xff0c;HTTPS作为一种更加安全的通信协议&#xff0c;逐渐取代了传统的HTTP协议&#xff0c;成为保护网络安全的重要屏…

vue 实现下拉框的数据是树状结构

页面显示效果 vue实现代码 <el-form-item label"公司名称" prop"comName"><el-select ref"select" v-model"queryParams.comName" placeholder"请选择公司名称" clearable size"small"change"handl…

智慧医院智能导诊系统源码,智慧导诊小程序源码,采用前端框架:Uniapp+后端框架:springboot+移动端:微信小程序、H5自主研发

智慧导诊系统是一种基于人工智能和大数据技术的医疗辅助系统&#xff0c;旨在提高患者的就医效率和医院的管理效率。以下是对智慧导诊系统的详细解析&#xff1a; 定义与功能 智慧导诊系统通过自然语言处理、机器学习等技术&#xff0c;自动分析患者的病情及伴随症状&#xf…