当前位置: 首页 > news >正文

学习笔记二十二:K8s控制器Replicaset

K8s控制器Replicaset

  • Replicaset控制器:概念、原理解读
    • Replicaset概述
    • Replicaset工作原理:如何管理Pod
      • Replicaset控制器三个组成部分
  • Replicaset资源清单文件编写技巧
  • Replicaset使用案例:部署Guestbook留言板
      • 编写一个ReplicaSet资源清单
      • 资源清单详细说明
  • Replicaset管理pod:扩容、缩容、更新
    • Replicaset实现pod的动态扩容
    • Replicaset实现pod的动态缩容
    • Replicaset实现pod的更新
  • 生产环境升级

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

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

Replicaset概述

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

Replicaset工作原理:如何管理Pod

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

Replicaset控制器三个组成部分

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

Replicaset资源清单文件编写技巧

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

kubectl explain rs
KIND:     ReplicaSet
VERSION:  apps/v1
DESCRIPTION:ReplicaSet ensures that a specified number of pod replicas are running atany given time.
FIELDS:apiVersion	<string>  #当前资源使用的api版本,跟VERSION:  apps/v1保持一致kind	<string>     #资源类型,跟KIND: ReplicaSet保持一致metadata	<Object> #元数据,定义Replicaset名字的spec	<Object>     ##定义副本数、定义标签选择器、定义Pod模板status	<Object> #状态信息,不能改

查看replicaset的spec字段如何定义

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-statusReplicaSetSpec is the specification of a ReplicaSet.
FIELDS:minReadySeconds	<integer>replicas	<integer>  #定义的pod副本数,根据我们指定的值创建对应数量的podselector	<Object> -required-  #用于匹配pod的标签选择器template	<Object>      #定义Pod的模板,基于这个模板定义的所有pod是一样的

查看replicaset的spec.template字段如何定义
对于template而言,其内部定义的就是pod,pod模板是一个独立的对象

kubectl explain rs.spec.template

通过上面可以看到,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使用案例:部署Guestbook留言板

把frontend.tar.gz上传到节点服务器上
链接:https://pan.baidu.com/s/1yz4mpX3EilhgKyYbMXgM0Q?pwd=zk9n
提取码:zk9n

ctr -n=k8s.io images import  frontend.tar.gz

编写一个ReplicaSet资源清单

cat replicaset.yaml 
apiVersion: apps/v1
kind: ReplicaSet
metadata:name: frontendnamespace: defaultlabels:app: guestbooktier: frontend
spec:replicas: 3selector:matchLabels:tier1: frontend1template:metadata: labels: tier1: frontend1spec:containers:- name: php-redisimage: docker.io/yecc/gcr.io-google_samples-gb-frontend:v3imagePullPolicy: IfNotPresentports:- containerPort: 80startupProbe:periodSeconds: 5initialDelaySeconds: 20timeoutSeconds: 10httpGet:scheme: HTTPport: 80path: /livenessProbe:periodSeconds: 5initialDelaySeconds: 20timeoutSeconds: 10httpGet:scheme: HTTPport: 80path: /readinessProbe:periodSeconds: 5initialDelaySeconds: 20timeoutSeconds: 10httpGet:scheme: HTTPport: 80path: /
kubectl apply -f replicaset.yaml 
kubectl get rs
NAME       DESIRED   CURRENT   READY   AGE
frontend      3          3            3        53m
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: guestbooktier: frontend
spec:replicas: 3   #管理的pod副本数量selector:matchLabels:tier1: frontend1  #管理带有tier=frontend标签的podtemplate:  #定义pod的模板metadata:labels:tier1: frontend 1
#pod标签,一定要有,这样上面控制器就能找到它要管理的pod是哪些了spec:containers: #定义pod里运行的容器- name: php-redis #定义容器的名字image: yecc/gcr.io-google_samples-gb-frontend:v3ports:    #定义端口
- name: http  #定义容器的名字
containerPort:  80 #定义容器暴露的端口

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

Replicaset实现pod的动态扩容

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

kubectl apply -f replicaset.yaml 
kubectl get rs
NAME       DESIRED   CURRENT   READY   AGE
frontend       4            4         4        62m
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,修改之后,执行如下命令更新:

kubectl apply -f replicaset.yaml 
kubectl get rs
NAME       DESIRED   CURRENT   READY   AGE
frontend   2         2         2       70m 
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上传到节点服务器
链接:https://pan.baidu.com/s/1RsBdDrhSkR5kZAxbDznlXw?pwd=op8h
提取码:op8h

