kubernetes控制器之StatefulSet

news2024/11/19 0:48:19

目录

一、无状态与有状态

1.1无状态

1.2有状态

二、StatefulSet 控制器

2.1 StatefulSet 控制器概述

2.2StatefulSet 控制器:网络标识

2.3StatefulSet 控制器:独享存储


一、无状态与有状态


Deployment控制器设计原则: 管理的所有Pod一模一样,提供同一个服务, 也不考虑在哪台Node 运行,可随意扩容和缩容。这种应用称为“无状态”,例如Web服务。

在实际的场景中,并不能满足所有应用,尤其是分布式应用,会部署多个实例, 这些实例之间往往有依赖关系,例如主从关系、主备关系, 这种应用称为“有状态”, 例如MySQL主从、 Etcd集群。

1.1无状态

(1)指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的。

(2)多个实例可以共享相同的持久化数据。例如:nginx实例,tomcat实例等

(3)相关的k8s资源有:ReplicaSet、ReplicationController、Deployment等,由于是无状态服务,所以这些控制器创建的pod序号都是随机值。并且在缩容的时候并不会明确缩容某一个pod,而是随机的,因为所有实例得到的返回值都是一样,所以缩容任何一个pod都可以

1.2有状态

(1)有状态服务 可以说是 需要数据存储功能的服务、或者指多线程类型的服务,队列等。(mysql数据库、kafka、zookeeper等)

(2)每个实例都需要有自己独立的持久化存储,并且在k8s中是通过申明模板来进行定义。持久卷申明模板在创建pod之前创建,绑定到pod中,模板可以定义多个。


二、StatefulSet 控制器


2.1 StatefulSet 控制器概述

StatefulSet控制器用于部署有状态应用, 满足一些有状态应用的需求:

• Pod有序的部署、扩容、删除和停止

• Pod分配一个稳定的且唯一的网络标识

• Pod分配一个独享的存储

2.2StatefulSet 控制器:网络标识

稳定的网络标识: 使用Headless Service (相比普通Service只是将spec.clusterIP定义为None) 来维 护Pod网络身份,会为每个Pod分配一个数字编号并且按照编号顺序部署。还需要在StatefulSet添加 serviceName: “nginx”字段指定StatefulSet控制器要使用这个Headless Service。

稳定主要体现在主机名和Pod A记录:

主机名: <statefulset名称>- <编号>

Pod DNS A记录: <statefulset名称-编号>. <service-name> . <namespace>.svc.cluster.local

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: headless-web
  namespace: default
spec:
  clusterIP: None
  ports:
  - port: 80       # service端口
    protocol: TCP  # 协议
    targetPort: 80 # 容器端口
  selector:        # 标签选择器
    app: nginx     # 指定关联的 Pod的标签
  type: ClusterIP  # 服务类型 

   查看 创建的 headless-web service

statefulset-web.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-web
spec:
  serviceName: headless-web
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
       - name: nginx
         image: nginx
         ports: 
         - containerPort: 80 
           name: web

从web0开始创建 pod

我们发现 创建的 三个容器的主机名与pod 的名称是一致的,即使pod 删除 重新创建 主机名也是 不变的,有稳定的主机名。

启动一个容器 dns-test 查看web , headless-web service的DNS 解析结果

kubectl run -i -t dns-test --image busybox:1.28.4 /bin/sh

nslookup (全称 name server lookup) ,是一个在命令行界面下的网络工具

使用 nslookup 查看 DNS的结果

[root@k8s-master1 statefulset]# kubectl run -i -t dns-test --rm  --image busybox:1.28.4 /bin/sh
If you don't see a command prompt, try pressing enter.
/ # nslookup headless-web
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      headless-web
Address 1: 10.244.36.75 statefulset-web-1.headless-web.default.svc.cluster.local
Address 2: 10.244.36.76 statefulset-web-2.headless-web.default.svc.cluster.local
Address 3: 10.244.169.136 statefulset-web-0.headless-web.default.svc.cluster.local
/ # nslookup statefulset-web-1.headless-web.default.svc.cluster.local
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      statefulset-web-1.headless-web.default.svc.cluster.local
Address 1: 10.244.36.75 statefulset-web-1.headless-web.default.svc.cluster.local

即使我们pod 重启 IP 发生变化,三条 DNS记录名称是不变的 ,我们可以使用固定的DNS名称。

2.3StatefulSet 控制器:独享存储

独享存储: StatefulSet的存储卷使用VolumeClaimTemplate创建,称为卷申请模板, 当StatefulSet使用 VolumeClaimTemplate创建一个PersistentVolume时,同样也会为每个Pod分配并创建一个编号的PVC, 每个PVC绑定对应的PV,从而保证每个Pod都拥有独立的存储。

