k8存储使用介绍


hostPath
hostPath 卷能将主机节点文件系统上的文件或目录挂载到您的 Pod 中

代码示例:

kind: Deployment
metadata:
  name: nginx-pod
  namespace: default
spec:
  replicas: 3
  template:
    metadata:
      labels:
        k8s-app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        volumeMounts:
        # 在容器中的路径    node节点上的内容被关联到 pod containr的 /test-pd路径下 exec进入pod容器的路径内可以看到节点上的内容
        - mountPath: /test-pod
          name: test-volume
      volumes:
      - name: test-volume
        hostPath:
           #directory location on host 绑定的节点的文件路径
           path: /data
           # this field is optional 类型为目录,此目录必须存在
           type: Directory
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: default
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 32000
  selector:
    k8s-app: nginx-pod

k8存储介绍之 PV PVC

PV全称叫做PersistentVolume ,持久化存储卷。它是用来描述或者说用来定义一个存储卷的。

PersistentVolumeClaim 持久卷声明 (PVC)

PVC全称 PersistentVolumeClaim 是用来描述希望使用什么样的或者说是满足什么条件的存储,也就是持久化存储声明。使用这个来描述该容器需要一个什么存储。比如下面使用NFS的PVC:

Persistent Volume主要是为了管理集群的存储,供pod通过pvc来申请使用.

自己的理解是这样的.

在存储卷上面创建PV持久卷,pod 通过pvc申请pv资源,来供pod使用,大概就是这样的调用逻辑.调用拓扑图如下:

实验示例:

使用nfs类型的PV,并使用Deployment部署nginx服务来验证PV创建是否创建成功.

一、安装nfs服务

在k8s master节点 上创建nfs服务器,用于提供存储

1、安装nfs服务端:
# yum install nfs-utils rpcbind
2、创建用于nfs服务的存储文件夹:
# mkdir -p /data/nfs-server
3、编辑/etc/exports文件:
[root@k8s-master ~]# vim /etc/exports
/data/nfs-server  192.168.10.0/24(rw,async)
4、开启nfs服务:
# systemctl start nfs-server.service

检验是否开启成功:
[root@k8s-master ~]# showmount -e
Export list for k8s-master:
/data/nfs-server 192.168.10.0/24
[root@k8s-master ~]# 
#创建好nfs服务后不需要再客户端挂载,保证nfs服务端服务正常即可.

二、创建pv对象
1、编辑pv资源的配置文件,文件如下:

[root@k8s-master ~]# cat pv.yaml 
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-testpv
  labels:
    name: nfs-testpv
spec:
  #指定pv为nfs服务器上对应的目录
  nfs:
    path: /data/nfs-server
    server: 192.168.10.10
  #指定pv的回收策略,即pvc资源释放后的事件,recycle删除pvc的所有文件(不建议生产环境使用)
  persistentVolumeReclaimPolicy: Recycle
  #pv存储类名称
  storageClassName: mynfs-pv
  #指定访问模式
  accessModes:
    - ReadWriteOnce
  # 设置存储空间大小
  capacity:
    storage: 2Gi

[root@k8s-master ~]# 

accessModes:支持三种类型

  • ReadWriteMany 多路读写,卷能被集群多个节点挂载并读写

  • ReadWriteOnce 单路读写,卷只能被单一集群节点挂载读写

  • ReadOnlyMany 多路只读,卷能被多个集群节点挂载且只能读

2、创建该PV资源:

[root@k8s-master ~]# kubectl apply -f pv.yaml 
persistentvolume/nfs-testpv created
[root@k8s-master ~]# 

3、查看该pv资源:

[root@k8s-master ~]# kubectl get pv
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM      STORAGECLASS      REASON   AGE
nfs-testpv      2Gi        RWO            Recycle          Available               mynfs-pv                   52s

至此,PV资源创建成功,接下来创建pvc,供pod来申请使用

三、创建pvc资源
1、编辑pvc资源配置文件:

