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://www.mzph.cn/news/700218.shtml

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

相关文章

【Java】图形、图像与音频(实验十二)

一 、Component组件类中有一个public void paint( Graphics g)绘画方法,只要用户自定义的类继承了此组件类或其子类并重写了paint()方法,当用户自定义的类被实例化后,此时java运行环境就会开启一个新线程来自动调用并执行用户自定义类中的pai…

树莓派更新源,以及安装wiringPi库

1、更换树莓派(Raspberry Pi 3B)软件源 更换树莓派(Raspberry Pi 3B)软件源为国内镜像源_树莓派3b更换国内源-CSDN博客 2、安装wiringPi库 安装wiringPi库在树莓派上,可以按照以下步骤进行操作: a.首先&…

十四届蓝桥杯国赛考试计算思维 U10 组真题和答案

答案在底部 第一题 恐龙乐园的规划图中有 n 个小岛,m 座小桥,每座桥连接两个小岛。 下图是 n=5,m=8 的一个例子: 希希发现,如果拆除一些桥,仍然能使任何两个小岛都互通。最多可以拆除( )座 桥。 A. n-m B. m-n C. m-m-1 D. m-n+1 第二题

Python文件和异常(一)

目录 一、从文件中读取数据 (一)读取整个文件 (二)文件路径 (三)逐行读取 (四)创建一个包含文件各行内容的列表 (五)使用文件的内容 (六&a…

私域运营的4个核心要素

第一,我们要首先理解私域现在的形势。 以前私域:崛起的微商。发朋友圈,成交率高。 因为主要来源是信息差。 当代:信息透明化。私域流量运营的本质是获取信任。通过建立起泛人脉亲密关系。信任才重要。 第二,塑造一对一…

探索设计模式的魅力:状态模式揭秘-如何优雅地处理复杂状态转换

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,并且坚持默默的做事。 探索设计模式的魅力:状态模式揭秘-如何优雅地处理复杂状态转换 文章目录 一、案例…

VUE3使用three.js显示3D模型

使用3D模型作为自动化系统的界面已经成为潮流。尽管在AutomationML 中推荐COLLADA作为 3D 模型的标准。但是COLLADA的开发者khronos 集团却已经开发了COLLADA的后继者glTF 。glTF 2.0已经成为国际标准ISO/IEC 12113:2022。 Khronos声称-‘glTF是3D里的JPEG’。目前看来glTF 更加…

Java WEB面试系列-01

1. 什么是 Servlet? Servlet是用Java编写的服务器端程序, 其主要功能在于交互式地浏览和修改数据,生成动态Web内容。 狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,我们一般将Servlet理解为后者。 2. 为什么要使…

问题慢慢解决-通过android emulator调试android kernel-内核条件断点遇到的问题和临时解决方案

起因 在摸索到这个方案之后,mac m1调试aarch64 android kernel最终方案,就准备调试内核了,预备下断点的地方是 b binder_poll b ep_ptable_queue_proc b remove_wait_queue但是由于是android系统,上面三个函数会被频繁的触发&am…

ERC721解读

NFT(非同质化代币):类似于明朝、宋朝的青花瓷。虽然都是青花瓷。但是都具有唯一的典藏价值。而且价值可能不同。 NFT就是具有唯一价值的代币。 ERC721: 是以太坊规定实现NFT的一种标准了。实现ERC21标准的智能合约就是NFT代币了。 1.接口 1.ERC721 定义接口参考:ER…

vue.js中slot插槽的作用

作为一种流行的JavaScript框架,vue.js提供了很多功能强大的特性,其中之一就是插槽(slot)。插槽是一种能够让父组件向子组件传递内容的机制,它为我们构建可复用的组件提供了更大的灵活性和可扩展性。以下介绍Vue中插槽的…

《Docker极简教程》--Docker服务管理和监控--Docker服务的监控

Docker监控的必要性在于确保容器化环境的稳定性、性能和安全性。以下是几个关键原因: 性能优化和故障排除:监控可以帮助识别容器化应用程序的性能问题,并快速进行故障排除。通过监控关键指标,如CPU利用率、内存使用、网络流量等&…

ElementUI table表格组件实现双击编辑单元格失去焦点还原,支持多单元格

在使用ElementUI table表格组件时有时需要双击单元格显示编辑状态,失去焦点时还原表格显示。 实现思路: 在数据中增加isFocus:false.控制是否显示在table中用cell-dblclick双击方法 先看效果: 上源码:在表格模板中用scope.row…

springboot集成mqtt

文章目录 前言一、MQTT是什么?二、继承步骤1.安装MQTT2.创建项目,引入依赖3. 对应步骤2的代码3 测试 总结mqtt 启动后访问地址 前言 随着物联网的火热,MQTT的应用逐渐增多 曾经也有幸使用过mqtt,今天正好总结下MQTT的使用; 一、MQTT是什么?…

从扩散模型基础到DIT

Diffusion model 扩散模型如何工作? 输入随机噪声和文本内容,通过多次预测并去除图片中的噪声后,最终生成清晰的图像。 以上左边这张图,刚开始是随机噪声,999为时间序列。 为什么不直接预测下一张图片呢?…

springboot+vue的宠物咖啡馆平台(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

《卓有成效的管理者》

前言 管理工作在很大程度上是要言传身教的,如果管理者不懂得如何在自己的工作中做到卓有成效,就会给其他人树立错误的榜样。 第 1 章 卓有成效是可以学习的 关于体力工作,我们已有一套完整的衡量方法和制度,从工程设计到质量控制…

Java中常用的类(一)

一、API应用程序编程接口: API:指的是官方给开发人员提供的一个说明文档,对于语言有哪些类,类中有哪些方法进行说明 二、Object类 Object是java中所有类的父类,体系结构中最顶层的类,位置是java.lang.Ob…

【深度学习笔记】3_4 逻辑回归之softmax-regression

3.4 softmax回归 Softmax回归(Softmax Regression),也称为多类逻辑回归(Multinomial Logistic Regression),是一种用于多分类问题的分类算法。虽然名字里面带回归,实际上是分类。 前几节介绍的…

Socks5代理与代理IP的应用

在全球化的背景下,跨界电商和游戏行业正经历着蓬勃发展的时代。然而,随之而来的网络安全挑战也日益突出。为了应对这些挑战,Socks5代理与代理IP等技术成为了保障网络安全的重要工具。本文将探讨这些技术在跨界电商和游戏行业中的应用&#xf…