k8s创建pv&pvc

k8s创建pv&pvc

pv&pvc简介

k8s提供了emptyDir,hostPath,rbd,cephfs等存储方式供容器使用,不过这些存储方式都有一个缺点:开发人员必须得知指定存储的相关配置信息,才能使用存储.例如要使用cephfs,Pod的配置信息就必须指明cephfsmonitor,user,selectFile等等,而这些应该是系统管理员的工作.对此,k8s提供了两个新的API资源:PersistentVolume,PersistentVolumeClaim

PV(PersistentVolume)是管理员已经提供好的一块存储.在k8s集群中,PVNode一样,是一个资源

PVC(PersistentVolumeClaim)是用户对PV的一次申请.PVC对于PV就像Pod对于Node一样,Pod可以申请CPUMemory资源,而PVC也可以申请PV的大小与权限

有了PersistentVolumeClaim,用户只需要告诉Kubernetes需要什么样的存储资源,而不必关心真正的空间从哪里分配,如何访问等底层细节信息;这些Storage Provider的底层信息交给管理员来处理,只有管理员才应该关心创建PersistentVolume的细节信息

实验

实验环境:

IP 备注
192.168.1.10 master

目的:使用nfs类型的PV,并使用Job验证PV创建是否创建成功

  1. 在host1上创建nfs服务器,用于提供存储
    安装nfs服务端:
yum install nfs-utils rpcbind

创建用于nfs服务的存储文件夹:

mkdir -p /data/nfs

编辑/etc/exports文件:

# vim /etc/exports
/data/nfs 192.168.1.0/24(rw,sync)

开启nfs服务:

systemctl start nfs-server.service

检验是否开启成功:

# showmount -e
Export list for host1:
/data/nfs 192.168.1.0/24

  1. 创建pv
    编辑pv资源的配置文件:
[kube@host1 ~]$ cat pv_nfs.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfspv1
spec:
  
  capacity:
    storage: 1Gi
  #指定访问模式
  accessModes:
    #pv能以readwrite模式mount到单个节点
    - ReadWriteOnce
  #指定pv的回收策略,即pvc资源释放后的事件.recycle(不建议,使用动态供给代替)删除pvc的所有文件
  persistentVolumeReclaimPolicy: Recycle
  #指定pv的class为nfs,相当于为pv分类,pvc将指定class申请pv
  storageClassName: mynfs
  #指定pv为nfs服务器上对应的目录
  nfs:
    path: /data/nfs
    server: 192.168.1.10

应用该pv资源:

[kube@host1 ~]$ kubectl apply -f pv_nfs.yml 
persistentvolume/nfspv1 created

查看该pv资源:

[kube@host1 ~]$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
nfspv1    1Gi        RWO            Recycle          Available             mynfs                      14s
  1. 创建pvc
    编辑pvc资源配置文件:
[kube@host1 ~]$ cat pvc_nfs.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nfspvc1
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: mynfs

应用pvc配置文件:

[kube@host1 ~]$ kubectl apply -f pvc_nfs.yml
persistentvolumeclaim/nfspvc1 created

查看该pvc资源:

[kube@host1 ~]$ kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfspvc1   Bound     nfspv1    1Gi        RWO            mynfs          24s

  1. 创建应用资源,使用pvc存储
    编辑应用资源配置文件:
[kube@host1 ~]$ cat pvjob.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: pvjob
spec:
  template:
    spec:
      containers:
      - name: bbox1
        image: busybox
        args:
        - /bin/sh
        - -c
        - echo "hello pv" > /mydata/hello
        volumeMounts:
        - mountPath: "/mydata"
          name: mydata
      restartPolicy: Never
      volumes:
      - name: mydata
        persistentVolumeClaim:
          claimName: nfspvc1

该job将在nfs的volume创建一个hello文件,打印”hello pv”字符串

应用该Job资源:

[kube@host1 ~]$ kubectl apply -f pvjob.yml
job.batch/pvjob created

查看host1上的/data/nfs目录,检查实验结果:

[kube@host1 ~]$ cat /data/nfs/hello
hello pv

实验成功!

排错

在这次实验中出现了几个错误:

1. 使用pvc存储的pod一直处于pending状态,无法启动

[kube@host1 ~]$ kubectl get pod
NAME          READY     STATUS    RESTARTS   AGE
pvjob-47cwq   0/1       Pending   0          5s
[kube@host1 ~]$ kubectl get pod
NAME          READY     STATUS    RESTARTS   AGE
pvjob-47cwq   0/1       Pending   0          3m

查看该pod的启动事件:

[kube@host1 ~]$ kubectl describe pod pvjob-47cwq
Name:               pvjob-47cwq
Namespace:          default
Node:               host3/192.168.1.30
Status:             Pending
IP:
Events:
  Type     Reason       Age   From               Message
  ----     ------       ----  ----               -------
  Normal   Scheduled    44s   default-scheduler  Successfully assigned default/liveness to host3
  Warning  FailedMount  44s   kubelet, host3     MountVolume.SetUp failed for volume "nfspv1" : mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/91ddd2ee-a2b8-11e8-a8f5-525400909158/volumes/kubernetes.io~nfs/nfspv1 --scope -- mount -t nfs 192.168.1.10:/data/nfs /var/lib/kubelet/pods/91ddd2ee-a2b8-11e8-a8f5-525400909158/volumes/kubernetes.io~nfs/nfspv1
