k8s数据持久化之statefulset的数据持久化,并自动创建PV与PVC

一:Statefulset

StatefulSet是为了解决有状态服务的问题,对应的Deployment和ReplicaSet是为了无状态服务而设计,其应用场景包括:
1.稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
2.稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
3.有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
4.有序收缩,有序删除(即从N-1到0)

因为statefulset要求Pod的名称是有顺序的,每一个Pod都不能被随意取代,也就是即使Pod重建之后,名称依然不变。为后端的每一个Pod去命名。

从上面的应用场景可以发现,StatefulSet由以下几部分组成:
1.用于定义网络标志的Headless Service(headless-svc:无头服务。因为没有IP地址,所以它不具备负载均衡的功能了。)
2.用于创建PersistentVolumes的volumeClaimTemplates
3.定义具体应用的StatefulSet

StatefulSet:Pod控制器。
RC、RS、Deployment、DS。 无状态的服务。
template(模板):根据模板创建出来的Pod,它们的状态都是一模一样的(除了名称、IP、域名之外)
可以理解为:任何一个Pod,都可以被删除,然后用新生成的Pod进行替换。

有状态的服务:需要记录前一次或者多次通信中的相关时间,以作为下一次通信的分类标准。比如:MySQL等数据库服务。(Pod的名称,不能随意变化。数据持久化的目录也是不一样,每一个Pod都有自己独有的数据持久化存储目录。)

每一个Pod-----对应一个PVC-----每一个PVC对应一个PV。

测试:要求
二、以自己的名称创建一个名称空间,以下所有资源都运行在此空间中。
用statefuset资源运行一个httpd web服务,要求3个Pod,但是每个Pod的主界面内容不一样,并且都要做专有的数据持久化,尝试删除其中一个Pod,查看新生成的Pod,是否数据与之前一致。

1.基于NFS服务,创建NFS服务。

1.[[email protected]?~]#?yum?-y?install?nfs-utils?rpcbind??br/>2.[[email protected]?~]#?mkdir?/nfsdata??
3.[[email protected]?~]#?vim?/etc/exports??br/>4./nfsdata??*(rw,sync,no_root_squash)??
5.[[email protected]?~]#?systemctl?start?nfs-server.service???
6.[[email protected]?~]#?systemctl?start?rpcbind??
br/>7.[[email protected]?~]#?showmount?-e??
8.Export?list?for?master:??
9./nfsdata?*??

2.创建RBAC权限
vim rbac-rolebind.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: lbs-test
apiVersion: v1
    kind: ServiceAccount  创建rbac授权用户。及定义权限
metadata:
  name: nfs-provisioner
  name:lbs-test
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: nfs-provisioner-runner
  name:lbs-test
rules:
   -  apiGroups: [""]
      resources: ["persistentvolumes"]
      verbs: ["get", "list", "watch", "create", "delete"]
   -  apiGroups: [""]
      resources: ["persistentvolumeclaims"]
      verbs: ["get", "list", "watch", "update"]
   -  apiGroups: ["storage.k8s.io"]
      resources: ["storageclasses"]
      verbs: ["get", "list", "watch"]
   -  apiGroups: [""]
      resources: ["events"]
      verbs: ["watch", "create", "update", "patch"]
   -  apiGroups: [""]
      resources: ["services", "endpoints"]
      verbs: ["get","create","list", "watch","update"]
   -  apiGroups: ["extensions"]
      resources: ["podsecuritypolicies"]
      resourceNames: ["nfs-provisioner"]
      verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner
    namespace:  lbs-test            如没有名称空间需要添加这个default默认否则报错
roleRef:
  kind: ClusterRole
  name: nfs-provisioner-runner
  apiGroup: rbac.authorization.k8s.io

执行yaml文件:

1.[[email protected]?yaml]#?kubectl?apply?-f?rbac-rolebind.yaml???
2.namespace/lbh-test?created??
3.serviceaccount/nfs-provisioner?created??
4.clusterrole.rbac.authorization.k8s.io/nfs-provisioner-runner?created??
5.clusterrolebinding.rbac.authorization.k8s.io/run-nfs-provisioner?created??

