Kubernetes中的statefulset控制器

华子目录

  • `statefulset`控制器
    • 功能
    • StatefulSet的组成部分
  • 问题复现示例
  • statefulset示例
  • 总结

statefulset控制器

功能

  • Statefulset是为了解决有状态服务问题设计的
  • StatefulSet应用状态抽象成了两种情况
  • 拓扑状态应用实例必须按照某种顺序启动。创建的Pod必须和原来Pod网络标识(pod的名字)一样
  • 存储状态应用多个实例分别绑定不同存储数据
  • StatefulSet控制器所有Pod进行了编号编号规则是:$(statefulset名称)-$(序号),从0开始
  • Pod删除重建重建Pod网络标识不会改变Pod拓扑状态按照Pod的“名字+编号”的方式固定下来,并且为每个Pod提供了一个固定且唯一访问入口Pod对应的DNS记录

StatefulSet的组成部分

  • Headless Service无头服务:用来定义pod网络标识,生成可解析的DNS记录
  • volumeClaimTemplates:创建pvc,指定pvc名称,自动创建pvcpvc存储类供应
  • StatefulSet:管理pod

问题复现示例

#创建一个名为test的deployment控制器,运行2个pod,运行myapp镜像
[root@k8s-master volume]# kubectl create deployment test --image myapp:v1 --replicas 2 --dry-run=client -o yaml > test.yml[root@k8s-master volume]# vim test.yml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: testname: test
spec:replicas: 2selector:matchLabels:app: testtemplate:metadata:labels:app: testspec:containers:- image: myapp:v1name: myapp
[root@k8s-master volume]# kubectl apply -f test.yml
deployment.apps/test created
[root@k8s-master volume]# kubectl get pods -o wide
NAME                   READY   STATUS    RESTARTS   AGE   IP           NODE            NOMINATED NODE   READINESS GATES
test-db99b9599-cw8g5   1/1     Running   0          9s    10.244.2.3   k8s-node2.org   <none>           <none>
test-db99b9599-lws9h   1/1     Running   0          9s    10.244.1.4   k8s-node1.org   <none>           <none>
#控制器名字-repliacset的id-pod的id

回收控制器中的pod

  • --replicas设为0
#将--replicas设为0
[root@k8s-master volume]# kubectl scale deployment test --replicas 0
deployment.apps/test scaled#虽然pods没有了
[root@k8s-master volume]# kubectl get pods -o wide
No resources found in default namespace.#但是deployment控制器还在
[root@k8s-master volume]# kubectl get deployments.apps
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
test   0/0     0            0           5m48s

再重新开2pod

[root@k8s-master volume]# kubectl scale deployment test --replicas 2
deployment.apps/test scaled
[root@k8s-master volume]# kubectl get pods -o wide
NAME                   READY   STATUS    RESTARTS   AGE   IP           NODE            NOMINATED NODE   READINESS GATES
test-db99b9599-9s488   1/1     Running   0          7s    10.244.2.4   k8s-node2.org   <none>           <none>
test-db99b9599-d7qs5   1/1     Running   0          7s    10.244.1.5   k8s-node1.org   <none>           <none>
#我们发现:pod的id在变化,pod中的ip也在变化

我们发现:在控制器重新建立podpodid变化pod中的ip在变化,那么StatefulSet控制器就是解决这一问题

#回收
[root@k8s-master volume]# kubectl delete -f test.yml
deployment.apps "test" deleted

statefulset示例

建立statefulset控制器

