一、PVC绑定PV

在工作场景中,k8s管理员会碰到两种场景:

  • 场景一:k8s管理员成功创建好PV,请求开发人员申请该PV并创建PVC配置到Volumes配置一个PVC类型的存 储,并指定PVC的名字是xxx即可
  • 场景二:k8s管理员成功创建好PV和PVC,请求开发人员在Volumes指定PVC的名字是xxx即可

持久化存储入门-PVC绑定PV

注意:PVC和PV进行绑定的前提条件是一些参数必须匹配,比如accessModes、storageClassName、volumeMode都需要相同,并且PVC的storage需要小于等于PV的storage配置。

下面进行PVC挂载示例:

首先创建PV

1.定义一个yaml文件

[root@k8s-master01 pv]# vim pv-nfs.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs
spec:
  capacity:                   
    storage: 5Gi
  volumeMode: Filesystem 
  accessModes:          
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs-slow
  nfs:
    path: /data/nfs/test_nfs  
    server: 192.168.1.34

上面参数说明:

  • capacity:容量配置
  • volumeMode:卷的模式,目前支持Filesystem (文件系统) 和 Block(块),其中Block类型需 要后端存储支持,默认为文件系统
  • accessModes:该PV的访问模式,这里设置为RWO,可以被单节点以读写模式挂载
  • storageClassName:PV的类,一个特定类型的PV 只能绑定到特定类别的PVC
  • persistentVolumeReclaimPolicy:回收策略
  • nfs:NFS服务配置,包括以下两个选项:path:NFS上的共享目录;server:NFS的IP地址

2.部署

[root@k8s-master01 pv]# kubectl create -f pv-nfs.yaml

3.结果验证

[root@k8s-master01 pv]# kubectl get -f pv-nfs.yaml
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv-nfs   5Gi        RWO            Recycle          Available           nfs-slow                16s

其次创建PVC

1.定义一个名为pvc-nfs.yaml 的yaml文件

[root@k8s-master01 pv]# vim pvc-nfs.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nfs-pvc-claim
spec:
  storageClassName: nfs-slow #要求PV一致
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi #小于等于PV大小

注意:PVC有命名空间限制,这里默认是default空间

2.部署

[root@k8s-master01 pv]# kubectl create -f pvc-nfs.yaml 

3.结果验证,观察到状态已更改为Bound,但此时并不代表可用

[root@k8s-master01 pv]# kubectl get -f pvc-nfs.yaml 
NAME            STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-pvc-claim   Bound    pv-nfs   5Gi        RWO            nfs-slow       60s

4.查看PV状态,此时PV状态由原来的Available变为Bound ,但此时并不代表可用

[root@k8s-master01 pv]# kubectl get pv pv-nfs
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS   REASON   AGE
pv-nfs   5Gi        RWO            Recycle          Bound    default/nfs-pvc-claim   nfs-slow                79m

最后,创建Pod

1.在k8s-master01上定义一个名为pvc-nfs-pod.yaml的yaml文件

[root@k8s-master01 pv]# vim pvc-nfs-pod.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 2
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      volumes:
      - name: task-pv-storage
        persistentVolumeClaim:
          claimName: nfs-pvc-claim
      containers:
      - env:
        - name: TZ
          value: Asia/Shanghai
        - name: LANG
          value: C.UTF-8
        image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        imagePullPolicy: IfNotPresent
        name: nginx
        volumeMounts:
          - mountPath: "/usr/share/nginx/html"
            name: task-pv-storage

2.在k8s-master01上开始部署

[root@k8s-master01 pv]# kubectl create  -f pvc-nfs-pod.yaml 

3.在k8s-master01上查看pod状态

[root@k8s-master01 pv]# kubectl get po
NAME                            READY   STATUS    RESTARTS       AGE
nginx-59fdd74bd4-2c2hk          1/1     Running   0              19s
nginx-59fdd74bd4-dlfgf          1/1     Running   0              19s

4.在k8s-master01上以容器的方式进入pod,修改文件内容,用于测试另一个Pod是否会同步

[root@k8s-master01 pv]# kubectl exec -it  nginx-59fdd74bd4-2c2hk  -- sh
/ # cd /usr/share/nginx/html/
/usr/share/nginx/html # echo "test_nfs" > /usr/share/nginx/html/index.html 
/usr/share/nginx/html # cat /usr/share/nginx/html/index.html 
test_nfs

5.继续在k8s-master01上以容器的方式进入另一个pod后,查看已经同步

[root@k8s-master01 pv]# kubectl exec  nginx-59fdd74bd4-dlfgf  -- cat /usr/share/nginx/html/index.html 
test_nfs

2.8 PVC创建和挂载失败的原因

2.8.1 PVC一直Pending的原因

1.PVC的空间申请大小大于PV的大小 2.PVC的StorageClassName没有和PV的一致 3.PVC的accessModes和PV的不一致

2.8.2 挂载PVC的Pod一直处于Pending

1.PVC没有创建成功/PVC不存在 2.PVC和Pod不在同一个Namespace