28-k8s集群中-StatefulSets控制器(进阶知识)

一、statefullsets控制器概述

1,举例

        假如,我们有一个deployment资源,创建了3个nginx的副本,对于nginx来讲,它是不区分启动或者关闭的先后顺序的,也就是“没有特殊状态”的一个服务,也成“无状态服务”,3个副本,谁先启动、谁后启动都没有关系,它只是用来web服务分发使用的一个工具而已;

        那么反之,有没有需要有启动顺序、关闭顺序这样的“有状态服务”呐?答案肯定是有啊;

        【访问顺序问题】,再假如,再企业当中,的MySQL主从数据库架构中,假设是2主1从数据架构,架构本身是区分master和slave角色的,在构建主从关系的时候,master必须先启动,不然slave没办法加入到主从架构中,所以需要有相同副本服务启动的先后顺序;

        【副本独立的存储问题】,我们知道,MySQL是不能多服务共享数据目录的,所以在拉去多副本的“有状态服务”时,存储独立化就成了问题,也就是说,一个pod副本对应一个单独的存储目录。

        【固定的访问地址问题】,还拿MySQL做举例,我们需要对有状态服务,有固定寻址的能力,我们知道,pod删除重新拉取后,ip就会发生变化,那么对于mysql服务来说,副本的每个pod都需要有精准的、不变的唯一标识,不然主从架构等问题,一旦重新新启动pod,就会彻底摧毁架构,也就是说pod副本删除重新拉取后,能够精准的找到对应原来的服务;

2,总结:

        对于同一个deployment或者其他资源创建的pod副本,我们在使用“有状态服务”的副本pod时,有着三个需求:

        1,副本启动、停止要求有顺序;

        2,每个副本需要有独立的存储目录空间;

        3,副本重新拉起,能够有方式在其改变ip的情况下还能精准的找到对应副本;

那么以上,也是statefulsets控制器能够解决的问题;

二、启停顺序与headless网络唯一标识

1,创建一个“无头”svc资源

· 编辑无头服务svc资源清单

无头svc服务,就是没有ClusterIP的svc资源;

[root@k8s231 statefulsets]# cat headless.yaml 
apiVersion: v1
kind: Service
metadata:
  name: xinjizhiwa-headless
spec:
  ports:
  - port: 80
    name: web
  # 将clusterIP字段设置为None表示为一个无头服务headless,即svc将不会分配VIP。
  clusterIP: None
  selector:
    k8s: xinjizhiwa

· 创建无头svc服务

[root@k8s231 statefulsets]# kubectl apply -f headless.yaml

2,创建statefullsets使用无头服务

· 编辑statefulsets资源清单

声明使用无头svc

[root@k8s231 statefulsets]# vim staefulsets.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: xinjizhiwa-web
spec:
  selector:
    matchLabels:
      k8s: xinjizhiwa
  #声明无头服务的service;
  serviceName: xinjizhiwa-headless
  replicas: 3 
  template:
    metadata:
      labels:
        k8s: xinjizhiwa
    spec:
      containers:
      - name: c1
        image: nginx:1.20.1-alpine
 

· 创建statefulsets资源

[root@k8s231 statefulsets]# kubectl apply -f staefulsets.yaml

3,验证无头服务机启停顺序

· 查看pod

发现破的名称,是按照statefulsets资源的名称加上数字顺序排列生成的;

[root@k8s231 statefulsets]# kubectl get pods -o wide

· 查看无头svc

[root@k8s231 statefulsets]# kubectl get svc

· 创建一个用来测试【pod网络唯一标识 】的pod容器

[root@k8s231 statefulsets]# kubectl run -it dns-test --rm --image=alpine:latest -- sh

/ #

/ # for i in `seq 0 2`;do ping xinjizhiwa-web-${i}.xinjizhiwa-headless.default.svc.xinjizhiwa.com -c3;done

网路唯一标识:

        【pod的名称】.【无头服务的名称】.【名称空间】.【svc】.【集群DNS域名】

拓展:这个就是集群DNS域名的所在位置,可以通过这里来查看;

[root@k8s231 deploy]# vim /var/lib/kubelet/config.yaml 

.......
clusterDNS:
- 10.200.0.10
clusterDomain: xinjizhiwa.com
 

· 删除pod重新拉起,在ping唯一标识,测试结果

[root@k8s231 deploy]# kubectl delete pods --all

删除pod,等待重新拉取

· 结论

通过ping唯一标识,ping通后,删除pod,在ping唯一标识还可以ping通,查看pod的ip已经重新拉起后改变了,可还是ping通了,就证明,唯一标识成功;

三、StatefulSets副本独立存储

1,创建一个无头服务

[root@k8s231 vol]# vim headless.yaml

