文章链接

PVPVC 模式要先创建好 PV,然后再定义好 PVC 进行一对一的绑定。那么如果遇到大集群,也一一的创建吗?这样来说维护成本很高,工作量大。这个时候就有了 Kubernetes 提供一种自动创建 PV 的机制,叫 StorageClass ,它的作用就是创建 PV 的模板。

StorageClass 会定义两部分:

  • PV的属性:

    比如存储的大小、类型等
  • PV需要使用到的存储插件

    比如Ceph等;

有了这两部分信息,Kubernetes 就能够根据用户提交的 PVC ,找到对应的 StorageClass ,然后 Kubernetes 就会调用 StorageClass 声明的存储插件,自动创建 PV

不过要使用 NFS ,我们就需要一个 nfs-client 的插件。这个插件会使 NFS 服务自动帮我们创建 PV

自动创建的 PV 会以 ${namespace}-${pvcName}-${pvName} 的格式存储

如果 PV 被回收,则会以 archieved-${namespace}-${pvcName}-${pvName} 的格式存储

详细可以参考 Github

PV、PVC、NFS不再介绍,没有完成的请查看 kubernetes使用PV和PVC管理数据存储

创建ServiceAccount

创建 ServiceAccount 的目的是为了给 nfs-client 授权。

# 下载 rbac.yaml
wget https://github.com/kubernetes-retired/external-storage/blob/201f40d78a9d3fd57d8a441cfc326988d88f35ec/nfs-client/deploy/rbac.yaml

部署 rbac.yaml

kubectl  apply  -f   rbac.yaml
# 输出如下
serviceaccount/nfs-client-provisioner created
clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created

创建 nfs-client

使用 Deployment 来创建 nfs-client

# 下载 deployment.yaml
wget https://github.com/kubernetes-retired/external-storage/blob/201f40d78a9d3fd57d8a441cfc326988d88f35ec/nfs-client/deploy/deployment.yaml

修改 yaml 如下

apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
labels:
app: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs # 这里的供应者名称必须和class.yaml中的provisioner的名称一致,否则部署不成功
- name: NFS_SERVER
value: 10.0.10.51 # 这里写NFS服务器的IP地址或者能解析到的主机名
- name: NFS_PATH
value: /home/bsh/nfs # 这里写NFS服务器中的共享挂载目录(强调:这里的路径必须是目录中最后一层的文件夹,否则部署的应用将无权限创建目录导致Pending)
volumes:
- name: nfs-client-root
nfs:
server: 10.0.10.51 # NFS服务器的IP或可解析到的主机名
path: /home/bsh/nfs # NFS服务器中的共享挂载目录(强调:这里的路径必须是目录中最后一层的文件夹,否则部署的应用将无权限创建目录导致Pending)

️ 注意

value: fuseim.pri/ifs # 这里的供应者名称必须和 class.yaml 中的 provisioner 的名称一致,否则部署不成功

创建检查

# 部署 nfs-client
kubectl apply -f deployment.yaml
# 输出如下
deployment.apps/nfs-client-provisioner created

查看pod

kubectl get pod
# 输出如下
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-fd74f99b4-wr58j 1/1 Running 1 30s

创建 StorageClass

class.yaml 内容比较少,可以不用下载,具体内容如下

class.yaml 下载地址

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
archiveOnDelete: "false"

️ 注意

provisioner 必须和上面得 Deployment 的 YAML 文件中 PROVISIONER_NAME 的值保持一致。

创建 storageclass

# 创建
kubectl apply -f class.yaml
# 输出如下
storageclass.storage.k8s.io/managed-nfs-storage created

查看状态

kubectl get storageclass
# 输出如下
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
managed-nfs-storage fuseim.pri/ifs Delete Immediate false 53s

创建 PVC

创建 tomcat-storageclass-pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: tomcat
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 500Mi

部署 yaml

kubectl  apply  -f tomcat-storageclass-pvc.yaml
# 输出如下
persistentvolumeclaim/tomcat created

查看状态

kubectl get pvc
# 输出如下
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
tomcat Bound pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec 500Mi RWX managed-nfs-storage 48s

pod 使用添加 pvc

还拿之前的 tomcat 做实验,我们把 tomcat 目录下的 logs 拿到本地 nfs 中。