#建立一个名为web的statefulset控制器
[root@k8s-master volume]# vim statefulset.yml
apiVersion: apps/v1   #Kubernetes API版本,这里是apps/v1
kind: StatefulSet   #声明这是一个StatefulSet资源
metadata:   #资源的元数据name: web   #StatefulSet的名称,这里是web
spec:    #StatefulSet的具体规格serviceName: "nginx-svc"   #指定了用于这个StatefulSet内部通信的服务名称,这里是nginx-svc。这个服务会负责为StatefulSet中的每个Pod提供一个DNS名称,格式为<pod-name>.<service-name>replicas: 3selector:matchLabels:app: nginx    #标签选择器,这里选择标签app: nginx的Podtemplate:metadata:labels:app: nginx   #Pod定义标签,这里是app: nginxspec:containers:- name: nginximage: nginxvolumeMounts:   #容器需要挂载的卷- name: www   #引用的卷名称,这里与后面定义的volumeClaimTemplates中的卷名称对应mountPath: /usr/share/nginx/html   #卷在容器内的挂载路径volumeClaimTemplates:   #定义了用于持久化存储的持久卷声明模板。这些模板会为每个Pod创建一个独立的持久卷声明(PVC)- metadata:   #持久卷声明的元数据name: www   #持久卷声明的名称,这里与volumeMounts中引用的卷名称对应spec:   #持久卷声明的规格storageClassName: nfs-client   #指定了存储类名称,这里是nfs-clientaccessModes:  #访问模式- ReadWriteOnce   #单点读写resources:   #定义了资源请求requests:   #具体的资源请求storage: 1Gi   #请求的存储大小为1GiB

建立无头服务

[root@k8s-master volume]# vim headless.yml
apiVersion: v1
kind: Service
metadata:labels:run: nginx-svcname: nginx-svc
spec:ports:- port: 80selector:app: nginxtype: ClusterIPclusterIP: None
[root@k8s-master volume]# kubectl apply -f statefulset.yml
statefulset.apps/web created
[root@k8s-master volume]# kubectl apply -f headless.yml
service/nginx-svc created
#查看控制器
[root@k8s-master volume]# kubectl get statefulsets.apps
NAME   READY   AGE
web    3/3     7m23s#查看pod
[root@k8s-master volume]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE     IP           NODE            NOMINATED NODE   READINESS GATES
web-0   1/1     Running   0          7m7s    10.244.2.5   k8s-node2.org   <none>           <none>
web-1   1/1     Running   0          3m59s   10.244.1.6   k8s-node1.org   <none>           <none>
web-2   1/1     Running   0          3m56s   10.244.2.6   k8s-node2.org   <none>           <none>
[root@k8s-master volume]# kubectl get svc nginx-svc
NAME        TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
nginx-svc   ClusterIP   None         <none>        80/TCP    10m[root@k8s-master volume]# kubectl describe svc nginx-svc
Name:              nginx-svc
Namespace:         default
Labels:            run=nginx-svc
Annotations:       <none>
Selector:          app=nginx
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                None
IPs:               None
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.6:80,10.244.2.5:80,10.244.2.6:80
Session Affinity:  None
Events:            <none>
#查看pvc,发现自动创建了pvc
[root@k8s-master volume]# kubectl get pvc
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
www-web-0   Bound    pvc-b6b51ed2-0272-415b-af86-3f3661aaa7b7   1Gi        RWO            nfs-client     <unset>                 16m
www-web-1   Bound    pvc-0cc1c027-458a-4ccf-be2a-c42e12a429ba   1Gi        RWO            nfs-client     <unset>                 13m
www-web-2   Bound    pvc-b03203d1-3430-4661-af7c-fa13ca826f27   1Gi        RWO            nfs-client     <unset>                 13m
#查看pv,发现自动创建了pv
[root@k8s-master volume]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM               STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pvc-0cc1c027-458a-4ccf-be2a-c42e12a429ba   1Gi        RWO            Delete           Bound      default/www-web-1   nfs-client     <unset>                          14m
pvc-b03203d1-3430-4661-af7c-fa13ca826f27   1Gi        RWO            Delete           Bound      default/www-web-2   nfs-client     <unset>                          14m
pvc-b6b51ed2-0272-415b-af86-3f3661aaa7b7   1Gi        RWO            Delete           Bound      default/www-web-0   nfs-client     <unset>                          18m
#我们发现:在nfs服务器上自动创建了目录
[root@harbor nfsdata]# ls
default-www-web-0-pvc-b6b51ed2-0272-415b-af86-3f3661aaa7b7
default-www-web-1-pvc-0cc1c027-458a-4ccf-be2a-c42e12a429ba
default-www-web-2-pvc-b03203d1-3430-4661-af7c-fa13ca826f27
#创建index.html测试文件
[root@harbor nfsdata]# echo web2 > default-www-web-2-pvc-b03203d1-3430-4661-af7c-fa13ca826f27/index.html
[root@harbor nfsdata]# echo web1 > default-www-web-1-pvc-0cc1c027-458a-4ccf-be2a-c42e12a429ba/index.html
[root@harbor nfsdata]# echo web0 > default-www-web-0-pvc-b6b51ed2-0272-415b-af86-3f3661aaa7b7/index.html
[root@k8s-master volume]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE            NOMINATED NODE   READINESS GATES
web-0   1/1     Running   0          23m   10.244.2.5   k8s-node2.org   <none>           <none>
web-1   1/1     Running   0          20m   10.244.1.6   k8s-node1.org   <none>           <none>
web-2   1/1     Running   0          20m   10.244.2.6   k8s-node2.org   <none>           <none>
[root@k8s-master volume]# curl 10.244.2.5
web0
[root@k8s-master volume]# curl 10.244.1.6
web1
[root@k8s-master volume]# curl 10.244.2.6
web2

