K8s基础教程:深入理解PV与PVC配置(第八讲)如何提问?

2026-05-06 03:111阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1297个文字,预计阅读时间需要6分钟。

K8s基础教程:深入理解PV与PVC配置(第八讲)如何提问?

某些应用需要持久化数据,若直接在Pod所在节点持久化,当Pod因某种原因重建或被调度到其他节点时,将无法访问之前持久化的数据。因此,需要一个公共存储数据的位置。

某些应用是要持久化数据的,如果直接持久化在pod所在节点,当pod因为某种原因重建或被调度另外一台节点,是无法访问到之前持久化的数据,所以需要一个公共存储数据的地方,无论pod删除重建或重新调度到其他节点都能访问原来的数据,使用nfs就可以到达此目的。

一、安装nfs

1.在k8sMaster主节点上安装nfs服务端

apt install -y nfs-kernel-server systemctl start nfs-server systemctl enable nfs-server systemctl status nfs-server

查看安装后的状态为active

创建目录并设置权限

mkdir -p /nfs/data echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports

不要忘了重启nfs-server

systemctl restart nfs-server

2.在两台k8sworker节点上安装nfs客户端

apt install -y nfs-common mkdir -p /nfs/data # 把本地的/nfs/data挂载到主节点上 mount 192.168.59.110:/nfs/data /nfs/data

3.测试

在某台worker节点上往目录中写入测试文件数据

echo "nfs data" >> /nfs/data/test.txt

在所有节点上都能查看到写入的数据,并且是一样的

二、使用原始方式挂载pod数据目录

1.先删除之前dev名称空间下的所有资源

kubectl delete ns dev

2.把ns、deployment、svc资源的描述合并在一个yaml文件中

vi nginx-deploy-svc.yaml

apiVersion: v1 kind: Namespace metadata: name: dev --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx namespace: dev spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx volumeMounts: - name: nginxvolume mountPath: /usr/share/nginx/html volumes: - name: nginxvolume #通过nfs服务挂载 nfs: server: 192.168.59.110 # 此处要特别注意:一定要手动创建nginx子目录,否则pod在过载的时候会报目录不存在异常 path: /nfs/data/nginx --- apiVersion: v1 kind: Service metadata: labels: app: svc-nginx name: svc-nginx namespace: dev spec: selector: app: nginx type: NodePort ports: - port: 8000 protocol: TCP targetPort: 80

3.创建资源对象

kubectl apply -f nginx-deploy-svc.yaml

查看svc的ip与端口号

4.测试

在挂载目录中创建index.html

echo "hello,nfs" >> /nfs/data/nginx/index.html

通过ip端口访问,可以看到读取的就是nfs目录中的内容

现在你可以把dev名称空间删除,然后重新创建这些资源,再次访问的时候,发现数据还在。

三、PV

PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置,与namespace无关

1.先创建nfs目录

# 在master节点执行 mkdir -p /nfs/data/01 mkdir -p /nfs/data/02 mkdir -p /nfs/data/03

2.创建基于nfs的pv对象

(1)创建pv资源文件

vi pv.yaml

(2)编写三个pv资源对象,大小分别是:10M,1G,5G

apiVersion: v1 kind: PersistentVolume metadata: name: pv-10m spec: capacity: storage: 10M accessModes: - ReadWriteMany storageClassName: nfs nfs: path: /nfs/data/01 server: 192.168.59.110 --- apiVersion: v1 kind: PersistentVolume metadata: name: pv-1gi spec: capacity: storage: 1Gi accessModes: - ReadWriteMany storageClassName: nfs nfs: path: /nfs/data/02 server: 192.168.59.110 --- apiVersion: v1 kind: PersistentVolume metadata: name: pv-5gi spec: capacity: storage: 5Gi accessModes: - ReadWriteMany storageClassName: nfs nfs: path: /nfs/data/03 server: 192.168.59.110

(3)创建pv对象

kubectl apply -f pv.yaml

3.查看创建结果

kubectl get pv

pv对象列表

某个pv对象的详细信息

