K8s: 控制器之StatefulSets对象

StatefulSet


1 ) 概述

  • Stateful,也就是有状态应用,微服务无状态是一个理想的这么一个环境
  • 有些应用是有状态的,比如这个web服务器,它只能运行在一台server上
  • 因为它要访问一些持久化的存储
  • 比如说 mysql 它就是一个典型的有状态的应用,不希望应用随时漂移到别的节点上,然后数据发生变化
  • 为什么说它有状态?
    • 就是因为它的数据是落在这个磁盘上的
    • 虽然云原生应用里面,尽量的把一些服务都变成云原生的应用
    • 在实际生活中,在实际企业开发中,很多应用它是有状态的
  • 那什么是无状态的呢?
    • 比如一个博客应用,它是无状态的,它不依赖于你底层的数据库服务地址
    • 这个应用可以部署多个
  • 在这个mysql服务器,它是有状态的应用,K8s为了应对,提出了 StatefulSets 的概念
  • StatefulSets 它是用来管理Deployment和扩展一组Pod,并且为这个pod提供序号唯一性的保证
  • 所以它和Deployment的不同是在于
    • 它管理了一组相同容器定义的pod, 它为每个Pod维护了一个固定的ID
    • 在Deployment,它的ID是一个Pod名称加后面随机字母的组合,它的名称是动态拼出来的
    • 但是,StatefulSet的pod, 它的容器名称有一个永久不变的ID, 如果建3个,就会变成 -0, -1, -2 这样的不变ID
  • StatefulSets 会定义你期望的一个状态,比如说你有3个副本,它会给你创建3个副本
  • StatefulSets 的使用场景
    • 有稳定唯一的网络标识符
    • 有一个稳定的持久化的存储,可以有序的去缩放,有序的去更新扩容
      • 有序的是指更新是从012345…按顺序更新,而不是随机的去更新
    • 这样的应用更适合 StatefulSets 来管理,而不是Deployment
  • StatefulSets 的限制
    • 必须有这个挂载 PersistentVolume 挂载卷,可以是本地,也可以是对象存储
    • 需要有一个外部的持久化化存储,基于 storage class来匹配,那么这里面有一点很重要
    • 注意,如果说删掉 StatefulSets 中的pod并不会删除它的关联的存储
    • 这样是保证数据的安全,而在Deployment里删除pod, 其创建的临时数据文件都会消失
    • 对于 StatefulSets 它其实更着重的是这些数据
  • 所以 K8s 它设计的时候,存储这个对象和 StatefulSets,是两个隔离的对象
  • 另外,StatefulSets 需要用 headless 服务来创建pod标识
  • headless叫无头服务
    • 就是我的请求, 有时候不想走负载均衡,直接想通过IP链接到后端
    • 这个时候在 K8s 中,它就提供这个headless这个服务
    • 在HTTP发请求的时候发一个post请求之前,会发一个head请求,这个headless请求会做一些事情
    • 比如说对方后端的这个IP地址是哪里?做一些 session 的认证
    • headless请求, 就是直接能够不发这个head请求,直接和后端的服务进行一个交互,直接进行CRUD的操作
    • 在这种情况下, 需要要把这个 clusterip 设成为 none
    • 就是 StatefulSets 里面的 pod 在容器里面不用固定的IP

