部署和 PVC
Deployment and PVCs
我有以下 PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 256Mi
storageClassName: fask
和部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
volumeMounts:
- name: data
mountPath: "/var/www/html"
volumes:
- name: data
persistentVolumeClaim:
claimName: nginx-pvc
如果我 运行 使用 单个 副本部署,我的 PV 由 vsphere StorageClass
但是,如果我有超过 2 个副本,它将无法创建第二个 PV:
AttachVolume.Attach failed for volume "pvc-8facf319-6b1a-11e8-935b-00505680b1b8" : Failed to add disk 'scsi0:1'.
Unable to mount volumes for pod "nginx-deployment-7886f48dcd-lzms8_default(b0e38764-6b1a-11e8-935b-00505680b1b8)": timeout expired waiting for volumes to attach or mount for pod "default"/"nginx-deployment-7886f48dcd-lzms8". list of unmounted volumes=[data]. list of unattached volumes=[data default-token-5q7kr]
However, if I have more than 2 replicas it will fail to create the second PV
然后您可能应该在其中使用 StatefulSet
和 volumeClaimTemplates
而不是 Deployment
和 PersistentVolumeClaim
。
在您的情况下,每个部署都具有相同的 PersistentVolumeClaim
(即 ReadWriteOnly,不能在第二次请求时安装),而对于 volumeClaimTemplates
,您会为每个副本提供不同的配置。
我知道我来晚了,但我不同意批准的答案。这取决于您想要实现的目标(就像编码生活中的大多数事情一样)。
StatefulSets with volumeClaimTemplates 在您需要拥有完全独立的副本时非常有用,这些副本将通过某种 app-level-implemented 机制相互通信,同时仍然作为单独的身份存在。我正在考虑像 Cassandra 这样的分布式数据库:不同的数据库节点,每个节点一个,具有不同的持久存储,每个节点一个 PV。 Cassandra 中的八卦机制将跨卷保存数据 on-sync。
如果您主要将 Kubernetes 用于微服务和复制应用程序,我认为这是可以避免的情况。当您需要进行滚动更新或升级您的 Kubernetes 版本时,StatefulSets 会让人头疼,因为它们不太容易扩展。
无论副本数量如何,部署都会挂载一个持久卷:10 个 pods 相同的部署将尝试为读取和写入操作挂载相同的卷。您苦苦挣扎的是,大多数卷提供商不允许多个节点安装卷。这时候就需要你的经验了。
如果您只需要像您的模板那样通过与多个 pods 共享相同的源来公开冗余网站,以便在不停机的情况下实现滚动更新,您可以使用 deploy 和 volumeClaim (不是 volumeClaimTemplates):您可以通过部署在多个 pods 上安装相同的卷,您只需要确保所有部署都将分配给同一节点。 PodAffinity 将为您完成这项工作。
我有以下 PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 256Mi
storageClassName: fask
和部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
volumeMounts:
- name: data
mountPath: "/var/www/html"
volumes:
- name: data
persistentVolumeClaim:
claimName: nginx-pvc
如果我 运行 使用 单个 副本部署,我的 PV 由 vsphere StorageClass
但是,如果我有超过 2 个副本,它将无法创建第二个 PV:
AttachVolume.Attach failed for volume "pvc-8facf319-6b1a-11e8-935b-00505680b1b8" : Failed to add disk 'scsi0:1'.
Unable to mount volumes for pod "nginx-deployment-7886f48dcd-lzms8_default(b0e38764-6b1a-11e8-935b-00505680b1b8)": timeout expired waiting for volumes to attach or mount for pod "default"/"nginx-deployment-7886f48dcd-lzms8". list of unmounted volumes=[data]. list of unattached volumes=[data default-token-5q7kr]
However, if I have more than 2 replicas it will fail to create the second PV
然后您可能应该在其中使用 StatefulSet
和 volumeClaimTemplates
而不是 Deployment
和 PersistentVolumeClaim
。
在您的情况下,每个部署都具有相同的 PersistentVolumeClaim
(即 ReadWriteOnly,不能在第二次请求时安装),而对于 volumeClaimTemplates
,您会为每个副本提供不同的配置。
我知道我来晚了,但我不同意批准的答案。这取决于您想要实现的目标(就像编码生活中的大多数事情一样)。
StatefulSets with volumeClaimTemplates 在您需要拥有完全独立的副本时非常有用,这些副本将通过某种 app-level-implemented 机制相互通信,同时仍然作为单独的身份存在。我正在考虑像 Cassandra 这样的分布式数据库:不同的数据库节点,每个节点一个,具有不同的持久存储,每个节点一个 PV。 Cassandra 中的八卦机制将跨卷保存数据 on-sync。
如果您主要将 Kubernetes 用于微服务和复制应用程序,我认为这是可以避免的情况。当您需要进行滚动更新或升级您的 Kubernetes 版本时,StatefulSets 会让人头疼,因为它们不太容易扩展。
无论副本数量如何,部署都会挂载一个持久卷:10 个 pods 相同的部署将尝试为读取和写入操作挂载相同的卷。您苦苦挣扎的是,大多数卷提供商不允许多个节点安装卷。这时候就需要你的经验了。
如果您只需要像您的模板那样通过与多个 pods 共享相同的源来公开冗余网站,以便在不停机的情况下实现滚动更新,您可以使用 deploy 和 volumeClaim (不是 volumeClaimTemplates):您可以通过部署在多个 pods 上安装相同的卷,您只需要确保所有部署都将分配给同一节点。 PodAffinity 将为您完成这项工作。