kubernetes 中使用 NFS 作为共享存储

lance 2020-04-01 AM 319℃ 0条

Persistent Volume(持久化卷) 简称 PV,是一个 K8S 资源对象,我们可以单独创建一个 PV,它不和 Pod 直接发生关系,而是通过 Persistent Volume Claim,简称PVC来实现动态绑定,我们会在 Pod 定义里指定创建好的 PVC, 然后 PVC 会根据 Pod 的要求去自动绑定合适的 PV 给 Pod 使用。


持久化卷下 PV 和 PVC 概念

Persistent Volume(PV) 是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源一样,PV 也是集群中的资源。 PV 是 Volume 之类的卷插件,但具有独立于使用 PV 的 Pod 的生命周期。此 API 对象包含存储实现的细节,即 NFS、iSCSI 或特定于云供应商的存储系统。
 
PersistentVolumeClaim(PVC) 是用户存储的请求。它与 Pod 相似,Pod 消耗节点资源,PVC 消耗 PV 资源。Pod 可以请求特定级别的资源(CPU 和内存)。PVC 声明可以请求特定的大小和访问模式(例如,可以以读/写一次或只读多次模式挂载)。


它和普通 Volume 的区别

普通 Volume 和使用它的 Pod 之间是一种静态绑定关系,在定义Pod的文件里,同时定义了它使用的 Volume。
Volume 是 Pod 的附属品,我们无法单独创建一个 Volume,因为它不是一个独立的 K8S 资源对象。

前提准备

按照上篇文章,准备好机器并部署好 k8s 集群环境
master 节点 2 台,node 节点 2 台,harbor 机器 1 台,共计有 5 台机器

实验

1)这里使用 harbor 机器,搭建 NFS 服务

yum -y install nfs-utils rpcbind
vim /etc/exports
/data/k8s/ 10.18.30.0/24(sync,rw,no_root_squash)

mkdir /data/k8s/ && chmod 755 /data/k8s/
systemctl start nfs
systemctl enable nfs

ps aux | grep nfs
root     15812  0.0  0.0      0     0 ?        S<   11:02   0:00 [nfsd4_callbacks]
root     15818  0.0  0.0      0     0 ?        S    11:02   0:00 [nfsd]
root     15819  0.0  0.0      0     0 ?        S    11:02   0:00 [nfsd]
root     15820  0.0  0.0      0     0 ?        S    11:02   0:00 [nfsd]
root     15821  0.0  0.0      0     0 ?        S    11:02   0:00 [nfsd]
root     15822  0.0  0.0      0     0 ?        S    11:02   0:00 [nfsd]
root     15823  0.0  0.0      0     0 ?        S    11:02   0:00 [nfsd]
root     15824  0.0  0.0      0     0 ?        S    11:02   0:00 [nfsd]
root     15825  0.0  0.0      0     0 ?        S    11:02   0:00 [nfsd]
root     15857  0.0  0.0 112728   972 pts/0    R+   11:02   0:00 grep --color=auto nfs

 
2)在 node1 节点上测试

yum -y install nfs-utils

showmount -e 10.18.30.33
Export list for 10.18.30.33:
/data/k8s 10.18.30.0/24

 
3)在 master1 节点上创建 pv
新创建的 pv 状态为 Available,这是因为它还没有绑定到任何的 pvc 上面,当定义完 pvc 后,就可以自动绑定了。

cd /etc/ansible/

vim mypv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data/k8s/
    server: 10.18.30.33

kubectl create -f mypv.yaml 
persistentvolume/pv001 created

kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv001   10Gi       RWX            Retain           Available                                   11s

 
4)在 master1 节点上创建 pvc
可以看到,pvc 状态为 Bound,它绑定了 pv001

vim mypvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 8Gi

kubectl create -f mypvc.yaml 
persistentvolumeclaim/myclaim created

kubectl get pvc
NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
myclaim   Bound    pv001    10Gi       RWX                           6s

 
5)在 master1 节点上定义 pod

vim pvpod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: httpd-pvpod
spec:
  containers:
  - image: httpd
    name: httpd-withpvc-pod
    imagePullPolicy: Always
    volumeMounts:
    - mountPath: "/usr/local/apache2/htdocs/"
      name: httpd-volume
  volumes:
    - name: httpd-volume
      persistentVolumeClaim:
        claimName: myclaim

kubectl create -f pvpod.yaml 
pod/httpd-pvpod created

kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
httpd-pvpod   1/1     Running   0          69s

kubectl describe pod httpd-pvpod
Mounts:
      /usr/local/apache2/htdocs/ from httpd-volume (rw)
Volumes:
  httpd-volume:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  myclaim
    ReadOnly:   false

 
6)验证
01 到 harbor 机器上的 NFS 共享目录下创建一个文件

cd /data/k8s/
echo "Test file" > 1.html

 
02 在 master1 节点上进入到 httpd-pod 里

kubectl exec -it httpd-pvpod bash
cat /usr/local/apache2/htdocs/1.html

 
03 在 master1 节点上删除 httpd-pvpod,在 harbor 机器上的 NFS 共享目录查看文件还在不在

# master1
kubectl delete pod httpd-pvpod

# harbor
cat /data/k8s/1.html

 
04 在 master1 节点上重建 httpd-pod

kubectl create -f pvpod.yaml

 
05 在 master1 节点上 curl 访问

kubectl get pod httpd-pvpod -o wide //查看其对应的IP
NAME          READY   STATUS    RESTARTS   AGE   IP           NODE          NOMINATED NODE   READINESS GATES
httpd-pvpod   1/1     Running   0          8s    172.20.3.6   10.18.30.29   <none>           <none>

curl 172.20.3.6/1.html
Test file

扩展阅读

http://www.showerlee.com/archives/2280


标签: linux, kubernetes, k8s

非特殊说明,本博所有文章均为博主原创。

觉得文章不错,打赏一点吧,1分也是爱😀

WeChat Pay

微信打赏

Alipay

支付宝打赏

评论啦~