statefulset-web.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-web
spec:
  serviceName: headless-web
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
       - name: nginx
         image: nginx
         ports: 
         - containerPort: 80 
           name: web
         volumeMounts:
         - name: www
           mountPath: /usr/share/nginx/html
  volumeClaimTemplates:     ## statefulset 专属
  - metadata:    
      name: www
    spec:
      storageClassName: "managed-nfs-storage" ## 基于PV的动态创建
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi

验证pvc和pv

NFS Server 服务器上成功创建存储路径

输入内容 ,可以成功访问

cd /ifs/kubernetes/
echo ' hello pod 00' > default-www-web-0-pvc-c976defd-bd81-4c7c-b489-9801fc50cc60/index.html
echo ' hello pod 01' > default-www-web-1-pvc-385c9232-4e5f-4e46-9f7a-a4ba58f45577/index.html
echo ' hello pod 02' > default-www-web-2-pvc-74ad04fa-ab96-444f-92a0-9bb3e03c1118/index.html

我们 删除 pod 后, 存储的文件还是存在的 ,如果重新创建pod , k8s会重新 创建pv 和pvc, 绑定 对用的路径,数据不会发生变化。

 小结

StatefulSet与Deployment区别:有身份的!

份三要素:

   域名

•   主机名

•   存储(PVC)

 

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

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

相关文章

TiDB丨Etcd API 未授权访问漏洞的修复

文章目录一、前言二、集群环境三、漏洞整改建议方案一方案二四、方案实施五、可能存在的风险六、总结一、前言 Etcd是一个采用HTTP协议的健/值对存储系统&#xff0c;它是一个分布式和功能层次配置系统&#xff0c;可用于构建服务发现系统。用于共享配置和服务发现的分布式&am…

KubeEdge云原生边缘计算公开课03——云原生边缘计算学术研究现状与趋势

KubeEdge云原生边缘计算公开课03——云原生边缘计算学术研究现状与趋势曹建农&#xff1a;Collaborative Edge ComputingEdge Computing: the Driven force of AIoTThe Emergence of AIoTEdge ComputingCurrent Research on Edge ComputingComputation at EdgeIntelligence at …

MCU-51:LED点阵屏

之前我们介绍了控制LED灯亮灭的操作&#xff0c;今天我们要介绍一下控制LED点阵屏亮灭的操作&#xff0c;8*8的LED点阵屏&#xff0c;可以理解为八行或者八列LED灯的一个组合&#xff0c;可以使用它来显示一些字体与图案。 一、点阵屏介绍 1.1 简介 LED点阵屏由若干个独立的…

八、购物车案例

一、购物车案例 1.1、使用npm i命令&#xff0c;安装依赖 1.2、编写页面布局 App.vue <template><div class"app-container"><Header></Header><Goods></Goods><Footer></Footer></div> </template>…

【直播教程】直播间没人看?5大技巧教你提升!

直播是连接店铺、品牌、产品和消费者之间的桥梁。人是视觉动物&#xff0c;店铺的产品、团队和服务是后端的内容&#xff0c;产品再好&#xff0c;团队再强大&#xff0c;前端的消费者看不到&#xff0c;背后的努力都是徒然。所以&#xff0c;在粉丝对店铺、对品牌不熟悉的情况…

CouchDB(1):apache CouchDB介绍与安装

1 apache CouchDB介绍 Apache的CouchDB是⼀个免费的开源的数据库。 官网&#xff1a;https://couchdb.apache.org/ 其主要特点如下&#xff1a; 1.schema free &#xff08;不需要提前设计表&#xff09;2.documented oriented &#xff0c; json structure data(⾯向⽂档)3…

openresty配置资源访问控制

openresty配置资源访问控制 介绍 我们这的需求是&#xff0c;arcgis server发布了很多图层数据&#xff0c;这些数据需要被用户申请后才能访问。申请后给用户一个地址和key&#xff0c;让用户可以用key和地址访问地图资源。 这里我准备使用openresty和认证服务&#xff08;j…

电商API接口开发系列,亲测有效,请求示例说明

在电商运营活动中&#xff0c;价格是贯穿始终的关键因素&#xff0c;而品牌方有效利用价格数据也能够推动企业更好的发展。 当品牌方能够精准获取商品的到手价时&#xff0c;有利于做好商品的定价复盘工作、后续的价格分析工作&#xff0c;也能够为后面的调价作参考&#xff1…

分享| 如何在自有App中引入小游戏?

之前有跟大家分享过ios系统上引入FinClip SDK&#xff0c;并将小程序游戏运行到自有App 中&#xff0c;这周就继续分享如何在Android系统中引入FinClip SDK。 近期FinClip 官方正在举行小游戏支持的功能内测&#xff0c;有兴趣的朋友可以去看看。手动指引&#xff1a;小游戏内…