回收statefulset控制器中的pod

[root@k8s-master volume]# kubectl scale statefulset web --replicas 0
statefulset.apps/web scaled

重新建立pod

[root@k8s-master volume]# kubectl scale statefulset web --replicas 3
statefulset.apps/web scaled
#我们发现虽然ip变了,但是pod的名字没有变,及pod的域名没有变
[root@k8s-master volume]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE            NOMINATED NODE   READINESS GATES
web-0   1/1     Running   0          24s   10.244.2.7   k8s-node2.org   <none>           <none>
web-1   1/1     Running   0          22s   10.244.1.7   k8s-node1.org   <none>           <none>
web-2   1/1     Running   0          22s   10.244.2.8   k8s-node2.org   <none>           <none>

我们可以通过访问域名来访问之前重建过pod中的应用

  • 访问域名:pod名.service名
[root@k8s-master volume]# kubectl run -it test --image busyboxplus
/ # curl web-0.nginx-svc
web0
/ # curl web-1.nginx-svc
web1
/ # curl web-2.nginx-svc
web2
#当删除整个statefulset控制器时
[root@k8s-master volume]# kubectl delete -f statefulset.yml
statefulset.apps "web" deleted
[root@k8s-master volume]# kubectl get pods
No resources found in default namespace.#发现数据依然保留
[root@harbor nfsdata]# ls
default-www-web-0-pvc-b6b51ed2-0272-415b-af86-3f3661aaa7b7
default-www-web-1-pvc-0cc1c027-458a-4ccf-be2a-c42e12a429ba
default-www-web-2-pvc-b03203d1-3430-4661-af7c-fa13ca826f27
#重新建立statefulset控制器时
[root@k8s-master volume]# kubectl apply -f statefulset.yml
statefulset.apps/web created#发现之前的数据也会被继续使用
[root@k8s-master volume]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
web-0   1/1     Running   0          17s   10.244.2.10   k8s-node2.org   <none>           <none>
web-1   1/1     Running   0          15s   10.244.1.8    k8s-node1.org   <none>           <none>
web-2   1/1     Running   0          13s   10.244.2.11   k8s-node2.org   <none>           <none>
[root@k8s-master volume]# kubectl run -it test --image busyboxplus
/ # curl web-0.nginx-svc
web0
/ # curl web-1.nginx-svc
web1
/ # curl web-2.nginx-svc
web2

只有当删除pvc时,nfs服务器中的数据才会被删除

#删除pvc
[root@k8s-master volume]# kubectl delete pvc --all
persistentvolumeclaim "www-web-0" deleted
persistentvolumeclaim "www-web-1" deleted
persistentvolumeclaim "www-web-2" deleted#发现nfs服务器中的数据没了
[root@harbor nfsdata]# ls
[root@harbor nfsdata]# 