ctr -n=k8s.io images import  myapp-v2.tar.gz

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

vim replicaset.yaml

在这里插入图片描述

kubectl apply -f replicaset.yaml
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   k8s1             
frontend-lck9t   1/1     Running   0          34s   10.244.187.74    k8s2          
curl 10.244.209.133
div style="width: 50%; margin-left: 20px"><h2>Guestbook</h2>
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删除

kubectl delete pods frontend-glb2c
 kubectl get pods -o wideNAME             READY   STATUS    RESTARTS   AGE     IP              NODE       
frontend-hkhdw   1/1     Running   0          15s     10.244.187.75   k8s2   
frontend-lck9t   1/1     Running   0          2m37s   10.244.187.74   k8s2   

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

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

相关文章:

学习笔记二十二:K8s控制器Replicaset

K8s控制器Replicaset Replicaset控制器&#xff1a;概念、原理解读Replicaset概述Replicaset工作原理&#xff1a;如何管理PodReplicaset控制器三个组成部分 Replicaset资源清单文件编写技巧Replicaset使用案例&#xff1a;部署Guestbook留言板编写一个ReplicaSet资源清单资源清…...

2023-10-25 精神分析-领悟新技术的错误做法-持续数年的错误做法-记录与分析

摘要: 过去数年对于领悟技术, 采取的做法不能说是对达到目的毫无裨益&#xff0c;但是对突破技术和将技术融为自身这个目的来说, 没有达到。 而且随着时间的流逝, 过去已经熟悉的技术, 竟然会被忘掉&#xff01;就像是没有涉猎过一样&#xff01; 根本原因出在对技术的领悟的…...

Arrays 中的 asList()方法

public static <T> List<T> asList&#xff08; T . . . a &#xff09;{ return new ArrayList<>&#xff08;a&#xff09;&#xff1b; } 返回由指定数组支持的固定大小的 list集合。对数组所做的更改将在返回的 l…...

基于自动化工具autox.js的抢票(猫眼)

1.看到朋友圈抢周杰伦、林俊杰演唱会票贼难信息,特研究了一段时间,用autox.js写了自动化抢票脚本,购票页面自动点击下单(仅限安卓手机)。 2.脚本运行图 3.前期准备工作 (1)autox.js社区官网:AutoX.js (2)b站上学习资料:10分钟学会AutoX.js hello world_哔哩哔哩_bi…...

Java架构师内功计算机网络

目录 1 导学2 网络功能和分类3 OSI七层模型3.1 局域网和广域网协议4 TCP/IP协议5 通信技术和交换技术5.1 通信技术5.2 交换技术5.2.1 路由技术5.2.2 传输介质6 通信方式和交换方式7 IP地址7.1 IP地址表示7.2 子网划分8 IPv69 网络规划与设计10 网络存储技术10.1 廉价磁盘几余阵…...

vue 中 mixin 和 mixins 区别

目录 前言 用法 全局Mixin 局部Mixin 代码 理解 高质量的Mixin使用 在Vue.js框架中&#xff0c;Mixin是一种非常重要和强大的功能&#xff0c;它允许开发者创建可复用的代码片段&#xff0c;并将其应用到一个或多个组件中。Vue提供了两种方式来使用Mixin&#xff0c;分别…...

reqable(小黄鸟)+雷电抓包安卓APP

x 下载证书保存到雷电模拟器根目录(安装位置) 为什么? Android7以上&#xff0c;系统允许每个应用可以定义自己的可信CA集&#xff0c;部分的应用默认只会信任系统预装的CA证书&#xff0c;而不会信任用户安装的证书&#xff0c;之前的方法安装Burp/Fiddler证书都是用户证书…...

高等数学啃书汇总重难点(七)微分方程

同济高数上册的最后一章&#xff0c;总的来说&#xff0c;这篇章内容依旧是偏记忆为主&#xff0c;说难不难说简单不简单&#xff1a; 简单的是题型比较死&#xff0c;基本上就是记公式&#xff0c;不会出现不定积分一般花样繁多的情况&#xff1b;然而也就是背公式并不是想的…...

阿里云对象存储OSS文件无法预览,Bucket设置了Referer

