k8s StatefulSet控制器-独立存储
k8s-StatefulSet控制器-独立存储
1. StatefulSet控制器-独立存储
- 独享存储:StatefulSet的存储卷使用VolumeClaimTemplate创建,称为卷申请模板,当StatefulSet使用VolumeClaimTemplate创建一个PersistentVolume时,同样也会为每个Pod分配并创建一个编号的PVC,每
- 个PVC绑定对应的PV,从而保证每个Pod都拥有独立的存储。
1.1 headless service示例
apiVersion: v1
kind: Service
metadata:
name: web
namespace: default
spec:
clusterIP: None #无头服务
selector: #容器选择器
app: nginx # 指定关联pod名称
ports:
- protocol: TCP # 协议
port: 80 # service 端口
targetPort: 80 # 容器端口
type: ClusterIP # 服务类型
1.2 statefulset 独享存储文件
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "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:
- metadata:
name: www
spec:
storageClassName: "managed-nfs-storage"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
2. 案例
2. 1 编写headless service示例
[root@k8s-master statefulset]# vim headless-service.yaml
[root@k8s-master statefulset]# cat headless-service.yaml
apiVersion: v1
kind: Service
metadata:
name: web
namespace: default
spec:
clusterIP: None #无头服务
selector: #容器选择器
app: nginx # 指定关联pod名称
ports:
- protocol: TCP # 协议
port: 80 # service 端口
targetPort: 80 # 容器端口
type: ClusterIP # 服务类型
2.2 编写statefulset 独享存储文件
[root@k8s-master statefulset]# vim statefulset_pod.yaml
[root@k8s-master statefulset]# cat statefulset_pod.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "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:
- metadata:
name: www
spec:
storageClassName: "managed-nfs-storage"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
2.3 启动配置文件
[root@k8s-master statefulset]# kubectl apply -f statefulset_pod.yaml
statefulset.apps/web configured
2.4 验证是否启动
[root@k8s-master statefulset]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-95c9579-qslkg 1/1 Running 0 5h6m
web-0 1/1 Running 0 17m
web-1 1/1 Running 0 17m
web-2 1/1 Running 0 16m
2.5 验证pvc和pv
[root@k8s-master statefulset]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-pvc Bound my-pv 5Gi RWX 3d12h
test-claim Bound pvc-998a4c34-f686-4e46-80bf-6d32c005111d 1Gi RWX managed-nfs-storage 2d9h
www-web-0 Bound pvc-3494846e-cfaa-4334-8080-1479a583cb53 1Gi RWO managed-nfs-storage 15m
www-web-1 Bound pvc-fe224ed6-b3e2-4359-975d-d2a5bd22a3a1 1Gi RWO managed-nfs-storage 15m
www-web-2 Bound pvc-a56d4952-bbbe-49c0-8208-7126fc392b20 1Gi RWO managed-nfs-storage 15m
[root@k8s-master statefulset]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
my-pv 5Gi RWX Retain Terminating default/my-pvc 3d12h
pvc-3494846e-cfaa-4334-8080-1479a583cb53 1Gi RWO Delete Bound default/www-web-0 managed-nfs-storage 15m
pvc-998a4c34-f686-4e46-80bf-6d32c005111d 1Gi RWX Delete Bound default/test-claim managed-nfs-storage 2d9h
pvc-a56d4952-bbbe-49c0-8208-7126fc392b20 1Gi RWO Delete Bound default/www-web-2 managed-nfs-storage 15m
pvc-fe224ed6-b3e2-4359-975d-d2a5bd22a3a1 1Gi RWO Delete Bound default/www-web-1 managed-nfs-storage 15m
test-pv 1Gi RWX Retain Available 22m
验证nfs存储的
[root@k8s-node3 ~]# cd /ifs/kubernetes/
[root@k8s-node3 kubernetes]# ll -a
总用量 4
drwxr-xr-x 6 root root 289 1月 2 21:30 .
drwxr-xr-x 3 root root 24 12月 28 17:36 ..
drwxrwxrwx 2 root root 24 12月 31 12:37 default-test-claim-pvc-998a4c34-f686-4e46-80bf-6d32c005111d
drwxrwxrwx 2 root root 6 1月 2 21:30 default-www-web-0-pvc-3494846e-cfaa-4334-8080-1479a583cb53
drwxrwxrwx 2 root root 6 1月 2 21:30 default-www-web-1-pvc-fe224ed6-b3e2-4359-975d-d2a5bd22a3a1
drwxrwxrwx 2 root root 6 1月 2 21:30 default-www-web-2-pvc-a56d4952-bbbe-49c0-8208-7126fc392b20
-rw-r--r-- 1 root root 22 12月 28 20:17 index.html注释: 在这里我们可以看到有web的存储路径
往这三个路径写入数据
echo ' hello pod 00' > default-www-web-0-pvc-3494846e-cfaa-4334-8080-1479a583cb53/index.html echo ' hello pod 01' > default-www-web-1-pvc-fe224ed6-b3e2-4359-975d-d2a5bd22a3a1/index.html echo ' hello pod 02' > default-www-web-2-pvc-a56d4952-bbbe-49c0-8208-7126fc392b20/index.html
验证三个路径里面的数据
[root@k8s-node3 kubernetes]# cat default-www-web-0-pvc-3494846e-cfaa-4334-8080-1479a583cb53/index.html
hello pod 00
[root@k8s-node3 kubernetes]# cat default-www-web-1-pvc-fe224ed6-b3e2-4359-975d-d2a5bd22a3a1/index.html
hello pod 01
[root@k8s-node3 kubernetes]# cat default-www-web-2-pvc-a56d4952-bbbe-49c0-8208-7126fc392b20/index.html
hello pod 02
2.6 验证一下请求数据
查看pod的IP
[root@k8s-master statefulset]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nfs-client-provisioner-95c9579-qslkg 1/1 Running 0 5h19m 10.244.36.92 k8s-node1 <none> <none>
web-0 1/1 Running 0 29m 10.244.107.220 k8s-node3 <none> <none>
web-1 1/1 Running 0 29m 10.244.36.94 k8s-node1 <none> <none>
web-2 1/1 Running 0 29m 10.244.169.149 k8s-node2 <none> <none>
模拟浏览器请求
[root@k8s-master statefulset]# curl 10.244.107.220
hello pod 00
[root@k8s-master statefulset]# curl 10.244.36.94
hello pod 01
[root@k8s-master statefulset]# curl 10.244.169.149
hello pod 02
3 案例-删除应用测试
3.1 删除pod服务
[root@k8s-master statefulset]# kubectl delete -f statefulset_pod.yaml
statefulset.apps "web" deleted
3.2 验证服务是否存在
[root@k8s-master statefulset]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-95c9579-qslkg 1/1 Running 0 5h27m
注释:发现服务已经删除了
3.3 验证pv和pvc是否存在
[root@k8s-master statefulset]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/my-pv 5Gi RWX Retain Terminating default/my-pvc 3d12h
persistentvolume/pvc-3494846e-cfaa-4334-8080-1479a583cb53 1Gi RWO Delete Bound default/www-web-0 managed-nfs-storage 39m
persistentvolume/pvc-998a4c34-f686-4e46-80bf-6d32c005111d 1Gi RWX Delete Bound default/test-claim managed-nfs-storage 2d9h
persistentvolume/pvc-a56d4952-bbbe-49c0-8208-7126fc392b20 1Gi RWO Delete Bound default/www-web-2 managed-nfs-storage 39m
persistentvolume/pvc-fe224ed6-b3e2-4359-975d-d2a5bd22a3a1 1Gi RWO Delete Bound default/www-web-1 managed-nfs-storage 39m
persistentvolume/test-pv 1Gi RWX Retain Available 45m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/my-pvc Bound my-pv 5Gi RWX 3d12h
persistentvolumeclaim/test-claim Bound pvc-998a4c34-f686-4e46-80bf-6d32c005111d 1Gi RWX managed-nfs-storage 2d9h
persistentvolumeclaim/www-web-0 Bound pvc-3494846e-cfaa-4334-8080-1479a583cb53 1Gi RWO managed-nfs-storage 39m
persistentvolumeclaim/www-web-1 Bound pvc-fe224ed6-b3e2-4359-975d-d2a5bd22a3a1 1Gi RWO managed-nfs-storage 39m
persistentvolumeclaim/www-web-2 Bound pvc-a56d4952-bbbe-49c0-8208-7126fc392b20 1Gi RWO managed-nfs-storage 39m
注释:发现服务还存在
3.4 重新启动服务看看
重启服务
[root@k8s-master statefulset]# kubectl apply -f statefulset_pod.yaml
statefulset.apps/web created
验证IP是否发生变化
# 验证IP
[root@k8s-master statefulset]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nfs-client-provisioner-95c9579-qslkg 1/1 Running 0 5h19m 10.244.36.92 k8s-node1 <none> <none>
web-0 1/1 Running 0 29m 10.244.107.220 k8s-node3 <none> <none>
web-1 1/1 Running 0 29m 10.244.36.94 k8s-node1 <none> <none>
web-2 1/1 Running 0 29m 10.244.169.149 k8s-node2 <none> <none> #重启后的
[root@k8s-master statefulset]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nfs-client-provisioner-95c9579-qslkg 1/1 Running 0 5h31m 10.244.36.92 k8s-node1 <none> <none>
web-0 1/1 Running 0 82s 10.244.107.221 k8s-node3 <none> <none>
web-1 1/1 Running 0 77s 10.244.36.95 k8s-node1 <none> <none>
web-2 1/1 Running 0 71s 10.244.169.150 k8s-node2 <none> <none>
注释: 发现已经发现变化了
我们验证一下数据是否一样
[root@k8s-master statefulset]# curl 10.244.107.221
hello pod 00
[root@k8s-master statefulset]# curl 10.244.36.95
hello pod 01
[root@k8s-master statefulset]# curl 10.244.169.150
hello pod 02
注释: 看到数据是没有发生变化的
k8s StatefulSet控制器-独立存储的更多相关文章
- 5.深入k8s:StatefulSet控制器
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 在上一篇中,讲解了容器持久化存储,从中我们知道什么是PV和PVC,这一篇我们讲通过Sta ...
- 容器编排系统K8s之StatefulSet控制器
前文我们聊到了k8s的configmap和secret资源的说明和相关使用示例,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14194944.html:今天 ...
- Kubernetes学习之路(十七)之statefulset控制器
目录 一.statefulset简介 二.为什么要有headless?? 三.为什么要 有volumeClainTemplate?? 四.statefulSet使用演示 (1)查看statefulse ...
- kubernetes学习控制器之StatefulSet控制器
StatefulSet介绍 一.StatefulSet概述 StatefulSet是用来管理stateful(有状态)应用的StatefulSet管理Pod时,确保Pod有一个按序增长的ID与Depl ...
- 3.k8s资源控制器rs Deployment Job
k8s资源控制器 #控制器类型 ReplicaSet #rs,确保pod副本数,rs已替代rc Deployment #管理rs,升级.回滚.扩容pod DaemonSet #在每个节点运行一个Pod ...
- WP8 独立存储 总结3(应用设置)
•可在独立存储中使用ApplicationSettings对象•在独立存储中存储键/值对的Dictionary方式存储 •存储的对象将永久保存 在应用设置中保存数据 void saveString(s ...
- WP_从独立存储区读取缓存的图片
///<summary> /// 独立存储缓存的图片源 /// 用法:item.img = new StorageCachedImage(newUri(http://www.baidu ...
- Silverlight 独立存储(IsolatedStorageFile)
1.在Web中添加天气服务引用地址 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl 2.在Web中添加Wcf服务接口I ...
- Windows phone 之独立存储
独立存储命名空间的说明:
随机推荐
- Luogu P2024 [NOI2001]食物链 | 并查集
题目链接 思路:并查集,因为一开始我们并不知道每一只动物是哪一个种类的,所以我们干脆建立三倍于n的空间,1~n这三分之一用来存第i只动物是A的情况,n+1~2n这三分之一用来存第(i-n)只动物是B的 ...
- Forest v1.5.12 发布,声明式 HTTP 框架,已超过 1.6k star
Forest介绍 Forest 是一个开源的 Java HTTP 客户端框架,它能够将 HTTP 的所有请求信息(包括 URL.Header 以及 Body 等信息)绑定到您自定义的 Interfac ...
- centos7 使用iptables
关闭selinux,不关闭时,iptables不读取配置文件 重启生效 centos7 中默认的防火墙是firewalld,使用iptables需要先关闭firewalld防火墙,安装iptables ...
- windows 系统文件夹挂载到 Linux 系统,拷贝(发送)文件到 windows 系统,实现异地备份
1.在windows 系统上配置好共享文件夹,用来接收Linux 系统的文件 注意:关闭windows 系统防火墙,或者添加进出站规则 2.在Linux 系统中,创建需要拷贝的文件目录 #mkdi ...
- Centos7下安装BlockScout
简介 BlockScout是一个Elixir应用程序,允许用户搜索以太坊网络(包括所有叉子和侧链)上的交易,查看账户和余额以及验证智能合约.BlockScout为用户提供了一个全面,易于使用的界面,以 ...
- SpringBoot目录文件结构总结(5)
1.目录 src/main/java :存放java代码 src/main/resources static:存放静态文件,比如css.js.image(访问方式 http://localhost:8 ...
- 一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结
一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结 这是一个十分严重的线上问题 自从最近的某年某月某天起,线上服务开始变得不那么稳定(软病).在高峰期,时常有几台机器的 ...
- 注解@RunWith的作用
@RunWith就是一个运行器 @RunWith(JUnit4.class)就是指用JUnit4来运行 @RunWith(SpringJUnit4ClassRunner.class),让测试运行于Sp ...
- bat批处理命令及解释
相关原文链接 一.批处理概念 批处理文件:包含DOS命令的可编辑可执行文件 批处理:可以对某一对象批量操作的文件 二.批处理命令简介 命令1~10 1 echo 和 @ 回显命令 @ #关闭单行回显 ...
- 路径前面加与不加"/"的区别
加"/"是绝对路径, 不加"/"是相对路径.假设你的这个html文件的路径是www.example.com/path/to/html/a.html,那么src= ...