K8s基础教程:深入理解PV与PVC配置(第八讲)如何提问?

四、PVC

PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格

1.创建pvc

(1)创建pvc资源文件

vi pvc.yaml

(2)编写pvc资源申明信息

kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nginx-pvc namespace: dev spec: accessModes: - ReadWriteMany resources: requests: # 申请200M的空间 storage: 200Mi storageClassName: nfs

(3)创建pvc对象

kubectl apply -f pvc.yaml

2.查看创建结果

kubectl get pvc -owide -n dev

由于申请的是200M空间,可以看到k8s自定绑定到合适的pv对象上,即选择大小为1G的pv对象。

再回过头来查看pv对象的绑定信息,可以看到已经和刚刚创建的pvc对象绑定了。

五、绑定pod与pvc

1.创建新的yaml文件

(1)新建资源文件

vi nginx-dp-svc-pvc.yaml

(2)使用persistentVolumeClaim属性指定刚刚创建的nginx-pvc对象

apiVersion: v1 kind: Namespace metadata: name: dev --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx namespace: dev spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx volumeMounts: - name: nginxvolume mountPath: /usr/share/nginx/html volumes: - name: nginxvolume # 使用pvc persistentVolumeClaim: claimName: nginx-pvc --- apiVersion: v1 kind: Service metadata: labels: app: svc-nginx name: svc-nginx namespace: dev spec: selector: app: nginx type: NodePort ports: - port: 8000 protocol: TCP targetPort: 80

(3)创建pod,svc对象

kubectl apply -f nginx-dp-svc-pvc.yaml

2.测试

由于申请的是pvc是与名称为pv-1gi的pv对象绑定的,所以往/nfs/data/02文件夹中写入index.htm文件进行测试

echo "hello,pv" >> /nfs/data/02/index.html

使用ip访问服务,可以看到正确输出了内容

再次查看pv,pvc信息

3.删除pod

当删除pod,与之绑定的pvc对象也会被删除,pv对象的状态变成Released

【文章原创作者:美国多ip站群服务器 www.558idc.com/mgzq.html

本文共计1297个文字,预计阅读时间需要6分钟。

K8s基础教程:深入理解PV与PVC配置(第八讲)如何提问?

某些应用需要持久化数据,若直接在Pod所在节点持久化,当Pod因某种原因重建或被调度到其他节点时,将无法访问之前持久化的数据。因此,需要一个公共存储数据的位置。

某些应用是要持久化数据的,如果直接持久化在pod所在节点,当pod因为某种原因重建或被调度另外一台节点,是无法访问到之前持久化的数据,所以需要一个公共存储数据的地方,无论pod删除重建或重新调度到其他节点都能访问原来的数据,使用nfs就可以到达此目的。

一、安装nfs

1.在k8sMaster主节点上安装nfs服务端

apt install -y nfs-kernel-server systemctl start nfs-server systemctl enable nfs-server systemctl status nfs-server

查看安装后的状态为active

创建目录并设置权限

mkdir -p /nfs/data echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports

不要忘了重启nfs-server

systemctl restart nfs-server

2.在两台k8sworker节点上安装nfs客户端

apt install -y nfs-common mkdir -p /nfs/data # 把本地的/nfs/data挂载到主节点上 mount 192.168.59.110:/nfs/data /nfs/data

3.测试

在某台worker节点上往目录中写入测试文件数据

echo "nfs data" >> /nfs/data/test.txt

在所有节点上都能查看到写入的数据,并且是一样的

二、使用原始方式挂载pod数据目录

1.先删除之前dev名称空间下的所有资源

kubectl delete ns dev

2.把ns、deployment、svc资源的描述合并在一个yaml文件中

vi nginx-deploy-svc.yaml