2 )应用

  • 在这里面,我们会先创建一个Service,然后再创建这个StatefulSets

  • 新建 sfs-demo1.yaml

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mongodb
    spec:
      serviceName: mongodb  #必须配置 和service名字统一起来
      replicas: 2
      selector:
        matchLabels:
          app: mongodb
      template:
        metadata:
          labels:
            app: mongodb
        spec:
          containers:
            - name: mongo
              image: mongo:4.4          
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mongodb
    spec:
      selector:
        app: mongodb
      type: ClusterIP
      # HeadLess  
      clusterIP: None
      ports:
        - port: 27017    #本 Service 的端口
          targetPort: 27017  #容器的端口
    
  • $ kubectl apply -f sfs-demo1.yaml

    statefulset.apps/mongodb created
    service/mongodb created
    
  • $ kubectl get all

    NAME            READY   STATUS    RESTARTS   AGE
    pod/mongodb-0   1/1     Running   0          20s
    pod/mongodb-1   1/1     Running   0          19s
    
    NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)     AGE
    service/kubernetes   ClusterIP   10.1.0.1     <none>        443/TCP     6d2h
    service/mongodb      ClusterIP   None         <none>        27017/TCP   20s
    
    NAME                       READY   AGE
    statefulset.apps/mongodb   2/2     20s
    
  • $ kubectl rollout restart statefulset mongodb 重启

  • $ kubectl scale statefulset mongodb --replicas=5 扩容

  • $ kubectl get all

    NAME            READY   STATUS    RESTARTS   AGE
    pod/mongodb-0   1/1     Running   0          3m31s
    pod/mongodb-1   1/1     Running   0          3m33s
    pod/mongodb-2   1/1     Running   0          2m33s
    pod/mongodb-3   1/1     Running   0          21s
    pod/mongodb-4   1/1     Running   0          20s
    
    NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)     AGE
    service/kubernetes   ClusterIP   10.1.0.1     <none>        443/TCP     6d2h
    service/mongodb      ClusterIP   None         <none>        27017/TCP   6m49s
    
    NAME                       READY   AGE
    statefulset.apps/mongodb   5/5     6m49s
    
  • $ kubectl get svc

    NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)     AGE
    kubernetes   ClusterIP   10.1.0.1     <none>        443/TCP     6d2h
    mongodb      ClusterIP   None         <none>        27017/TCP   8m49s
    
  • $ kubectl get endpoints mongodb -o yaml

    apiVersion: v1
    kind: Endpoints
    metadata:
      annotations:
        endpoints.kubernetes.io/last-change-trigger-time: "2024-04-23T06:21:28Z"
      creationTimestamp: "2024-04-23T06:14:58Z"
      labels:
        service.kubernetes.io/headless: ""
      name: mongodb
      namespace: default
      resourceVersion: "292772"
      uid: e600cd76-37e9-48c1-90f8-fae2b31bbbd4
    subsets:
    - addresses:
      - hostname: mongodb-1
        ip: 10.244.1.107
        nodeName: node1.k8s
        targetRef:
          kind: Pod
          name: mongodb-1
          namespace: default
          resourceVersion: "292407"
          uid: 654c1164-9a0d-46c0-8148-61f71a6e7224
      - hostname: mongodb-0
        ip: 10.244.1.108
        nodeName: node1.k8s
        targetRef:
          kind: Pod
          name: mongodb-0
          namespace: default
          resourceVersion: "292437"
          uid: cef974da-f02d-4d93-bb00-0c74d534c866
      - hostname: mongodb-3
        ip: 10.244.1.109
        nodeName: node1.k8s
        targetRef:
          kind: Pod
          name: mongodb-3
          namespace: default
          resourceVersion: "292757"
          uid: caf43581-9e7c-48db-a761-1cb74e0ea871
      - hostname: mongodb-2
        ip: 10.244.2.67
        nodeName: node2.k8s
        targetRef:
          kind: Pod
          name: mongodb-2
          namespace: default
          resourceVersion: "292743"
          uid: 1eeba1cb-0e50-45fa-81d2-f4022dbd8b63
      - hostname: mongodb-4
        ip: 10.244.2.68
        nodeName: node2.k8s
        targetRef:
          kind: Pod
          name: mongodb-4
          namespace: default
          resourceVersion: "292770"
          uid: 4e3dc9f3-4f28-4802-af9a-705c12404ae5
      ports:
      - port: 27017
        protocol: TCP
    
  • $ kubectl exec -ti mongodb-0 -- mongo 测试数据存储

    MongoDB shell version v4.4.29
    connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
    Implicit session: session { "id" : UUID("74389cfe-1776-43ef-a37a-61cf5a7a9d82") }
    MongoDB server version: 4.4.29
    Welcome to the MongoDB shell.
    For interactive help, type "help".
    For more comprehensive documentation, see
      https://docs.mongodb.com/
    Questions? Try the MongoDB Developer Community Forums
      https://community.mongodb.com
    ---
    The server generated these startup warnings when booting:
            2024-04-23T06:18:17.563+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
            2024-04-23T06:18:17.563+00:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'
    ---
    >
    
  • $ exit 退出

    bye
    
  • $ run mongodb-client --rm --tty -i --restart='Never' --image mongo:4.4 --command -- bash 连接数据库测试

    If you don't see a command prompt, try pressing enter.
    root@mongodb-client:/#
    
  • $ mongo --host mongodb-0.mongodb

    MongoDB shell version v4.4.29
    connecting to: mongodb://mongodb-0.mongodb:27017/?compressors=disabled&gssapiServiceName=mongodb
    Implicit session: session { "id" : UUID("83892098-096c-4521-acf4-54aa13312392") }
    MongoDB server version: 4.4.29
    Welcome to the MongoDB shell.
    For interactive help, type "help".
    For more comprehensive documentation, see
      https://docs.mongodb.com/
    Questions? Try the MongoDB Developer Community Forums
      https://community.mongodb.com
    ---
    The server generated these startup warnings when booting:
            2024-04-23T06:18:17.563+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
            2024-04-23T06:18:17.563+00:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'
    ---
    >
    

