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.xdnf.cn/news/4879.html

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

相关文章

俯仰 (pitch) 偏摆 (yaw) 翻滚 (roll)

pitch()&#xff1a;俯仰&#xff0c;将物体绕X轴旋转&#xff08;localRotationX&#xff09; yaw()&#xff1a;航向&#xff0c;将物体绕Y轴旋转&#xff08;localRotationY&#xff09; roll()&#xff1a;横滚&#xff0c;将物体绕Z轴旋转&#xff08;localRotationZ&…

es数据同步(仅供自己参考)

数据同步的问题分析&#xff1a; 当MySQL进行增删改查的时候&#xff0c;数据库的数据有所改变&#xff0c;这个时候需要修改es中的索引库的值&#xff0c;这个时候就涉及到了数据同步的问题 解决方法&#xff1a; 1、同步方法&#xff1a; 当服务对MySQL进行增删改的时候&…

从0开始学习Linux——Yum工具

往期目录&#xff1a; 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 上一个章节我们简单了解了Linux中常用的一些文本编辑器&#xff0c;本次教程我们将学习yum工具。 一、Yum简介 Yum&#xff08;全名…

高级AI记录笔记(一)

学习位置 B站位置&#xff1a;红豆丨泥 UE AI 教程原作者Youtube位置&#xff1a;https://youtu.be/-t3PbGRazKg?siRVoaBr4476k88gct素材自备 提前将动画素材准备好 斧头蓝图 斧头武器插槽 混合空间 就是改了一下第三人称模版的动画蓝图 行为树中不用Wait实现攻击完…

ffmpeg的下载与安装

废话不多说&#xff0c; 下载地址&#xff0c;得找官网&#xff0c;不然得注意是不是有夹带私活。 FFmpeg 这个是目前的最新版本&#xff1b; 下载的时候看下自己要的版本&#xff0c;我的是Windows10&#xff1b; 解压后的版本长这样&#xff1a; 接下来进行环境变量的配置&…

【http协议笔记】-- 浏览器简单分析get、post请求

环境&#xff1a;为了了解http协议的交互方式&#xff0c;使用edge浏览器简单分析协议内容&#xff0c;给刚入门的小伙伴分享一下&#xff0c;方便大家学习。 以菜鸟教程的网站为例子&#xff1a; 分析post&#xff1a; 请求url&#xff1a; 请求参数&#xff1a; 请求相应&a…

SpringBoot【实用篇】- 热部署

文章目录 目标:1.手动启动热部署2.自动启动热部署4.禁用热部署 目标: 手动启动热部署自动启动热部署热部署范围配置关闭热部署 1.手动启动热部署 当我们没有热部署的时候&#xff0c;我们必须在代码修改完后再重启程序&#xff0c;程序才会同步你修改的信息。如果我们想快速查…

vue3相对vue2有哪些改变?

https://blog.csdn.net/weixin_44475093/article/details/112386778 https://blog.csdn.net/userDengDeng/article/details/114941956 一、vue3的新特性&#xff1a; 1、速度更快 vue3相比vue2 重写了虚拟Dom实现编译模板的优化更高效的组件初始化undate性能提高1.3~2倍SSR速度…

数据库概论实验一

声明&#xff1a;著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 本文章对数据库概论实验一_求出一箱(每箱装100个)零件的重量 并将输出结果-CSDN博客文章浏览阅读2.7k次&#xff0c;点赞4次&#xff0c;收藏25次。实验数据库&#xff0c;表…

绿色能源发展关键:优化风电运维体系

根据QYResearch调研团队最新发布的《全球风电运维市场报告2023-2029》显示&#xff0c;预计到2029年&#xff0c;全球风电运维市场的规模将攀升至307.8亿美元&#xff0c;并且在接下来的几年里&#xff0c;其年复合增长率&#xff08;CAGR&#xff09;将达到12.5%。 上述图表及…

gerrit 搭建遇到的问题

1、启动Apache&#xff0c;端口被占用 : AH00072: make sock: could not bind to address (0S 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。: AH00072: make sock: could not bind to address 0.0.0.:443 a AH00451: no listening sockets available, shutti…

栈和队列相关题 , 用队列实现栈, 用栈实现队列 ,设计循环队列 C/C++双版本

文章目录 1.用队列实现栈2.用栈实现队列3. 设计循环队列 1.用队列实现栈 225. 用队列实现栈 思路&#xff1a; 使用两个队列&#xff0c;始终保持一个队列为空。 当我们需要进行压栈操作时&#xff0c;将数据压入不为空的队列中&#xff08;若两个都为空&#xff0c;则随便压…

关于STM32在代码中的而GPIO里面的寄存器(ODR等)不需要宏定义的问题

1.GPIO为什么需要宏定义地址 在 STM32 这样的微控制器中&#xff0c;硬件寄存器的地址是固定的并且特定于每个外设&#xff08;比如 GPIOA、GPIOB 等&#xff09;。为了方便代码访问这些硬件寄存器&#xff0c;我们通常会使用宏定义来指定每个外设的基地址。这样做有几个理由&a…

kimi智能助手,5大高阶玩法,95%的人还不知道

01 智能搜索:精准定位,一键获取最佳答案 Kimi,作为您的AI助手,拥有卓越的网络搜索能力。 我们能够迅速穿梭于信息海洋,为您筛选出五篇精选网络文章,并提供直接的网址链接。 Kimi的总结能力同样出色,特别适合那些追求效率、不愿深陷长篇文章的用户。 02 PDF速读:快速把…

关于数学建模的一些介绍

为了更好了解世界&#xff0c;我们可以通过数学来描述许多特定的现象&#xff0c;而数学模型就是现实世界的理想化&#xff0c;不过它永远不能完全精确地表示现实世界。 在这篇文章中&#xff0c;我将介绍一些数学建模的基本概念以及相应的基础知识&#xff0c;而关于更具体的…

远翔升压恒流芯片FP7209X与FP7209M什么区别?做以下应用市场摄影补光灯、便携灯、智能家居(调光)市场、太阳能、车灯、洗墙灯、舞台灯必看!

一&#xff0c;概述 FP7209是台湾远翔一款非同步升压LED驱动IC&#xff0c;封装有2种&#xff0c;分别是SOP-8L(EP), TSSOP-14L(EP)。控制外部开关NMOS。 输入低启动电压2.8V&#xff0c;可支持单节锂电池供电。工作电压5V&#xff0c;VFB反馈电压0.25V&#xff0c;反馈电压低…

算法日记 18 day 二叉树

最后三题&#xff0c;二叉树就结束啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;修剪二叉搜索树 669. 修剪二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树…

hashcat使用

0.介绍 Hashcat 软件是一款非常强大的、开源的、号称世界上最快的密码破解软件&#xff0c;配合强大的字典&#xff0c;可以破译超过百分之九十的密码。Hashcat 目前支持各类公开算法高达240类&#xff0c;市面上公开的密码加密算法基本都支持&#xff0c;有 Microsoft LM 哈希…

mysql 安装 windows

新版安装 新版本安装 如果出现initializing database无法安装 则用我当前版本传送门 如MySQL 安装时没有developer default 选项 解决方法传送门 如果上述还不行 可以选择full 汉化下载 传送门

基于Redis缓存机制实现高并发接口调试

创建接口 这里使用的是阿里云提供的接口服务直接做的测试&#xff0c;接口地址 curl http://localhost:8080/initData?tokenAppWithRedis 这里主要通过参数cacheFirstfalse和true来区分是否走缓存&#xff0c;正常的业务机制可能是通过后台代码逻辑自行控制的&#xff0c;这…