总结

statefulset控制器创建的pod,每次重新创建pod时,虽然podip会变,但是每个pod网络标识pod的名字)和pod存储状态不会变

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

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

相关文章

【Android】时区规则库tzdata更新

1 背景&#xff1a; 最近我遇到墨西哥城时区&#xff0c;会出现夏令时&#xff0c;而墨西哥城在2022年底都已经取消夏令时了。 看起来是要更新RK3588上的时区库&#xff0c;我的还是2021a&#xff0c;而现在都已经2024年了 这样能看版本号&#xff1a; cat /system/usr/sha…

【论文速看】DL最新进展20241106-图像分类、图像分割、时间序列预测

目录 【图像分类】【图像分割】【时间序列预测】 【图像分类】 [2024 解耦数据增强] Decoupled Data Augmentation for Improving Image Classification 机构&#xff1a;腾讯优图 论文链接&#xff1a;https://arxiv.org/pdf/2411.02592v1 代码链接&#xff1a;无 最近在图…

[MRCTF2020]PYWebsite1

如果输入的密钥是对的那么我们就直接跳转到flag.php页面 那么我们直接访问&#x1f60e;&#xff0c;他不带我们去我们自己去. 那就用XFF呗. 知识点&#xff1a; 定义&#xff1a;X-Forwarded-For是一个HTTP请求头字段&#xff0c;用于识别通过HTTP代理或负载均衡方式连接到W…

穿越文化与时空的回响——从廖问洁《红豆诗词选》看当代人文情怀

穿越文化与时空的回响 ——从廖问洁《红豆诗词选》看当代人文情怀 在快节奏的现代生活中&#xff0c;我们时常感到身心的疲惫&#xff0c;渴望找到一种能够洗涤内心的方式。而廖问洁的《红豆诗词选》就如同一股清泉&#xff0c;为我们带来了心灵的洗礼和慰藉。 这位来自94年的…

【sqlmap使用手册-持续更新中】

SQLMap 简介 SQLMap 是一个开源的渗透测试工具&#xff0c;用于自动化检测和利用 SQL 注入漏洞。它支持多种数据库&#xff0c;包括 MySQL、PostgreSQL、Oracle、SQL Server 等。 可以通过以下命令安装sqlmap git clone https://github.com/sqlmapproject/sqlmap.git最常用的…

吉利极氪汽车嵌入式面试题及参考答案

inline 的作用 inline 是 C++ 中的一个关键字。它主要用于函数,目的是建议编译器将函数体插入到调用该函数的地方,而不是像普通函数调用那样进行跳转。 从性能角度来看,当一个函数被标记为 inline 后,在编译阶段,编译器可能会将函数的代码直接复制到调用它的位置。这样做…

详解Rust标准库:VecDeque 队列

theme: github highlight: an-old-hope 查看本地官方文档 安装rust后运行 rustup doc查看The Standard Library即可获取标准库内容 std::connections::VecDeque定义 队列是遵循先入先出规则的线性数据结构&#xff0c;在内存中不一定连续 VecDeque定义&#xff1a;可增长…

有哪些实用的 Ads Spy 工具推荐?

了解竞争对手的广告策略至关重要。Ads Spy 工具可以帮助我们洞察竞争对手的广告活动&#xff0c;从而优化自己的推广计划。以下是一些实用的 Ads Spy 工具介绍&#xff1a; 1. PowerAdSpy&#xff1a;可以按广告版位全渠道搜索筛选&#xff0c;实时在线筛查正在展示的广告&…

01 Oracle 数据库存储结构深度解析:从数据文件到性能优化的全链路探究

文章目录 Oracle 数据库存储结构深度解析&#xff1a;从数据文件到性能优化的全链路探究一、Oracle存储结构的物理层次1.1 控制文件&#xff08;Control File&#xff09;1.2 联机重做日志文件&#xff08;Online Redo Log File&#xff09;1.3 数据文件&#xff08;Data File&…