[root@k8s-master ~]# cat pvc.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nfs-testpvc
spec:
  # PVC也需要定义访问模式,不过它的模式一定是和现有PV相同或者是它的子集,否则匹配不到PV.
  accessModes:
    - ReadWriteOnce
  # 定义资源要求PV满足这个PVC的要求才会被匹配到
  resources:
    requests:
      storage: 2Gi
  storageClassName: mynfs-pv
[root@k8s-master ~]# 

这个PVC就会和上面的PV进行绑定,它也有一些原则:

1>.PV和PVC中的spec关键字段要匹配,比如存储(storage)大小,访问模式.

2>. PV和PVC中的storageClassName字段必须一致.

2、应用pvc配置文件:

[root@k8s-master ~]# kubectl apply -f pvc.yaml 
persistentvolumeclaim/nfs-testpvc created

3、查看该pvc资源:

[root@k8s-master ~]# kubectl get pvc
NAME                          STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-testpvc                   Bound     nfs-testpv                                 2Gi        RWO            mynfs-pv       5m1s

到这里,pvc也就创建完成了,接下来就是pod怎么去使用pvc.

四、创建nginx pod资源,使用pvc存储.

1、这里使用 Deployment 创建3副本的nginx pod,使用volumes来绑定pvc的信息,并创建svc来访问pod来验证.

[root@k8s-master ~]# cat  pvc-pod-nginx.yml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-pod
  namespace: default
spec:
  replicas: 3
  template:
    metadata:
      labels:
        k8s-app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        #容器策略
        imagePullPolicy: IfNotPresent
        #容器内部的挂载点,就是将pvc的卷挂载到pod容器的这个目录下.
        volumeMounts:
        - mountPath: /usr/share/nginx/html/
          name: test-volume
      #这里是挂载卷部分,这是最最最重点部分,volumes name 要和volumeMounts name名称一致,claimName为pvc的名称.
      volumes:
      - name: test-volume
        persistentVolumeClaim:
          claimName: nfs-testpvc
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: default
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 32000
  selector:
    k8s-app: nginx-pod
[root@k8s-master ~]# 

2、创建nginx pod及svc

root@k8s-master ~]# kubectl apply -f pvc-pod-nginx.yml

3、查看pod及svc创建信息.

root@k8s-master ~]# kubectl get pod -o wide
NAME                                    READY   STATUS                  RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES
nginx-pod-5bdcc49bb7-6f7b7              1/1     Terminating             1          57m     10.244.2.44   k8s-node01   <none>           <none>
nginx-pod-5bdcc49bb7-8grz9              1/1     Terminating             1          57m     10.244.2.45   k8s-node01   <none>           <none>
nginx-pod-5bdcc49bb7-dxn56              1/1     Running                 0          57m     10.244.3.55   k8s-node02   <none>           <none>
nginx-pod-5bdcc49bb7-mz9cm              1/1     Running                 0          43m     10.244.3.58   k8s-node02   <none>           <none>
nginx-pod-5bdcc49bb7-tcx48              1/1     Running                 0          43m     10.244.3.57   k8s-node02   <none>           <none>

[root@k8s-master ~]# kubectl get svc -o wide
NAME                      TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE    SELECTOR
nginx-svc                 NodePort    10.1.131.6    <none>        80:32000/TCP   58m    k8s-app=nginx-pod

由于我是将nfs的 /data/nfs-server目录作为pvc申请的存储挂载到nginx pod的访问目录下,所以我在/data/nfs-server目录创建一个index.html文件,nginx是可以访问到的

root@k8s-master ~]# cat /data/nfs-server/index.html 
hello pvc
[root@k8s-master ~]# 

我的pod都是在node2节点上面,所以我用node2节点的ip:32000就可以访问到我定义的index.html内容.

 

至此,pod使用pvc完成,这种是静态pv使用的申请,后面会在总结pv动态申请,此处明白使用的方法和内在逻辑就可以.

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM