Pod中使用PVC

一、Pod中使用PVC
    在PVC创建成功之后,Pod就可以存储卷的方式使用PVC的存储资源了。。PVC受限于命名空间,Pod在使用PVC时必须PVC同处于一个命名空间。
    Kubernetes为Pod挂载PVC的过程如下:
        系统在Pod所在的命名空间中找到其配置的PVC,然后找到PVC绑定的后端PV,将PV存储挂载到Pod所在的Node目录下,最后将Node目录挂载到Pod的容器内
     在Pod中使用PVC时,需要在YAML配置中设置PVC类型的Volume,然后再容器中通过volumeMount.mountPath设置容器内的挂载目录:
#创建PV
apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-local-pv
  labels:
    release: stable
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /test/disks/ssd1  #Pod被调度到的Node上该目录必须存在
  nodeAffinity:  #设置了节点的亲和性,Pod所调度到的Node上必须打上该标签
    required:
      nodeSelectorTerms:         
      - matchExpressions:
        - key: kuberneter.io/hostname       
          operator: In
          values:
          - master
#创建PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes:
    - ReadWriteOnce   #访问模式(与PV模式相同) ReadWriteOnce,读写权限,并且只能被单个Node使用
  volumeMode: Filesystem
  resources:
    requests:
      storage: 3Gi #申请3G存储空间
  storageClassName: local-storage #要求系统中提交存在名为local-storage的storageClass
  selector:
    matchLabels:
      release: "stable"
#创建Pod
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: test-container
    image: nginx
    volumeMounts:
    - mountPath: /pvtest
      name: testpv
  volumes:
  - name: testpv
    persistentVolumeClaim:
      claimName: test-pvc
  

遇到的问题,

1. PV中设置了nodeAffinity,而任何Node上没有打该标签

2. Pod要调度到的Node上没有创建PV中local path;

#问题解决在master 的node上打上kuberneter.io/hostname=master标签
kubectl label node master kuberneter.io/hostname=master
2.在master节点上创建路径 /test/disks/ssd1

 成功创建,修改Pod中YAML 

此时Pod创建失败,因为PV中设置了NodeAffinity,所以PV不能挂载到node2,导致Pod不能使用PV从而导致Pod不能被合法调度。

所以Pod创建成功的前提,是PV必须能够成功挂载到Pod所被调度的Node上。

二、存储卷为块设备(Block)

如果存储卷为块设备(Block),则PVC的配置与默认模式(Filesystem)略有不同。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: blocl-test-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  volumeMode: Block
  persistentVolumeReclaimPolicy: Retain
  fc: #光纤通道
    targetWWNs: ["5006e801056"]  #指定单个或多个目标 WWN(World Wide Names
    lun: 0 #
    readOnly: false

 PVC的YAML配置:

apiVersion: v1
kind: persistentVolumeClaim
metadata:
  name: block-test-pvc
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Block
  resources:
    requests:
      storage: 10Gi

    使用块设备PVC的Pod定义,与文件系统模式的PVC的用法不用,容器内不适用volumeMounts设置挂载目录,而是通过volumeDevices字段设置块设备的路径devicePath

apiVersion: v1
kind: Pod
metedata:
  name: pod-with-block-volume
spec:
  containers:
  - name: fc-container
    image: busybox
    command: ["/bin/bash", "-c"]
    args: ["tail -f /dev/null"]
    volumeDevices:
      - name: data
        devicePath: /dev/xvda
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: block-test-pv

    某些应用场景中,同一个Volume可能会被多个Pod或者提供Pod中的多个容器共享,此时可能存在各应用程序需要使用不同子目录的需求。这个可以通过Pod的volumeMounts挂载定义的subPath字段进行设置。通过对subPath

设置,在容器中将以subPath设置的目录而不是在Volume中提供的默认根目录作为根目录使用。

apiVersion: v1
kind: Pod
metadata:
  name: mysql
spec:
    containers:
    - name: mysql
      image: mysql
      env:
      - name: MYSQL_ROOT_PASSWORD
        value: "rootpasswd"
      volumeMounts:
      - mountPath: /var/lib/mysql
        name: site-data
        subPath: mysql
    - name: php
      image: php:7.0-apache
      volumeMounts:
      - mountPath: /var/www/html
        name: site-data
        subPath: html
    volumes:
    - name: site-data
      persistentVolumeClaim:
        claimName: site-data-pvc

   subPath中的路径不能以"/"开头,需要用相对路径的形式。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值