使用 StorageClass 部署 Kubernetes

Kubernetes Deployment with StorageClass

我有一个 StorageClassprovisioner: kubernetes.io/aws-ebs

而且我有一个部署,我需要在其中安装一些卷。所以,我需要使用这个 StorageClass

这是我的 sc.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
  name: gp2
parameters:
  fsType: ext4
  type: gp2
provisioner: kubernetes.io/aws-ebs
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

这是我的 deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: postgres
  namespace: var.namespace
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:10.4
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 5432
          envFrom:
            - configMapRef:
                name: postgres-config
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgredb
      # how can I specify my storage class here?
      volumes:
        - name: postgredb
          persistentVolumeClaim:
            claimName: postgres-pv-claim

我需要在我的部署中指定存储 class。有人可以帮助我吗?

I need to specify the storage class in my deployment. Can someone help me?

在回答之前,先解释一下StroageClass, PersistentVolume, Persistent Volume Claim.

术语

StroageClass

  • 我们可以把StorageClass看成一个驱动(软件)。
  • 负责与存储硬件“通信”的驱动程序。
  • 通常但不是必须的,StorageClass 由存储提供商(硬件或虚拟)提供

PersistentVolume

  • A PersistentVolume (PV) 是集群中的一块存储,已由管理员配置或使用 Storage Classes.
  • 动态配置

PersistentVolumeClaim

  • A PersistentVolumeClaim (PVC) 是用户(通常是 Pod)存储请求

总图(描述 K8 存储对象)

TL;DR;说明

  • 您有物理存储(磁盘、SSD、虚拟等)
  • 有人(通常是存储或云提供商)为您提供了 StorageClass 对象。顺便说一下,大多数时候你不需要 define/declare 它,K8S 会为你提供默认存储 (emptyDir)。
  • 然后定义 PersistentVolume (PV),它将根据您需要的类型 (StorageClass)“创建”存储。
  • 下一步是定义 PersistentVolumeClaim (PVC)。 PVC 是从您在上一步中定义的 (PV) 安装的“物理”存储的分配。
  • 最后一步是将音量“分配”给您的执行(PodDeploymentStatefulSet 等),这是使用 volumes.

** 备注

  • 如上所述,大多数时候您可以简单地使用卷而无需定义 StorageClassPV/PVC。只需在所需的资源中使用卷,K8S 就会为您处理。
  • 也有一些例外情况(这里不涉及太多细节,例如 StaefulSet)。 如果没有指定 StorageClass,那么将使用默认的 StorageClass

现在让我们来回答你的问题

  • 您定义了一个StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
...
provisioner: kubernetes.io/aws-ebs
  • 在您的部署中,您指定了 volumes(标识保留为)
apiVersion: extensions/v1beta1
kind: Deployment
...
        
        # --> Here you define the actual mount path you need for your pods
        #     The name (PVC) is corresponding to the one you 
        #     defined below under volumes
        volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgredb
      # ->>>> how can I specify my storage class here?
      # You don't need to specify storage class, you need to define PVC,
      # This is the missing piece in your code.
      volumes:
        - name: postgredb
          persistentVolumeClaim:
            claimName: postgres-pv-claim

缺失的部分...

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: postgres-pv-claim ### <<< The name as mentioned above in your Deploymnet
  labels:
    app: postgres
spec:
  # The name of the storage class u defined earlier
  storageClassName: gp2

  # The access modes are:
  #   ReadWriteOnce - The volume can be mounted as read-write by a single node
  #   ReadWriteMany - The volume can be mounted as read-write by a many nodes
  #   ReadOnlyMany  - The volume can be mounted as read-only  by many nodes
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

希望对您有所帮助。