Output: Running scope as unit run-24516.scope.
mount: wrong fs type, bad option, bad superblock on 192.168.122.10:/data/nfs,
       missing codepage or helper program, or other error
       (for several filesystems (e.g. nfs, cifs) you might
       need a /sbin/mount.<type> helper program)

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

注意到报错信息:wrong fs type, bad option, bad superblock on 192.168.1.10:/data/nfs,这是因为host3没有安装nfs-utils软件包,无法识别nfs类型的文件系统,也无法作为nfs的客户端使用
解决方案:安装nfs-utils软件包,删除之前创建失败的Job资源并重新创建

[root@host3 ~]# yum install nfs-utils -y
...
Installed:
  nfs-utils.x86_64 1:1.3.0-0.54.el7

[kube@host1 ~]$ kubectl delete pod pvjob-47cwq
pod "pvjob-47cwq" deleted

[kube@host1 ~]$ kubectl apply -f pvjob-47cwq
job.batch/pvjob created

可以看到,Job资源正常创建:

[kube@host1 ~]$ kubectl get pod
NAME          READY     STATUS              RESTARTS   AGE
pvjob-47cwq   0/1       ContainerCreating   0          6s

  1. 使用pvc的job执行失败
[kube@host1 ~]$ kubectl get pod
NAME          READY     STATUS    RESTARTS   AGE
pvjob-c25xg   0/1       Error     0          25s
pvjob-db6fb   0/1       Error     0          32s
pvjob-hf7px   0/1       Error     0          15s

查看执行失败Job的log日志:

[kube@host1 ~]$ kubectl logs pvjob-74g64
/bin/sh: can't create /mydata/hello: Permission denied

解决方案:

Permission denied多见于普通用户执行高权限命令失败,不过busybox容器本身使用的就是root用户,因此不存在这个问题.在nfs中,nfs服务端没有权限访问挂载的目录也会导致这个问题

更改目录属主为nfsnobody:

[kube@host1 ~]$ sudo chown nfsnobody /data/nfs

删除原来Job并重新创建:

[kube@host1 ~]$ kubectl delete jobs pvjob.yml
job.batch "pvjob" deleted

[kube@host1 ~]$ kubectl apply -f pvjob.yml
job.batch/pvjob created

可以看到,Job执行成功:

[kube@host1 ~]$ kubectl get pod
NAME          READY     STATUS      RESTARTS   AGE
pvjob-pct6b   0/1       Completed   0          8s

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101896.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 不用加减乘除做加法

    不用加减乘除做加法

    2020年11月19日
    228
  • Eclipse中建多层级包时出现的问题「建议收藏」

    Eclipse中建多层级包时出现的问题「建议收藏」最近一直在学习idea的使用,好久没有用Eclipse了,今天想试着写一个功能,但是在Eclipse中创建包时出现问题了。创建的包都成为平级了。那么Eclipse中如何创建多层包呢?解决方案:    方法一:         1)先在src文件夹下创建com包,在com包里面创建一个类,例如:点击Finish就会出现如下:    2)以此类推建想要建的包,在删除之前的Test类即可。以下是我的效果…

    2022年6月13日
    34
  • (c语言)选择排序法和冒泡排序法

    (c语言)选择排序法和冒泡排序法问题描述:给定一个数组(或者输入一个数组),分别运用选择排序法和冒泡排序法将所要的结果输出。程序分析:                    选择排序1>.对于选择排序,首先理解排序的思想。给定一个数组,这种思想首先假定数组的首元素为最大(最小)的。此时就要利用3个变量i,j,k表示元素的下标。i表示当前,j表示找到的最大(最小)的下标,k用

    2022年6月25日
    26
  • AEJoy ——表达式代码列表和示例(四)【代码详解】「建议收藏」

    bounce表达式系列惯性bounce表达式这个反弹表达式允许在你的层位置有一个弹性的感觉,效果图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5TFA2Glo-1638214074097)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7d3e186d50e74ee09ce97abe381beae9~tplv-k3u1fbpfcp-watermark.image?)]表达式amp=.1;freq

    2022年4月13日
    50
  • Loadrunner11激活成功教程完成添加License失败

    Loadrunner11激活成功教程完成添加License失败Loadrunner11激活成功教程成功后,用deletelicense.exe工具把License全删除了,启动 Loadrunner,进入目录CONFUGURATION—>loadrunnerlicense,添加license提示我“Licensesecurityviolation.Operationisnotallowed”,于是我猜想是不是我运行deletelicense.exe工

    2022年7月22日
    19
  • plotyy函数_Matlab plotyy函数的使用及问题总结「建议收藏」

    plotyy函数_Matlab plotyy函数的使用及问题总结「建议收藏」Matlabplotyy函数的使用及问题总结1.新建一个.m文件,文件名为plotyy.m,并为其填写代码如下:x=0:0.001:20;y1=200*exp(-0.05*x).*sin(x);y2=0.8*exp(-0.5*x).*sin(10*x);holdon;[AX,H1,H2]=plotyy(x,y1,x,y2,@plot);%获取坐标轴、图像句柄set(get(AX(1),’yl…

    2022年6月18日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号