3.创建Deployment资源对象。
[[email protected] yaml]# vim nfs-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  name:lbs-test
spec:
  replicas: 1#副本数量为1
  strategy:
    type: Recreate#重置
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccount: nfs-provisioner#指定账户
      containers:
        - name: nfs-client-provisioner
          image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner使用的是这个镜像。
          volumeMounts:
            - name: nfs-client-root
              mountPath:  /persistentvolumes#指定容器内的挂载目录
          env:
            - name: PROVISIONER_NAME#容器内置变量
              value: bdqn#这是变量的名字
            - name: NFS_SERVER
              value: 192.168.1.1
            - name: NFS_PATH#指定Nfs的共享目录
              value: /nfsdata
      volumes:#指定挂载到容器内的nfs路径与IP
        - name: nfs-client-root
          nfs:
            server: 192.168.1.1
            path: /nfsdata

执行yaml文件,查看Pod:br/>1.[[email protected]?yaml]#?kubectl?apply?-f?nfs-deployment.yaml???
2.deployment.extensions/nfs-client-provisioner?created???
br/>3.[[email protected]?yaml]#?kubectl?get?pod?-n?lbs-test???
4.NAME??????????????????????????????????????READY???STATUS????RESTARTS???AGE??
5.nfs-client-provisioner-5d88975f6d-wdbnc???1/1?????Running???0??????????13s??

4.创建Storageclass资源对象(sc):
[email protected] yaml]# vim sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: sc-nfs
  namespace:lbs-test #名称空间 名
provisioner: lbs-test#与deployment资源的env环境变量value值相同
reclaimPolicy: Retain #回收策略

执行yaml文件,查看SC:br/>1.[[email protected]?yaml]#?kubectl?apply?-f?sc.yaml???
2.storageclass.storage.k8s.io/sc-nfs?created??
br/>3.[[email protected]?yaml]#?kubectl?get?sc?-n?lbs-test???
4.NAME?????PROVISIONER???AGE??
5.sc-nfs???lbs-test??????8s??

5.创建StatefulSet资源对象,自动创建PVC:

vim statefulset.yaml
apiVersion: v1
kind: Service
metadata:
  name: headless-svc
  namespace: lbs-test
  labels:
    app: headless-svc
spec:
  ports:
  - port: 80
    name: myweb
  selector:
    app: headless-pod
  clusterIP: None
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-test
  namespace: lbs-test
spec:
  serviceName: headless-svc
  replicas: 3
  selector:
    matchLabels:
      app: headless-pod
  template:
    metadata:
      labels:
        app: headless-pod
    spec:
      containers:
      - image: httpd
        name: myhttpd
        ports:
        - containerPort: 80
          name: httpd
        volumeMounts:
        - mountPath: /mnt
          name: test
  volumeClaimTemplates:     这个字段:自动创建PVC
  - metadata:
      name: test
      annotations:   //这是指定storageclass,名称要一致
        volume.beta.kubernetes.io/storage-class: sc-nfs
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 100Mi

执行yaml文件,查看Pod:br/>1.[[email protected]?yaml]#?kubectl?apply?-f?statefulset.yaml???
2.service/headless-svc?created??
br/>3.statefulset.apps/statefulset-test?created??
4.[[email protected]?yaml]#?kubectl?get?pod?-n?lbs-test???
5.NAME??????????????????????????????????????READY???STATUS????RESTARTS???AGE??
6.nfs-client-provisioner-5d88975f6d-wdbnc???1/1?????Running???0??????????22m??
7.statefulset-test-0????????????????????????1/1?????Running???0??????????8m59s??
8.statefulset-test-1????????????????????????1/1?????Running???0??????????2m30s??
9.statefulset-test-2????????????????????????1/1?????Running???0??????????109s?
?

