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动态申请,此处明白使用的方法和内在逻辑就可以.