apiVersion: v1 kind: Namespace metadata: name: dev --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx namespace: dev spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx volumeMounts: - name: nginxvolume mountPath: /usr/share/nginx/html volumes: - name: nginxvolume #通过nfs服务挂载 nfs: server: 192.168.59.110 # 此处要特别注意:一定要手动创建nginx子目录,否则pod在过载的时候会报目录不存在异常 path: /nfs/data/nginx --- apiVersion: v1 kind: Service metadata: labels: app: svc-nginx name: svc-nginx namespace: dev spec: selector: app: nginx type: NodePort ports: - port: 8000 protocol: TCP targetPort: 80

3.创建资源对象

kubectl apply -f nginx-deploy-svc.yaml

查看svc的ip与端口号

4.测试

在挂载目录中创建index.html

echo "hello,nfs" >> /nfs/data/nginx/index.html

通过ip端口访问,可以看到读取的就是nfs目录中的内容

现在你可以把dev名称空间删除,然后重新创建这些资源,再次访问的时候,发现数据还在。

三、PV

PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置,与namespace无关

1.先创建nfs目录

# 在master节点执行 mkdir -p /nfs/data/01 mkdir -p /nfs/data/02 mkdir -p /nfs/data/03

2.创建基于nfs的pv对象

(1)创建pv资源文件

vi pv.yaml

(2)编写三个pv资源对象,大小分别是:10M,1G,5G

apiVersion: v1 kind: PersistentVolume metadata: name: pv-10m spec: capacity: storage: 10M accessModes: - ReadWriteMany storageClassName: nfs nfs: path: /nfs/data/01 server: 192.168.59.110 --- apiVersion: v1 kind: PersistentVolume metadata: name: pv-1gi spec: capacity: storage: 1Gi accessModes: - ReadWriteMany storageClassName: nfs nfs: path: /nfs/data/02 server: 192.168.59.110 --- apiVersion: v1 kind: PersistentVolume metadata: name: pv-5gi spec: capacity: storage: 5Gi accessModes: - ReadWriteMany storageClassName: nfs nfs: path: /nfs/data/03 server: 192.168.59.110

(3)创建pv对象

kubectl apply -f pv.yaml

3.查看创建结果

kubectl get pv

pv对象列表

某个pv对象的详细信息

K8s基础教程:深入理解PV与PVC配置(第八讲)如何提问?

四、PVC

PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格

1.创建pvc

(1)创建pvc资源文件

vi pvc.yaml

(2)编写pvc资源申明信息

kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nginx-pvc namespace: dev spec: accessModes: - ReadWriteMany resources: requests: # 申请200M的空间 storage: 200Mi storageClassName: nfs

(3)创建pvc对象

kubectl apply -f pvc.yaml

2.查看创建结果

kubectl get pvc -owide -n dev

由于申请的是200M空间,可以看到k8s自定绑定到合适的pv对象上,即选择大小为1G的pv对象。

再回过头来查看pv对象的绑定信息,可以看到已经和刚刚创建的pvc对象绑定了。

五、绑定pod与pvc

1.创建新的yaml文件

(1)新建资源文件

vi nginx-dp-svc-pvc.yaml

(2)使用persistentVolumeClaim属性指定刚刚创建的nginx-pvc对象

apiVersion: v1 kind: Namespace metadata: name: dev --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx namespace: dev spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx volumeMounts: - name: nginxvolume mountPath: /usr/share/nginx/html volumes: - name: nginxvolume # 使用pvc persistentVolumeClaim: claimName: nginx-pvc --- apiVersion: v1 kind: Service metadata: labels: app: svc-nginx name: svc-nginx namespace: dev spec: selector: app: nginx type: NodePort ports: - port: 8000 protocol: TCP targetPort: 80

(3)创建pod,svc对象

kubectl apply -f nginx-dp-svc-pvc.yaml

2.测试

由于申请的是pvc是与名称为pv-1gi的pv对象绑定的,所以往/nfs/data/02文件夹中写入index.htm文件进行测试

echo "hello,pv" >> /nfs/data/02/index.html

使用ip访问服务,可以看到正确输出了内容

再次查看pv,pvc信息

3.删除pod

当删除pod,与之绑定的pvc对象也会被删除,pv对象的状态变成Released

【文章原创作者:美国多ip站群服务器 www.558idc.com/mgzq.html