关于run相关参数

  • $ kubectl run nginx --image=nginx
    • 启动一个 Nginx 实例
  • $ kubectl run hazelcast --image=hazelcast --port=5701
    • 启动一个 hazelcast 单个实例,并开放容器的5701端口
  • $ kubectl run hazelcast --image=hazelcast --env="DNS_DOMAIN=cluster" --env="POD_NAMESPACE=default"
    • 运行一个 hazelcast 单个实例,并设置容器的环境变量"DNS_DOMAIN=cluster" and “POD_NAMESPACE=default”
  • $ kubectl run nginx --image=nginx --replicas=5
    • 启动一个 replicated 实例去复制 nginx
  • $ kubectl run nginx --image=nginx --dry-run
    • 试运行,不创建他们的情况下,打印出所有相关的 API 对象
  • $ kubectl run nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }'
    • 用可解析的 JSON 来覆盖加载 deploymentspec,来运行一个 nginx 单个实例
    • 替换 … 为具体key, value
  • $ kubectl run -i --tty busybox --image=busybox --restart=Never
    • 运行一个在前台运行的 busybox 单个实例,如果退出不会重启

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

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

相关文章

Introducing Meta Llama 3: The most capable openly available LLM to date

要点 今天&#xff0c;我们推出 Meta Llama 3&#xff0c;这是我们最先进的开源大型语言模型的下一代。Llama 3型号将很快在AWS&#xff0c;Databricks&#xff0c;Google Cloud&#xff0c;Hugging Face&#xff0c;Kaggle&#xff0c;IBM WatsonX&#xff0c;Microsoft Azur…

代码随想录算法训练营第四十六天| LeetCode139.单词拆分

一、LeetCode139.单词拆分 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html 状态&#xff1a;已解决 1.思路 单词明显就是物品&#xff0c;字符串s明显就是背包&#xff0c;那么问题就变成了物品能不能把背…

Three 银河系

总体效果图 当然&#xff0c;这也只是银河系的一部分&#xff0c;要想知道全景视野下的银河系是什么样的&#xff0c;只有通过科学家依据观测结果所制作的绘图来实现&#xff0c;因为银河系实在是太大了&#xff0c;目前的技术水平还无法实现全景捕捉。绘制的这张三维立体图像…

记录:阿里云服务器网站搭建(4)

Docker安装Nginx 现阶段主要目的是做一些静态资源路径的转发代理&#xff0c;相当于一个web服务器&#xff0c;tomcat也可以设置凡访问静态资源。但考虑到后续还需要作为代理服务器对域名等进行代理转发&#xff0c;所以使用nginx。 准备好要挂载的nginx配置目录 mkdir -p /m…

React-RTK

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:React-RTK 目录 1、介绍 2、安装 3、编写RTK使用示例 4、官方提供项目包示例 创建 Redux …

ROS 2边学边练(33)-- 写一个静态广播(C++)

前言 通过这一篇我们将了解并学习到如何广播静态坐标变换到tf2&#xff08;由tf2来转换这些坐标系&#xff09;。 发布静态变换对于定义机器人底座与其传感器或非移动部件之间的关系非常有用。例如&#xff0c;在以激光扫描仪中心的坐标系中推理激光扫描测量数据是最简单的。 这…

基于人工智能的机动车号牌检测与推理系统v1.0

基于人工智能的机动车号牌检测与推理系统v1.0代码重构与实现。 目前整合3中现有算法&#xff0c;并完成阶段性改造&#xff0c;包括【传统方法检测车牌&#xff0c;SVM推理字符】、【YOLO方法检测车牌&#xff0c;SVM推理字符】、【YOLO方法检测车牌&#xff0c;CNN推理字符】&…

MapReduce案例-电影网站数据统计分析

本文适合大数据初学者学习MapReduce统计分析业务问题的步骤和基础的MapReduce编程方法&#xff0c;初步掌握Hadoop对计算任务的管理。 本文末尾有全部数据集和完整代码连接。 1.准备工作 安装Hadoop:Hadoop 3.3.2 离线安装-CSDN博客 按照好Hadoop之后要检查一下datanode运行情况…

Llama网络结构介绍