️ 注意

如果遇到使用PVC 创建 pod 的时候发现无法创建成功。出现一下报错的时候请参考 kubernetes 使用 PCV 创建 pod 报错 persistentvolume-controller waiting for a volume to be created

具体 yaml 如下:

apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deployment
labels:
app: tomcat
spec:
replicas: 3
selector:
matchLabels:
app: tomcat
minReadySeconds: 1
progressDeadlineSeconds: 60
revisionHistoryLimit: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: wenlongxue/tomcat:tomcat-demo-62-123xw2
imagePullPolicy: Always
ports:
- containerPort: 8080
resources:
requests:
memory: "2Gi"
cpu: "80m"
limits:
memory: "2Gi"
cpu: "80m"
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 180
periodSeconds: 5
timeoutSeconds: 3
successThreshold: 1
failureThreshold: 30
volumeMounts:
- mountPath: "/usr/local/tomcat/logs"
name: tomcat
# pvc 部分
volumes:
- name: tomcat
persistentVolumeClaim:
claimName: tomcat
---
# Service 服务部分
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
labels:
app: tomcat
spec:
selector:
app: tomcat
ports:
- name: tomcat-port
protocol: TCP
port: 8080
targetPort: 8080
type: ClusterIP
---
# ingress 服务部分
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tomcat
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- hosts:
- tomcat.cnsre.cn
secretName: tls-secret
rules:
- host: tomcat.cnsre.cn
http:
paths:
- path: "/"
pathType: Prefix
backend:
service:
name: tomcat-service
port:
number: 8080

部署 pod 服务

kubectl  apply  -f tomcatc.yaml
# 输出如下
deployment.apps/tomcat-deployment created

查看状态

kubectl get pod
# 输出如下
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-fd74f99b4-wr58j 1/1 Running 0 76m
tomcat-deployment-7588b5c8fd-cnwvt 1/1 Running 0 59m
tomcat-deployment-7588b5c8fd-kl8fj 1/1 Running 0 59m
tomcat-deployment-7588b5c8fd-ksbg9 1/1 Running 0 59m

查看 PV PVC

[root@master tomccat]# kubectl  get  pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec 500Mi RWX Delete Bound default/tomcat managed-nfs-storage 65m NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/tomcat Bound pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec 500Mi RWX managed-nfs-storage 65m

查看 nfs server 目录中信息

[root@node1 ~]# ll /home/bsh/nfs/default-tomcat-pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec/
总用量 220
-rw-r-----. 1 root root 22217 9月 3 14:49 catalina.2021-09-03.log
-rw-r-----. 1 root root 0 9月 3 14:41 host-manager.2021-09-03.log
-rw-r-----. 1 root root 2791 9月 3 14:49 localhost.2021-09-03.log
-rw-r-----. 1 root root 118428 9月 3 15:31 localhost_access_log.2021-09-03.txt
-rw-r-----. 1 root root 0 9月 3 14:41 manager.2021-09-03.log

文章链接

