文章链接

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. edraw mindmaster pro 8.1.0安装破解教程

    Edraw MindMaster Pro 8.1.0是一款思维导图(脑图)设计软件,头脑风暴.思维整理.项目策划.团队协作,多场景提升您的效率,功能齐全,个人觉得比xmind好用上手,文章手把手教你安 ...

  2. php-socket通信演示

    client: error_reporting(E_ALL); set_time_limit(0); echo "<h2>TCP/IP Connection</h2> ...

  3. DC-5靶机

    仅供个人娱乐 靶机信息 下载地址:http://www.five86.com/downloads/DC-5.zip 一.主机扫描 arp-scan -l nmap -p 1-65535 -A  -sV ...

  4. Java 在Word中创建多级项目符号列表和编号列表

    本文分享通过Java程序代码在Word中创建多级项目符号列表和编号列表的方法.程序运行环境如下: IntelliJ IDEA 2018(JDK 1.8.0) Word 2013 Word Jar包:F ...

  5. C++ //this 指针的使用 //1 解决名称冲突 //2 返回对象本身 用 *this

    1 //this 指针的使用 2 //1 解决名称冲突 3 //2 返回对象本身 用 *this 4 5 #include <iostream> 6 #include <string ...

  6. C++ 2(将类分文件) //点和圆的关系 //设计一个圆形类 和一个点类 计算点和圆的关系 //点到圆心的距离 == 半径 点在圆上 //点到圆心的距离 > 半径 点在圆外 //点到圆心的距离 < 半径 点在圆内 //点到圆心的距离 获取 ....... (x1 -x2)^2 + (y1-y2)^2 开根号 和半径对比 // 计算 可以 两边同时 平方

    1 源文件 main.cpp 2 //点和圆的关系 3 //设计一个圆形类 和一个点类 计算点和圆的关系 4 //点到圆心的距离 == 半径 点在圆上 5 //点到圆心的距离 > 半径 点在圆外 ...

  7. 运行第一个程序!hello world!

    第一个程序:1 //打印 hello world 2 3 #include <stdio.h> 4 int main() 5 { 6 printf("hello world!\n ...

  8. 字节跳动Android春招,三轮面试,夺命连环问,心态崩了

    我是春招参加字节面试的,现在已经入职俩月啦,当时没有及时记录下来拖到现在...我尽量回忆当时的内容希望能帮到大家. 投的部门是深圳字节影像,不得不说这个部门的效率,上午投下午就接到hr的电话约面试时间 ...

  9. Convert a Private Project on bitbucket.com to a github Public Project

    Create a public repo on github, you can add README or License files on the master branch, suppose th ...

  10. Compile Java Codes in Linux Shell instead of Ant Script

    The following is frequently used ant script, compile some java source codes with a libary path, then ...