多寄存器内存访问指令与栈

目录 一、多寄存器内存访问指令 二、多寄存器内存访问指令的寻址方式 三、栈的种类与使用 3.1栈的概念 3.2栈的分类 四、栈的应用举例 4.1叶子函数的调用过程举例 4.2非叶子函数的调用过程举例 一、多寄存器内存访问指令 MOV R1, #1 MOV R2, #2 MOV R3…

什么是物联网安全?

物联网安全是专注于保护物联网中连接的设备和网络的技术领域。物联网涉及将互联网连接添加到相互关联的计算设备、机械和数字机器、物体、动物或人的系统中。每个“事物”都提供了一个唯一的标识符以及通过网络自动传输数据的能力。如果设备没有得到适当的保护&#xff0c;允许…

寄存器模型的集成

前言&#xff1a;当拿到寄存器模型和总线后&#xff0c;就要实现总线适配器&#xff0c;这就是集成的过程。 接下来需要考虑选择与DUT寄存器接口一致的总线UVC, 该UVC会提供硬件级别的访问方式。 要完成一次硬件级别的总线传输&#xff0c; 往往需要考虑给出地址、 数据队列、 …

网鼎杯2020青龙组——filejava通关思路

目录 1、启动靶场&#xff0c;访问页面 2、BP抓包 &#xff08;三&#xff09;代码审计 1&#xff0e;XMLReader 2&#xff0e;SAXBuilder 3&#xff0e;SAXReader 4&#xff0e;SAXParserFactory 5&#xff0e;Digester 6&#xff0e;DocumentBuilderFactory 漏洞利用 0x0…

C++--数据结构--图解B树--B+树--B*树--0718 19

1、常见的搜索结构 种类 数据格式时间复杂度顺序查找无要求O(N)二分查找有序O(log_2 N)二叉搜索树无要求O(log_2 N)二叉平衡树无要求O(log_2 N)哈希无要求O(1) 如果数据量很大&#xff0c;比如有100G数据&#xff0c;无法一次放进内存中&#xff0c;那就只能放在磁盘上了…

互联网+时代的到来,让一站式婚庆管理系统成为潮流

自20世纪90年代初中国第一家婚庆公司成立至今&#xff0c;婚庆市场是越做越大。作为新兴产业的婚庆行业蕴藏着巨大的商机&#xff0c;婚庆市场空间日趋扩大&#xff0c;婚庆产业逐渐成为前景看好的朝阳产业。因此&#xff0c;市面上的婚庆企业也越来越多。但是想要在众多同行中…

Codeforces Round #841 (Div. 2) and Divide by Zero 2022 A-D

等System test的时候顺便水一篇吧233&#xff0c;感觉题目挺好的&#xff0c;但是我C、D都快要调完了&#xff0c;还是难受。 应该是我参加的今年最后一场比赛了。 Codeforces Round #841 (Div. 2) and Divide by Zero 2022 A. Joey Takes Money #include<bits/stdc.h&g…

数字射线检测图像质量

对比度 物体对比度 ΔI/I−μΔT/(1n)\Delta I/I -\mu \Delta T /(1n)ΔI/I−μΔT/(1n) 屏幕亮度 LkILkILkI 人眼感觉到的亮度 BKlnLBKln LBKlnL 人眼感觉到的亮度对比度 ΔBKln((LΔL)/L)\Delta B K ln((L\Delta L)/L)ΔBKln((LΔL)/L) 其中&#xff0c;III为射线强度 ΔB…

杭州市 智慧城市物联网支撑平台 功能规范 附下载地址

智慧城市物联网介绍 智慧城市是一个有机结合的大系统&#xff0c;涵盖了更透切的感知、更全面的互连&#xff0c;更深入的智能。物联网是智慧城市中非常重要的元素&#xff0c;它侧重于底层感知信息的采集与传输&#xff0c;城市范围内泛在网方面的建设。 通过智慧城市物联网支…

curl升级到7.87(centos7和TencentOS2.4 tk)

centos7升级curl到7.8.7,按照之前写过的一篇文章,大致按描述操作即可。只不过需要做一点点修正... CentOS 7升级curl_乐大师的博客-CSDN博客_centos7 curl升级 更新操作中会报错安装失败,提示如下: 针对这个问题只需要增加一个参数即可解决。 yum -y update curl --ena…

Linux系统安装Redis(实现远程登录)

目录 &#xff08;一&#xff09;下载和安装 &#xff08;二&#xff09;配置redis.con配置文件 1&#xff0c;开启远程连接有以下三步&#xff1a; 2&#xff0c;配置登录密码 ​&#xff08;三&#xff09;开放端口 1&#xff0c;开放Linux系统上的3306端口 2&#xff0…