apiVersion: v1
kind: Service
metadata:
  name: xjzw-headless
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    k8s: xjzw

[root@k8s231 vol]# kubectl apply -f headless.yaml

查看无头svc

[root@k8s231 vol]# kubectl get svc

2,创建StatefulSets资源

声明独立存储

[root@k8s231 vol]# cat statefulset.yaml 
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: xjzw-web
spec:
  selector:
    matchLabels:
      k8s: xjzw
  serviceName: xjzw-headless
  replicas: 3 
  #声明创建pvc;存储卷卷申请模板,会为每个Pod去创建唯一的pvc并与之关联哟!
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      # 声明咱们自定义的动态存储类,即storageclass动态存储资源。
      storageClassName: "managed-nfs-storage"
      resources:
        requests:
          storage: 2Gi
  template:
    metadata:
      labels:
        k8s: xjzw
    spec:
      containers:
      - name: nginx
        image: nginx:1.20.1-alpine
        volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html

[root@k8s231 vol]# kubectl apply -f statefulset.yaml

查看statefulsets资源

[root@k8s231 vol]# kubectl get statefulsets
NAME             READY   AGE
xinjizhiwa-web   3/3     55m
xjzw-web         3/3     17s

3,验证是否有独立存储

查看nfs挂载地址,可以看到,创建出来三个存储地址,证明3个副本都有自己的独立存储空间了;

[root@k8s231 vol]# kubectl exec -it xjzw-web-0 -- sh
/ # echo 111111111 > /usr/share/nginx/html/index.html
/ # exit
[root@k8s231 vol]# kubectl exec -it xjzw-web-1 -- sh
/ # echo 222222222 > /usr/share/nginx/html/index.html
/ # exit
[root@k8s231 vol]# kubectl exec -it xjzw-web-2 -- sh
/ # echo 333333333 > /usr/share/nginx/html/index.html
/ # exit

证明三个pod副本的存储是相互独立的

至此,咱们的statefulset资源学习完毕;

四、总结:

1,唯一的pod副本网络标识,重启pod时ip改变也不影响访问;

2,启停顺序,安转数字排序;

3,个副本通过声明存储卷申请模板,独立存储;

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

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

相关文章

使用yolo-seg模型实现自定义自动动态抠图

yolov8导航 如果大家想要了解关于yolov8的其他任务和相关内容可以点击这个链接,我这边整理了许多其他任务的说明博文,后续也会持续更新,包括yolov8模型优化、sam等等的相关内容。 YOLOv8(附带各种任务详细说明链接) …

java——特殊文件日志技术

目录 特殊文件Properties文件XML文件XML文件有如下的特点XML的作用和应用场景解析XML文件 日志技术概述日志技术的体系结构Logback日志框架概述快速入门核心配置文件logback.xml日志级别项目中使用日志框架 特殊文件 Properties文件 后缀为.properties的文件,称之…

Qt MDI应用方法:QMdiArea和QMdiSubWindows类

重点: 1.使用MDI应用程序,需要在主窗口的工作区放置一个QMdiArea组件。 并将QMdiArea组件设置成中心窗口 2.MDI有两个显示模式:Tab多页显示模式和子窗口显示模式 子窗口显示模式有两种显示方法:窗口级联展开和平铺展开 窗口级联…

Vue+SpringBoot打造超市自助付款系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 商品类型模块2.2 商品模块2.3 超市账单模块 三、界面展示3.1 登录注册模块3.2 超市商品类型模块3.3 超市商品模块3.4 商品购买模块3.5 超市账单模块 四、部分源码展示4.1 实体类定义4.2 控制器接口 五、配套文档展示六、…

(蓝桥杯软件赛Java研究生组/A组)第一章语言基础-第二节:Java基础

文章目录 一:标识符、修饰符和注释(1)标识符(2)修饰符(3)注释 二:数据类型(1)分类(1)基本数据类型(2)引用数据…

大数据之Flink优化

文章目录 导言:Flink调优概览第1章 资源配置调优1.1 内存设置1.1.1 TaskManager 内存模型1.1.2 生产资源配置示例 1.2 合理利用 cpu 资源1.2.1 使用 DefaultResourceCalculator 策略1.2.2 使用 DominantResourceCalculator 策略1.2.3 使用DominantResourceCalculato…

在 where子句中使用子查询(一)

目录 子查询返回单行单列 查询公司工资最低的员工信息 查找公司雇佣最早的员工信息 子查询返回单行多列 查询与 ALLEN 工资相同,职位相同的所有员工信息 子查询返回多行单列 IN 操作 查询职位是“MANAGER”的所有员工的薪水 Oracle从入门到总裁:https://bl…

