Назад к вопросам
Middle
307
questionbank

Что такое PV и PVC в контексте Kubernetes?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Persistent Volume (PV) — это ресурс хранения в кластере Kubernetes. Он абстрагирует детали конкретной реализации хранилища от потребителей. PV управляется администратором кластера и существует независимо от жизненного цикла любого пода.

Persistent Volume Claim (PVC) — это запрос пользователя на хранилище. Пользователь запрашивает объем хранилища с определенными характеристиками (размер, режим доступа). PVC связывается с подходящим PV. Если подходящий PV не найден, может быть произведен динамический провижининг нового PV, если настроен соответствующий StorageClass.

Основные отличия и взаимодействие:

  • PV: Представляет фактический ресурс хранения.
  • PVC: Представляет запрос на хранилище от пользователя.
  • PVC связывается с PV.
  • PV может быть статически создан администратором или динамически создан по запросу PVC с использованием StorageClass.
  • Pod ссылается на PVC, а не напрямую на PV, что позволяет отделить логику приложения от деталей хранения.

Режимы доступа (Access Modes) для PV и PVC:

  • ReadWriteOnce (RWO): Том может быть смонтирован как для чтения, так и для записи одним узлом одновременно.
  • ReadOnlyMany (ROX): Том может быть смонтирован только для чтения многими узлами одновременно.
  • ReadWriteMany (RWX): Том может быть смонтирован как для чтения, так и для записи многими узлами одновременно.

Пример YAML для PV и PVC:

# persistent-volume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain # Что делать с томом после удаления PVC (Retain, Recycle, Delete)
  storageClassName: local-storage # Может быть использован для связывания с StorageClass
  local:
    path: /mnt/data
  nodeAffinity: # Affinity для локального хранилища
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - my-node
# persistent-volume-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: local-storage # Связывается с PV или StorageClass
# pod-using-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
    - name: app-container
      image: nginx
      volumeMounts:
        - name: app-storage
          mountPath: /usr/share/nginx/html
  volumes:
    - name: app-storage
      persistentVolumeClaim:
        claimName: my-pvc # Ссылка на PVC