LLaMA现在已经是开源社区里炙手可热的模型了&#xff0c;但是原文中仅仅介绍了其和标准Transformer的差别&#xff0c;并没有一个全局的模型介绍。因此打算写篇文章&#xff0c;争取让读者不参考任何其他资料把LLaMA的模型搞懂。 结构 如图所示为LLaMA的示意图&#xff0c;由…

ESP32学习第一天-ESP32点亮LED,按键控制LED状态,LED流水灯

第一天使用到的函数: 函数第一个参数设置哪一个引脚&#xff0c;第二个参数设置引脚模式。 pinMode(led_pin,OUTPUT); //设置引脚模式 函数的第一个参数设置哪一个引脚&#xff0c;第二个参数设置是高电平还是低电平。 digitalWrite(led_pin,HIGH);//将引脚电平拉高 #incl…

电脑怎么拖动文件到想要的位置?电脑上拖拽没了的文件怎么找回

在日常的办公和学习中&#xff0c;电脑文件拖拽操作是每位用户都不可或缺的技能。然而&#xff0c;有时在拖动文件时&#xff0c;可能会因为误操作或其他原因&#xff0c;导致文件消失或移至未知位置。本文将详细解析如何在电脑上轻松拖动文件到指定位置&#xff0c;并为您提供…

大模型中的位置编码ALiBi,RoPE的总结和实现

目录 Alibi与旋转位置编码的比较 1. Alibi和旋转位置编码的外推性能比较 2. Alibi的处理方式 注意力线性偏置&#xff1a;ALiBi位置编码的实现 1. ALiBi的基本概念 2. ALiBi的实现方式 ALiBi位置编码的代码解读 1. 导入必要的库 2. 定义get_slopes函数 3. 定义get_al…

C++ Primer 总结索引 | 第十三章:拷贝控制

1、类可以定义构造函数&#xff0c;用来控制在创建此类型对象时做什么 类如何控制该类型对象拷贝、赋值、移动或销毁时做什么 类通过一些 特殊的成员函数 控制这些操作&#xff0c;包括&#xff1a;拷贝构造函数、移动构造函数、拷贝赋值运算符、移动赋值运算符 以及 析构函数 …

API请求报错 Required request body is missing问题解决

背景 在进行调用的时候&#xff0c;加载方法&#xff0c;提示以下错误 错误信息如下&#xff1a; {"code": 10001,"msg": "Required request body is missing: XXX","data": null,"extra": null }Required request body…

Qt使用miniblink第三方浏览器模块

文章目录 一、前言二、miniblink简介三、miniblink使用四、运行效果五、工程结构 一、前言 本文取自刘典武大师&#xff1a;Qt编写地图综合应用58-兼容多浏览器内核 用Qt做项目过程中&#xff0c;遇到需要用到浏览器控件的项目&#xff0c;可能都会绕不开一个问题&#xff0c;那…

机器人模型匹配控制(MPC)MATLAB实现

模型匹配控制&#xff08;Model matching control&#xff09;是指设计一个控制器使闭环系统的传递函数tf(s)与td(s)相一致&#xff01; mpcDesigner 可以分为&#xff1a; 2时域精确模型匹配控制3频域精确模型匹配控制 机械臂控制中应用模型匹配控制&#xff08;Model Matc…

手把手教你搭建鲜花团购小程序

随着互联网的快速发展&#xff0c;线上小程序商城已经成为了一种流行的电商模式。对于花店来说&#xff0c;开发线上小程序商城不仅可以扩大销售渠道&#xff0c;提高销售效率&#xff0c;还可以增加客户粘性&#xff0c;提升品牌形象。下面就以花店为例&#xff0c;教你怎么开…

【python】Python成语接龙游戏[1-3难度均有](源码+数据)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

平衡二叉树(AVLTree)

AVLTree 1、树的分类2、平衡二叉树2.1、构建一个平衡二叉树2.2、删除节点2.3、搜索方式2.3.1、广度优先搜索&#xff08;BFS&#xff09;2.3.2、深度优先搜索&#xff08;DFS&#xff09; 1、树的分类 树形结构是编程当中特别常见的一种数据结构。比如电脑中的文件管理系统就大…

模拟BACnet设备(八)

文章目录 前言模拟呼梯设备的功能前期准备——xml文件的编写创建工程&#xff0c;建立BACnet模拟设备如何将设备的对象列表打包发送呢&#xff1f;被订阅的属性值变化时&#xff0c;如何主动通知对方&#xff1f;读写属性值完整代码小结 前言 前面一到七篇&#xff0c;从理论&…