**查看是否自动创建PV及PVC**
PV:
1.[[email protected]?yaml]#?kubectl?get?pv?-n?lbs-test???
2.NAME???????????????????????????????????????CAPACITY???ACCESS?MODES???RECLAIM?POLICY???STATUS???CLAIM??????????????????????????????STORAGECLASS???REASON???AGE??
3.pvc-0454e9ad-892f-4e39-8dcb-79664f65d1e5???100Mi??????RWO????????????Delete???????????Bound????lbh-test/test-statefulset-test-2???sc-nfs??????????????????4m23s??
4.pvc-2cb98c60-977f-4f3b-ba97-b84275f3b9e5???100Mi??????RWO????????????Delete???????????Bound????lbh-test/test-statefulset-test-0???sc-nfs??????????????????11m??
5.pvc-99137753-ccd0-4524-bf40-f3576fc97eba???100Mi??????RWO????????????Delete???????????Bound????lbh-test/test-statefulset-test-1???sc-nfs??????????????????5m4s??

PVC:
1.[[email protected]?yaml]#?kubectl?get?pvc?-n?lbs-test???
2.NAME??????????????????????STATUS???VOLUME?????????????????????????????????????CAPACITY???ACCESS?MODES???STORAGECLASS???AGE??
3.test-statefulset-test-0???Bound????pvc-2cb98c60-977f-4f3b-ba97-b84275f3b9e5???100Mi??????RWO????????????sc-nfs?????????13m??
4.test-statefulset-test-1???Bound????pvc-99137753-ccd0-4524-bf40-f3576fc97eba???100Mi??????RWO????????????sc-nfs?????????6m42s??
5.test-statefulset-test-2???Bound????pvc-0454e9ad-892f-4e39-8dcb-79664f65d1e5???100Mi??????RWO????????????sc-nfs?????????6m1s??

查看是否创建持久化目录:
1.[[email protected]?yaml]#?ls?/nfsdata/??
2.lbh-test-test-statefulset-test-0-pvc-2cb98c60-977f-4f3b-ba97-b84275f3b9e5??
3.lbh-test-test-statefulset-test-1-pvc-99137753-ccd0-4524-bf40-f3576fc97eba??
4.lbh-test-test-statefulset-test-2-pvc-0454e9ad-892f-4e39-8dcb-79664f65d1e5??

6.在pod资源内创建数据。并访问测试。