企业微信应用开发:使用Cpolar域名配置进行本地接口回调的调试指南

文章目录 1. Windows安装Cpolar2. 创建Cpolar域名3. 创建企业微信应用4. 定义回调本地接口5. 回调和可信域名接口校验6. 设置固定Cpolar域名7. 使用固定域名校验 企业微信开发者在应用的开发测试阶段,应用服务通常是部署在开发环境,在有数据回调的开发场…

JVM(1)

JVM简介 JVM是Java Virtual Machine的简称,意为Java虚拟机. 在java中,它归属于jre(java运行时环境), 而jre归属于jdk(java开发工具包). 虚拟机是指通过软件模拟的具有完整硬件功能的,运行在一个完全隔离的环境中的完整计算机系统. 常见的虚拟机:JVM, VMwave, VirtualBox. J…

代码随想录算法训练营第59天 | 583.两个字符串的删除操作 + 72.编辑距离 + 编辑距离总结篇

今日任务 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇 583.两个字符串的删除操作 - Medium 题目链接:. - 力扣(LeetCode) 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以…

K8S部署Java项目 pod报错 logs日志内容:no main manifest attribute, in app.jar

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

挑战!贪吃蛇小游戏的实现(2)

在贪吃蛇小游戏的实现&#xff08;1&#xff09;中&#xff0c;我们学习了win32 相关的一些知识&#xff0c;本篇文章&#xff0c;博主将带领大家从0开始实现贪吃蛇小游戏&#xff01; 贪吃蛇游戏设计与分析 本地化 <locale.h>实现本地化&#xff0c;该头文件提供的函数…

【方法】PDF如何与其它格式文件互相转换?

在工作上&#xff0c;有时候我们需要把PDF文件转换成其他格式的文件&#xff0c;比如Word、PPT、jpg等&#xff0c;或者是其他格式文件转换成PDF&#xff0c;那具体要如何操作呢&#xff1f;不清楚的小伙伴一起来看看吧&#xff01; 想把PDF文件转换成其他格式文件&#xff0c…

bisect_left 和 bisect_right 的源码实现及区别解析

哈喽大家好&#xff0c;我是chowley&#xff0c;最近再练二分查找的题&#xff0c;也顺便看了看Python官方的bisect库&#xff0c;这次做一个总结博客。 在 Python 中&#xff0c;bisect_left 和 bisect_right 是两个常用的二分查找函数&#xff0c;用于在已排序的序列中查找元…

Unity Shader ASE基础效果思路与代码(二):边缘光、扰动火焰

Unity Shader ASE基础效果思路与代码(二)&#xff1a;边缘光、扰动火焰 文章目录 Unity Shader ASE基础效果思路与代码(二)&#xff1a;边缘光、扰动火焰边缘光效果展示&#xff1a;代码与思路&#xff1a; 扰动火焰效果展示&#xff1a;代码与思路&#xff1a; 边缘光 效果展…

【黑马程序员】STL容器之string

string string 基本概念 string本质 string是c风格的字符串&#xff0c;而string本质上是一个类 string和char* 区别 char* 是一个指针string是一个类&#xff0c;类内部封装了char*,管理这个字符串&#xff0c;是一个char*型的容器 特点 string 内部封装了很多成员方法…

Linux第65步_学习“Makefie”

学习“Makefie”&#xff0c;为后期学习linux驱动开发做铺垫。 1、在“/home/zgq/linux/atk-mp1”创建一个“Test_MakeFile”目录用于学习“Makefie”。 打开终端 输入“cd /home/zgq/linux/回车”&#xff0c;切换到“/home/zgq/linux/”目录 输入“mkdir Linux_Drivers回…

Python 在Word中创建表格并填入数据、图片

在Word中&#xff0c;表格是一个强大的工具&#xff0c;它可以帮助你更好地组织、呈现和分析信息。本文将介绍如何使用Python在Word中创建表格并填入数据、图片&#xff0c;以及设置表格样式等。 Python Word库&#xff1a; 要使用Python在Word中创建或操作表格&#xff0c;需…

使用向量数据库pinecone构建应用06:日志系统异常检测 Anomaly Detection

Building Applications with Vector Databases 下面是这门课的学习笔记&#xff1a;https://www.deeplearning.ai/short-courses/building-applications-vector-databases/ Learn to create six exciting applications of vector databases and implement them using Pinecon…

[Java 项目亮点] 三层限流设计

思路来源&#xff1a;bilibili 河北王校长 文章目录 面试官可能会问你能详细介绍一下Nginx的http_limit_req_module模块吗&#xff1f;你能解释一下如何在Nginx中配置http_limit_req_module模块吗&#xff1f;你知道如何调整Nginx的http_limit_req_module模块以适应不同的业务需…