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控制器-独立存储的更多相关文章

  1. 5.深入k8s:StatefulSet控制器

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 在上一篇中,讲解了容器持久化存储,从中我们知道什么是PV和PVC,这一篇我们讲通过Sta ...

  2. 容器编排系统K8s之StatefulSet控制器

    前文我们聊到了k8s的configmap和secret资源的说明和相关使用示例,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14194944.html:今天 ...

  3. Kubernetes学习之路(十七)之statefulset控制器

    目录 一.statefulset简介 二.为什么要有headless?? 三.为什么要 有volumeClainTemplate?? 四.statefulSet使用演示 (1)查看statefulse ...

  4. kubernetes学习控制器之StatefulSet控制器

    StatefulSet介绍 一.StatefulSet概述 StatefulSet是用来管理stateful(有状态)应用的StatefulSet管理Pod时,确保Pod有一个按序增长的ID与Depl ...

  5. 3.k8s资源控制器rs Deployment Job

    k8s资源控制器 #控制器类型 ReplicaSet #rs,确保pod副本数,rs已替代rc Deployment #管理rs,升级.回滚.扩容pod DaemonSet #在每个节点运行一个Pod ...

  6. WP8 独立存储 总结3(应用设置)

    •可在独立存储中使用ApplicationSettings对象•在独立存储中存储键/值对的Dictionary方式存储 •存储的对象将永久保存 在应用设置中保存数据 void saveString(s ...

  7. WP_从独立存储区读取缓存的图片

      ///<summary> /// 独立存储缓存的图片源 /// 用法:item.img = new StorageCachedImage(newUri(http://www.baidu ...

  8. Silverlight 独立存储(IsolatedStorageFile)

    1.在Web中添加天气服务引用地址 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl 2.在Web中添加Wcf服务接口I ...

  9. Windows phone 之独立存储

    独立存储命名空间的说明:

随机推荐

  1. Luogu P2024 [NOI2001]食物链 | 并查集

    题目链接 思路:并查集,因为一开始我们并不知道每一只动物是哪一个种类的,所以我们干脆建立三倍于n的空间,1~n这三分之一用来存第i只动物是A的情况,n+1~2n这三分之一用来存第(i-n)只动物是B的 ...

  2. Forest v1.5.12 发布,声明式 HTTP 框架,已超过 1.6k star

    Forest介绍 Forest 是一个开源的 Java HTTP 客户端框架,它能够将 HTTP 的所有请求信息(包括 URL.Header 以及 Body 等信息)绑定到您自定义的 Interfac ...

  3. centos7 使用iptables

    关闭selinux,不关闭时,iptables不读取配置文件 重启生效 centos7 中默认的防火墙是firewalld,使用iptables需要先关闭firewalld防火墙,安装iptables ...

  4. windows 系统文件夹挂载到 Linux 系统,拷贝(发送)文件到 windows 系统,实现异地备份

    1.在windows 系统上配置好共享文件夹,用来接收Linux 系统的文件   注意:关闭windows 系统防火墙,或者添加进出站规则 2.在Linux 系统中,创建需要拷贝的文件目录 #mkdi ...

  5. Centos7下安装BlockScout

    简介 BlockScout是一个Elixir应用程序,允许用户搜索以太坊网络(包括所有叉子和侧链)上的交易,查看账户和余额以及验证智能合约.BlockScout为用户提供了一个全面,易于使用的界面,以 ...

  6. SpringBoot目录文件结构总结(5)

    1.目录 src/main/java :存放java代码 src/main/resources static:存放静态文件,比如css.js.image(访问方式 http://localhost:8 ...

  7. 一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结

    一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结 这是一个十分严重的线上问题 自从最近的某年某月某天起,线上服务开始变得不那么稳定(软病).在高峰期,时常有几台机器的 ...

  8. 注解@RunWith的作用

    @RunWith就是一个运行器 @RunWith(JUnit4.class)就是指用JUnit4来运行 @RunWith(SpringJUnit4ClassRunner.class),让测试运行于Sp ...

  9. bat批处理命令及解释

    相关原文链接 一.批处理概念 批处理文件:包含DOS命令的可编辑可执行文件 批处理:可以对某一对象批量操作的文件 二.批处理命令简介 命令1~10 1 echo 和 @ 回显命令 @ #关闭单行回显 ...

  10. 路径前面加与不加"/"的区别

    加"/"是绝对路径, 不加"/"是相对路径.假设你的这个html文件的路径是www.example.com/path/to/html/a.html,那么src= ...