1.[[email protected]?yaml]#?cd?/nfsdata/??
2.[[email protected]?nfsdata]#?echo?111?>?lbs-test-test-statefulset-test-0-pvc-2cb98c60-977f-4f3b-ba97-b84275f3b9e5/index.html??
3.[[email protected]?nfsdata]#?echo?222?>?lbs-test-test-statefulset-test-1-pvc-99137753-ccd0-4524-bf40-f3576fc97eba/index.html??
4.[[email protected]?nfsdata]#?echo?333?>?lbs-test-test-statefulset-test-2-pvc-0454e9ad-892f-4e39-8dcb-79664f65d1e5/index.html??
5.[[email protected]?nfsdata]#?kubectl?get?pod?-o?wide?-n?lbs-test???
6.NAME??????????????????????????????????????READY???STATUS????RESTARTS???AGE?????IP???????????NODE?????NOMINATED?NODE???READINESS?GATES??
7.nfs-client-provisioner-5d88975f6d-wdbnc???1/1?????Running???0??????????30m?????10.244.2.2???node02???<none>???????????<none>??
8.statefulset-test-0????????????????????????1/1?????Running???0??????????17m?????10.244.1.2???node01???<none>???????????<none>??
9.statefulset-test-1????????????????????????1/1?????Running???0??????????10m?????10.244.2.3???node02???<none>???????????<none>??
10.statefulset-test-2????????????????????????1/1?????Running???0??????????9m57s???10.244.1.3???node01???<none>???????????<none>??
11.[[email protected]?nfsdata]#?curl?10.244.1.2??
12.111??
13.[[email protected]?nfsdata]#?curl?10.244.2.3??
14.222??
15.[[email protected]?nfsdata]#?curl?10.244.1.3??
16.333??
7.删除其中一个pod,查看该pod资源的数据是否会**重新创建并存在。**
1.[[email protected]?~]#?kubectl?get?pod?-n?lbs-test???
2.NAME??????????????????????????????????????READY???STATUS????RESTARTS???AGE??
3.nfs-client-provisioner-5d88975f6d-wdbnc???1/1?????Running???0??????????33m??
4.statefulset-test-0????????????????????????1/1?????Running???0??????????20m??
5.statefulset-test-1????????????????????????1/1?????Running???0??????????13m??
6.statefulset-test-2????????????????????????1/1?????Running???0??????????13m??
7.[[email protected]?~]#?kubectl?delete?pod?-n?lbs-test?statefulset-test-0???
8.pod?"statefulset-test-0"?deleted??
**9.??删除后会重新创建pod资源**
10.[[email protected]?~]#?kubectl?get?pod?-n?lbs-test?-o?wide??
11.NAME??????????????????????????????????????READY???STATUS????RESTARTS???AGE???IP???????????NODE?????NOMINATED?NODE???READINESS?GATES??
12.nfs-client-provisioner-5d88975f6d-wdbnc???1/1?????Running???0??????????35m???10.244.2.2???node02???<none>???????????<none>??
13.statefulset-test-0????????????????????????1/1?????Running???0??????????51s???10.244.1.4???node01???<none>???????????<none>??
14.statefulset-test-1????????????????????????1/1?????Running???0??????????15m???10.244.2.3???node02???<none>???????????<none>??
15.statefulset-test-2????????????????????????1/1?????Running???0??????????14m???10.244.1.3???node01???<none>???????????<none>??
**数据依旧存在。**
16.[[email protected]?~]#?curl?10.244.1.4??
17.111??
18.[[email protected]?~]#?cat?/nfsdata/lbs-test-test-statefulset-test-0-pvc-2cb98c60-977f-4f3b-ba97-b84275f3b9e5/index.html???
19.111??

StatefulSet资源对象,针对有状态的服务的数据持久化测试完成。
通过测试,即使删除Pod,重新生成调度后,依旧能访问到之前的持久化数据。

k8s数据持久化之statefulset的数据持久化,并自动创建PV与PVC

原文地址:https://blog.51cto.com/13911055/2473402

时间: 2024-10-15 13:52:57

k8s数据持久化之statefulset的数据持久化,并自动创建PV与PVC的相关文章

K8s数据持久化之自动创建PV

在前两篇实现k8s的数据持久化的流程为:搭建nfs底层存储===>创建PV====>创建PVC===>创建pod.最终pod中的container实现数据的持久化. 上述流程中,看似没什么问题,但细想一下,PVC在向PV申请存储空间的时候,是根据指定的pv名称.访问模式.容量大小来决定具体向哪个PV来申请空间的,如果PV的容量为20G,定义的访问模式是WRO(只允许以读写的方式挂载到单个节点),而PVC申请的存储空间为10G,那么一旦这个PVC是向上面的PV申请的空间,也就是说,那个PV

Kubernetes数据持久化之Storage Class(存储类)及自动创建PV

通过博文Kubernetes的存储之Volume可以了解到Kubernets实现数据持久化的流程为:搭建NFS底层存储-->创建PV-->创建PVC-->创建pod最终将pod中的container实现数据的持久化! 从上述流程中,看似没有什么问题,但是仔细研究就会发现:PVC在向PV申请存储空间时,是根据指定PV的名称.访问模式.容量大小来决定具体向哪个PV申请空间的. 打比方说:如果PV的容量是20G,定义的访问模式是WRO(只允许以读写的方式挂载到单个节点),而PVC申请的存储空间

Kubernetes数据持久化之Storage Class(存储类)自动创PV

通过博文Kubernetes的存储之Volume可以了解到Kubernets实现数据持久化的流程为:搭建NFS底层存储-->创建PV-->创建PVC-->创建pod最终将pod中的container实现数据的持久化! 从上述流程中,看似没有什么问题,但是仔细研究就会发现:PVC在向PV申请存储空间时,是根据指定PV的名称.访问模式.容量大小来决定具体向哪个PV申请空间的. 打比方说:如果PV的容量是20G,定义的访问模式是WRO(只允许以读写的方式挂载到单个节点),而PVC申请的存储空间