练习LabVIEW第四十二题

学习目标&#xff1a; 使用labview编写一个用户确认界面&#xff1a; 我们在程序中赋予5个人的账号密码&#xff0c;账号使用人名&#xff0c;密码随便&#xff0c;并规定相关权限。访问权限要在前面板显示&#xff0c;并且访问成功与否也要有显示。 开始编写&#xff1a; 前…

如何安装QT(linux/windows)

1. linux 1.1 下载安装程序 进入QT官网&#xff0c;点击右上角下载 Qt | Tools for Each Stage of Software Development Lifecycle​www.qt.io/ 然后选择下载linux版本&#xff0c;这里你需要填写一些信息&#xff0c;注册一些即可 填写之后会出现下面这个网页&#xff0c;…

数组和指针的复杂关系

C语言中指针和数组的关系似乎很“纠结”&#xff0c;让人爱恨交织。本文试图帮助读者理清它们之间的复杂关系&#xff01; 数组名的理解 数组元素在内存中是连续存放的&#xff0c;在C语言中&#xff0c;数组名有特殊的含义&#xff0c;它表示数组首元素的地址。因此&#xf…

pandas和numpy介绍

pandas和numpy都是Python中用于数据处理和分析的重要库&#xff0c;它们有以下特点和区别&#xff1a; numpy&#xff08;Numerical Python&#xff09; 基本功能&#xff1a; numpy是一个功能强大的Python库&#xff0c;主要用于对多维数组执行计算。它提供了一个高性能的多…

GitHub每日最火火火项目(11.6)

项目名称&#xff1a;zmh-program/chatnio 项目介绍&#xff1a;“zmh-program/chatnio”是下一代 AI 一站式国际化解方案&#xff0c;无论是 B 端还是 C 端用户都能从中受益。它支持众多知名的 AI 模型&#xff0c;如 OpenAI、Midjourney、Claude、讯飞星火、Stable Diffusion…

前后端分离,Jackson,Long精度丢失

案例:后端接口放回一个Long数据 GetMapping("/testForLong")public Map<String, Object> testForLong() {Map<String, Object> map new HashMap<>();map.put("aaa", 1234567890123456789L);return map;}实际前端接收的数据 前后端数据…

1.3 自然语言处理的应用

自然语言处理&#xff08;NLP&#xff09;在多个领域有广泛应用&#xff0c;如自动文摘、机器翻译、情感分析等。本实战将通过NLTK库&#xff0c;演示文本预处理的关键技术&#xff0c;包括小写转换、去噪、文本规范化、词干提取、词形还原、标记化以及删除停止词。这些技术为构…

深度学习经典模型之LeNet-5

1 LeNet-5 1.1 模型介绍 ​ LeNet-5是由 L e C u n LeCun LeCun 提出的一种用于识别手写数字和机器印刷字符的卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09; [ 1 ] ^{[1]} [1]&#xff0c;其命名来源于作者 L e C u n LeCun LeCun的名字…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01目录1. A Perspective for Adapting Generalist AI to Specialized Medical AI Applications and Their Challenges2. Synergi…

D60【python 接口自动化学习】- python基础之数据库

day60 数据库定义 学习日期&#xff1a;20241106 学习目标&#xff1a;MySQL数据库-- 128&#xff1a;数据库定义 学习笔记&#xff1a; 无处不在的数据库 数据库如何存储数据 数据库管理系统&#xff08;数据库软件&#xff09; 数据库和SQL的关系 总结 数据库就是指数据…

windows C#-弃元(上)

弃元是一种在应用程序代码中人为取消使用的占位符变量。 弃元相当于未赋值的变量&#xff1b;它们没有值。 弃元将意图传达给编译器和其他读取代码的文件&#xff1a;你打算忽略表达式的结果。 你可能需要忽略表达式的结果、元组表达式的一个或多个成员、方法的 out 参数或模式…