博主信息
Sky
博文
253
粉丝
0
评论
0
访问量
6102
积分:0
P豆:585

Kubernetes 持久化数据存储 StorageClass

2021年10月16日 23:56:19阅读数:15博客 / Sky

PV 和 PVC 模式要先创建好 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/v1kind: Deploymentmetadata:
 name: nfs-client-provisioner  labels:
   app: nfs-client-provisioner  # replace with namespace where provisioner is deployed
 namespace: defaultspec:
 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/v1kind: StorageClassmetadata:
 name: managed-nfs-storageprovisioner: 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: PersistentVolumeClaimapiVersion: v1metadata:
 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: v1kind: Servicemetadata:      
 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/v1kind: Ingressmetadata:
 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

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • redis的所有都是保在内中,redis崩掉会丢失。redis就是把在磁盘上。利用永介质将进程保,在特定的时间将保进行恢复的工作机制称为
    redis库教程栏目介绍redis的
    快照指的是将某一时刻的所有写入硬盘,快照是内的二进制序列形式,在上非常紧凑,而AOF日志记录的是内修改的指令记录文本。
    RDB是指在指定的时间间隔内将内中的集快照写入磁盘中,fork一个子进程,先将集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩
    在php中,redis全称Remote Dictionary Server(远程服务),是一款内高速缓库,其模型为“key-value”,并支丰富的结构,如string、list、
    Redis缓是一个开源的使用ANSIC语言编写、支网络、可基于内亦可的日志型、Key-Value库,并提供多种语言的API。
    在计算机中,dump的中文意思为“转”,一般指将导出、转成文件或静态形式,即将动态(易失)的,保为静态的)。
    Redis的特点有:1、redis读写速度非常快,因为它把都读取到内当中操作;2、redis虽然的读取都在内当中,但是最终它是支到磁盘当中;3、redis提供了丰富的结构
    全称:REmote DIctionary Server,是可支网络、可基于内亦可的日志型、Key-Value高性能库,本栏目将详细讲解。
    Redis是一个开源的试用ANSI C语言编写的、遵守BSD协议、支网络、可基于内的日志型、key-value库;通常被称为结构服务器。
    Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支网络、可基于内亦可的日志型、Key-Value库,并提供多种语言的API。
    Redis支结构有:1、string;2、双向链表;3、dict;4、排序set;5、Hash类型。
    Redis即远程字典服务,是一个开源的使用ANSI C语言编写、支网络、可基于内亦可的日志型、Key-Value库,并提供多种语言的API。
    Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支网络、可基于内亦可的日志型、Key-Value 库,并提供多种语言的 API的非关系型库。
    Redis是一个开源的使用ANSI C语言编写、支网络、可基于内亦可的日志型、Key-Value库,并提供多种语言的API,redis的默认端口号是6379。
    Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支网络、可基于内亦可的日志型、Key-Value库,并提供多种语言的

    2021-01-26

    860

    Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支网络、可基于内亦可的日志型、Key-Value库,并提供多种语言的
    Redis是完全开源免费的,遵守BSD协议,是⼀个⾼性能(NOSQL)的key-value库。
    本篇文章给大家整理分享一些Redis高频面试题,带大家过一遍Redis核心知识点,涉及到结构、内模型、 IO 模型、 RDB等,希望对大家有所帮助!
    对象关系映射ORM的缺点是:1、执行效率低,自动进行关系库的映射,需要消耗系统性能;2、不够灵活,对于复杂的查询,ORM力不从心;3、很有可能将全部提取到内对象中,所有属性,将消耗更多的内空间