Kubernetes 系列(六):持久化存储 PV与PVC(一)

在使用容器之后,我们需要考虑的另外一个问题就是持久化存储,怎么保证容器内的数据存储到我们的服务器硬盘上.这样容器在重建后,依然可以使用之前的数据.但是显然存储资源和 CPU 资源以及内存资源有很大不同,为了屏蔽底层的技术实现细节,让用户更加方便的使用,Kubernetes便引入了 PV 和 PVC 两个重要的资源对象来实现对存储的管理. 一.概念 PV 的全称是:PersistentVolume(持久化卷),是对底层的共享存储的一种抽象,PV 由管理员进行创建和配置,它和具体的底层的共享存储技术

Kubernetes针对有状态服务数据持久化之StatefulSet(自动创建PVC)

一.Kubernetes无状态服务VS有状态服务 1)Kubernetes无状态服务 Kubernetes无状态服务特征:1)是指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一请求响应的结果是完全一致的:2)多个实例可以共享相同的持久化数据.例如:nginx实例.tomcat实例等:3)相关的Kubernetes资源有:ReplicaSet.ReplicationController.Deployment等,由于是无状态服务,所以这些控制器创建的Pod名称都是随机性的.并且

k8s存储数据持久化,emptyDir,hostPath,基于Nfs服务的PV,PVC

在docker和K8S中都存在容器是有生命周期的,因此数据卷可以实现数据持久化. 数据卷解决的主要问题: 1.数据持久性:当我们写入数据时,文件都是暂时性的存在,当容器崩溃后,host就会将这个容器杀死,然后重新从镜像创建容器,数据就会丢失. 2.数据共享:在同一个Pod中运行容器,会存在共享文件的需求. 数据卷的类型: 1.emptyDiremptyDir数据卷类似于docker数据持久化的docker manager volume,该数据卷初分配时,是一个空目录,同一个Pod中的容器可以对该

redis持久化,主从及数据备份

http://blog.csdn.net/lang_man_xing/article/details/38386113 现在在项目里已经大量使用redis了,为了提高redis的性能和可靠性我们需要知道和做到以下几件事: 常用内存优化手段与参数 redis的性能如何是完全依赖于内存的,所以我们需要知道如何来控制和节省内存. 首先最重要的一点是不要开启Redis的VM选项,即虚拟内存功能,这个本来是作为Redis存储超出物理内存数据的一种数据在内存与磁盘换入换出的一个持久化策略,但是其内存管理成本

Hadoop! | 大数据百科 | 数据观 | 中国大数据产业观察_大数据门户

你正在使用过时的浏览器,Amaze UI 暂不支持. 请 升级浏览器 以获得更好的体验! 深度好文丨读完此文,就知道Hadoop了! 来源:BiThink 时间:2016-04-12 15:14:39 作者:陈飚 “昔我十年前,与君始相识.” 一瞬间Hadoop也到了要初中择校的年龄了. 十年前还没有Hadoop,几年前国内IT圈里还不知道什么是Hadoop,而现在几乎所有大型企业的IT系统中有已经有了Hadoop的集群在运行了各式各样的任务. 2006年项目成立的一开始,“Hadoop”这个单

JMS消息持久化,将ActiveMQ消息持久化到mySql数据库中

ActiveMQ5.8.0版本采用kahadb作为默认的消息持久化方式.使用默认的持久化机制,我们不容易直接看到消息究竟是如何持久的.ActiveMQ提供的JDBC持久化机制,能够将持久化信息存储到数据库.通过查看数据库中ActiveMQ生成的表结构和存储的数据,能够帮助我们更好的了解消息的持久化机制.现在介绍如何配置activemq,将数据持久化到mysql中. 1.配置activeMQ需要的mySql数据源 为了能够使用JDBC访问mysql数据库,显然必须要配置消息服务器的数据库源.在ac