Kubernetes 持久化数据存储 StorageClass的更多相关文章

  1. IOS中的数据存储方式,特点,使用情况

    数据存储的核心都是写文件,主要有四种持久化方式:属性列表(Plist),对象序列化,SQLite数据库,CoreData. 存储Plist: 键值进行存储,不能存储对象.对象需要序列化编码才能写入文件 ...

  2. 011.Kubernetes使用共享存储持久化数据

    本次实验是以前面的实验为基础,使用的是模拟使用kubernetes集群部署一个企业版的wordpress为实例进行研究学习,主要的过程如下: 1.mysql deployment部署, wordpre ...

  3. Kubernetes 系列(七):持久化存储StorageClass

    前面的课程中我们学习了 PV 和 PVC 的使用方法,但是前面的 PV 都是静态的,什么意思?就是我要使用的一个 PVC 的话就必须手动去创建一个 PV,我们也说过这种方式在很大程度上并不能满足我们的 ...

  4. velero 备份、迁移 kubernetes 应用以及持久化数据卷

    velero 是heptio 团队开源的kubernetes 应用以及持久化数据卷备份以及迁移的解决方案,以前的名字为ark 包含以下特性: 备份集群以及恢复 copy 当前集群的资源到其他集群 复制 ...

  5. Kubernetes 持久化存储是个难题,解决方案有哪些?\n

    像Kubernetes 这样的容器编排工具正在彻底改变应用程序的开发和部署方式.随着微服务架构的兴起,以及基础架构与应用程序逻辑从开发人员的角度解耦,开发人员越来越关注构建软件和交付价值. Kuber ...

  6. Android基础总结(5)——数据存储,持久化技术

    瞬时数据:指那些存储在内存当中,有可能会因为程序广播或其他原因导致内存被回收而丢失的数据. 数据持久化:指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不丢失. ...

  7. 解决持久化数据太大,单个节点的硬盘无法存储的问题;解决运算量太大,单个节点的内存、CPU无法处理的问题

    需要学习的技术很多,要自学新知识也不是一件容易的事,选择一个自己比较感兴趣的会是一个比较好的开端,于是,打算学一学分布式系统. 带着问题,有目的的学习,先了解整体架构,在深入感兴趣的细节,这是我的计划 ...

  8. Android学习之基础知识九—数据存储(持久化技术)

    数据持久化是将那些内存中的瞬时数据保存到存储设备,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失. Android系统中主要提供了3种方式用于简单地实现数据持久化功能:文件存储.SharedP ...

  9. iOS开发——数据持久化&使用NSUserDefaults来进行本地数据存储

    使用NSUserDefaults来进行本地数据存储   NSUserDefaults适合存储轻量级的本地客户端数据,比如记住密码功能,要保存一个系统的用户名.密码.使用NSUserDefaults是首 ...

随机推荐

  1. <题解>[SDOI2017]硬币游戏

    solutions 题面(loj) 题面(luogu) 这个题吧是我很久很久以前留下的坑了,到了今天才补好.(是不是太菜了) 暴力 这个和之前的题解一样,确实可以用 trie 树,这复杂度是\(\ma ...

  2. Salesforce Integration 概览(二) Remote Process Invocation—Request and Reply(远程进程调用--请求和响应)

    本篇参考:https://resources.docs.salesforce.com/sfdc/pdf/integration_patterns_and_practices.pdf 我们在项目中,经常 ...

  3. CVE-2020-1472

    主要记下流程 我擦,这个洞mimikatz也可以搞 但是我就不记录了 检验漏洞是否存在 https://github.com/SecuraBV/CVE-2020-1472 先获取域控信息 然后测试能否 ...

  4. openssl常用命令行汇总

    openssl常用命令行汇总 随机数 openssl rand -out rand.dat -base64 32 摘要 直接做摘要 openssl dgst -sha1 -out dgst.dat p ...

  5. Python日志记录

    官方文档:https://docs.python.org/2/library/logging.html logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为, ...

  6. 【加解密】使用CFSSL生成证书并使用gRPC验证证书

    写在前面的话 CFSSL是CloudFlare旗下的PKI/TLS工具.可以用于数字签名,签名验证和TLS证书捆绑的命令行工具和HTTP API服务器. 是使用golang语言开发的证书工具. 官方地 ...

  7. 【笔记】求数据的对应主成分PCA(第一主成分)

    求数据的第一主成分 (在notebook中) 将包加载好,再创建出一个虚拟的测试用例,生成的X有两个特征,特征一为0到100之间随机分布,共一百个样本,对于特征二,其和特征一有一个基本的线性关系(为什 ...

  8. STP相关概念

    1)桥ID(Bridge ID)=Bridge Priority+MAC 2)  端口ID(Port ID)=Port Priority+Port No 3)桥根 4)非桥根 5)根端口 6)指定端口 ...

  9. NOIP 模拟 $17\; \rm 时间机器$

    题解 \(by\;zj\varphi\) 一道贪心的题目 我们先将节点和电阻按左边界排序,相同的按右边界排序 对于每一个节点,我们发现,选取左边界小于等于它的电阻中右边界大于它且最接近的它的一定是最优 ...

  10. NOIP 模拟 $16\; \rm Lost My Music$

    题解 \(by\;zj\varphi\) 一道凸包的题 设 \(\rm dep_u\) 表示节点 \(u\) 的深度,那么原式就可化为 \(-\frac{c_v-c_u}{dep_v-dep_u}\) ...