使用 StorageClass 部署 Kubernetes
Kubernetes Deployment with StorageClass
我有一个 StorageClass
和 provisioner: 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) 安装的“物理”存储的分配。
- 最后一步是将音量“分配”给您的执行(
Pod
、Deployment
、StatefulSet
等),这是使用 volumes
.
** 备注
- 如上所述,大多数时候您可以简单地使用卷而无需定义
StorageClass
或 PV
/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
希望对您有所帮助。
我有一个 StorageClass
和 provisioner: 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) 安装的“物理”存储的分配。 - 最后一步是将音量“分配”给您的执行(
Pod
、Deployment
、StatefulSet
等),这是使用volumes
.
** 备注
- 如上所述,大多数时候您可以简单地使用卷而无需定义
StorageClass
或PV
/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
希望对您有所帮助。