您发起的请求头中没有Referer字段或Referer字段为空&#xff0c;与请求Bucket设置的防盗链策略不相符。 解决方案 您可以选择以下任意方案解决该问题。 在请求中增加Referer请求头。 GET /test.txt HTTP/1.1 Date: Tue, 20 Dec 2022 08:48:18 GMT Host: BucketName.oss-examp…...

数字孪生技术:工业数字化转型的引擎

数字孪生是一种将物理实体数字化为虚拟模型的技术&#xff0c;这些虚拟模型与其物理对应物相互关联。这种虚拟模型通常是在数字平台上创建的&#xff0c;它们复制了实际设备、工厂、甚至整个供应链的运作方式。这使工业企业能够实现以下益处&#xff1a; 1. 实时监测和分析 数…...

算法刷题-哈希表

算法刷题-哈希表 242. 有效的字母异位词 给定两个字符串 *s* 和 *t* &#xff0c;编写一个函数来判断 *t* 是否是 *s* 的字母异位词。 **注意&#xff1a;**若 *s* 和 *t* 中每个字符出现的次数都相同&#xff0c;则称 *s* 和 *t* 互为字母异位词。 思路 用一个哈希表来记…...

2023NOIP A层联测17 黑暗料理

题目大意 给出一个长度为 n n n的序列 a i a_i ai​&#xff0c;要求删去若干个数&#xff0c;使得剩下的数中任意两个数都不是质数。在满足条件的情况下最多能保留几个数。 有 T T T组数据。 1 ≤ T ≤ 4 , 1 ≤ n ≤ 750 , 1 ≤ a i ≤ 1 0 9 1\leq T\leq 4,1\leq n\leq 75…...

关于nacos的配置获取失败及服务发现问题的排坑记录

nacos配置更新未能获取到导致启动报错 排查思路&#xff1a; 1、是否添加了nacos的启动pom依赖 参考&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><…...

【QT】其他常用控件1

新建项目 scrollArea 滚动 toolBox 插入 tabWidget stackedWidget 切换 索引是0 运行后&#xff0c;没有切换按钮&#xff0c;结合pushbutton&#xff0c;加两个Button 代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent)…...

交换机/防火墙-基础配置-23.10.11

update 优化了目录逻辑 -10.24.2023 一.前置知识 1.MAC地址 交换机在给主机之间传递信息包时&#xff0c;通过MAC地址来标识每台主机 主机间发生信息包交换时&#xff0c;交换机就会将通信过的主机的mac地址存下 dis mac-address 交换机转发的数据包中&#xff0c;会包含一…...

alibaba.fastjson的使用(四)-- Json字符 与 JsonObject 的相互转化

目录 1. Json字符串转JsonObject 2. JsonObject转Json字符串 1. Json字符串转JsonObject 使用到的方法1: static JSONObject parseObject(String text) 使用到的方法2: public String getString(String key) /*** 将Json字符串转为JsonObject对象* 取值不存在时,返回null…...

linux 主机通信 ipv6 配置

1.检查系统内核是否支持IPv6协议&#xff1a; 在Linux控制台中运行下列命令&#xff1a; cat /proc/sys/net/ipv6/conf/all/disable_ipv6如果返回结果是0&#xff0c;就表明系统支持IPv6协议&#xff1b;若是1&#xff0c;则表明系统目前不支持IPv6协议&#xff1b; 2.禁用I…...

【JavaEE】初识计算机网络(TCP/IP五层模型及封装和分用)

一、 网络通信基础 网络互连的目的是进行网络通信&#xff0c;也即是网络数据传输&#xff0c;更具体一点&#xff0c;是网络主机中的不同进程间&#xff0c;基于网络传输数据。 那么&#xff0c;在组建的网络中&#xff0c;如何判断到底是从哪台主机&#xff0c;将数据传输到…...

在nodejs中实现实时通信的几种方式

在nodejs中实现实时通信的几种方式 在当今世界中&#xff0c;实时通信至关重要。无论是聊天应用程序还是实时体育更新&#xff0c;实时通信都是保持用户活跃度所必需的。Node.js 因其速度、可扩展性和可靠性而成为开发实时应用程序的流行工具。在本文中&#xff0c;我们将探讨…...

【tg】 7 GroupInstanceCustomImpl

group GroupInstanceCustomImpl 核心GroupInstanceCustomInternal G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\group\GroupInstanceCustomImpl.h 最核心是是GroupInstanceCustomInternal: private:std::shared_ptr<Threads> _threads;std::u…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...