Kubernetes - 对于 Scale,当在扩展 pod (GKE) 时附加持久卷时 pod 处于挂起状态
Kubernetes - For Scale, pod is pending when attached the persistent volumes while scaling the pod (GKE)
我在 xyz-namespace 命名空间中创建了一个部署,它有 PVC。我可以创建部署并能够访问它。它工作正常,但从 Kubernetes 控制台扩展部署时,pod 仅处于挂起状态。
persistent_claim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard
resources:
requests:
storage: 5Gi
namespace: xyz-namespace
部署对象如下所示。
apiVersion: apps/v1
kind: Deployment
metadata:
name: db-service
labels:
k8s-app: db-service
Name:db-service
ServiceName: db-service
spec:
selector:
matchLabels:
tier: data
Name: db-service
ServiceName: db-service
strategy:
type: Recreate
template:
metadata:
labels:
app: jenkins
tier: data
Name: db-service
ServiceName: db-service
spec:
hostname: jenkins
initContainers:
- command:
- "/bin/sh"
- "-c"
- chown -R 1000:1000 /var/jenkins_home
image: busybox
imagePullPolicy: Always
name: jenkins-init
volumeMounts:
- name: jenkinsvol
mountPath: "/var/jenkins_home"
containers:
- image: jenkins/jenkins:lts
name: jenkins
ports:
- containerPort: 8080
name: jenkins1
- containerPort: 8080
name: jenkins2
volumeMounts:
- name: jenkinsvol
mountPath: "/var/jenkins_home"
volumes:
- name: jenkinsvol
persistentVolumeClaim:
claimName: jenkins
nodeSelector:
nodegroup: xyz-testing
namespace: xyz-namespace
replicas: 1
部署创建良好并且工作正常但是
当我尝试从控制台 扩展部署 时,pod 卡住了,它仅处于挂起状态。
如果我删除了持久卷然后缩放它,那么它工作正常,但是对于持久卷,它就不起作用了。
您的 PersistentVolumeClaim 设置为:
accessModes:
- ReadWriteOnce
但应该设置为:
accessModes:
- ReadWriteMany
ReadWriteOnce 访问模式意味着,
the volume can be mounted as read-write by a single node [1].
当您扩展部署时,它很可能会扩展到不同的节点,因此您需要 ReadWriteMany。
[1] https://kubernetes.io/docs/concepts/storage/persistent-volumes/
使用标准存储时 class 我假设您使用的是默认 GCEPersisentDisk
卷插件。在这种情况下,您根本无法设置它们,因为它们已经由存储提供商设置(在您的情况下是 GCP,因为您使用的是 GCE 永久磁盘),这些磁盘仅支持 ReadWriteOnce
(RWO) 和 ReadOnlyMany
(ROX) 访问模式。如果您尝试创建一个永远不会进入成功状态的 ReadWriteMany
(RWX) PV(您使用访问模式设置 PVC 时的情况:ReadWriteMany)。
此外,如果任何 pod 尝试在其他节点上附加 ReadWriteOnce 卷,您将收到以下错误:
FailedMount Failed to attach volume "pv0001" on node "xyz" with: googleapi: Error 400: The disk resource 'abc' is already being used by 'xyz'
上面对此的引用article
如前所述 here and here,NFS 是获取 ReadWriteMany 的最简单方法,因为所有节点都需要能够 ReadWriteMany 到您用于 pods.
的存储设备
那么我建议您使用 NFS 存储选项。如果您想测试它,这里有一个很好的 guide by Google 使用它的 Filestore 解决方案,它是完全托管的 NFS 文件服务器。
我在 xyz-namespace 命名空间中创建了一个部署,它有 PVC。我可以创建部署并能够访问它。它工作正常,但从 Kubernetes 控制台扩展部署时,pod 仅处于挂起状态。
persistent_claim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard
resources:
requests:
storage: 5Gi
namespace: xyz-namespace
部署对象如下所示。
apiVersion: apps/v1
kind: Deployment
metadata:
name: db-service
labels:
k8s-app: db-service
Name:db-service
ServiceName: db-service
spec:
selector:
matchLabels:
tier: data
Name: db-service
ServiceName: db-service
strategy:
type: Recreate
template:
metadata:
labels:
app: jenkins
tier: data
Name: db-service
ServiceName: db-service
spec:
hostname: jenkins
initContainers:
- command:
- "/bin/sh"
- "-c"
- chown -R 1000:1000 /var/jenkins_home
image: busybox
imagePullPolicy: Always
name: jenkins-init
volumeMounts:
- name: jenkinsvol
mountPath: "/var/jenkins_home"
containers:
- image: jenkins/jenkins:lts
name: jenkins
ports:
- containerPort: 8080
name: jenkins1
- containerPort: 8080
name: jenkins2
volumeMounts:
- name: jenkinsvol
mountPath: "/var/jenkins_home"
volumes:
- name: jenkinsvol
persistentVolumeClaim:
claimName: jenkins
nodeSelector:
nodegroup: xyz-testing
namespace: xyz-namespace
replicas: 1
部署创建良好并且工作正常但是 当我尝试从控制台 扩展部署 时,pod 卡住了,它仅处于挂起状态。
如果我删除了持久卷然后缩放它,那么它工作正常,但是对于持久卷,它就不起作用了。
您的 PersistentVolumeClaim 设置为:
accessModes:
- ReadWriteOnce
但应该设置为:
accessModes:
- ReadWriteMany
ReadWriteOnce 访问模式意味着,
the volume can be mounted as read-write by a single node [1].
当您扩展部署时,它很可能会扩展到不同的节点,因此您需要 ReadWriteMany。
[1] https://kubernetes.io/docs/concepts/storage/persistent-volumes/
使用标准存储时 class 我假设您使用的是默认 GCEPersisentDisk
卷插件。在这种情况下,您根本无法设置它们,因为它们已经由存储提供商设置(在您的情况下是 GCP,因为您使用的是 GCE 永久磁盘),这些磁盘仅支持 ReadWriteOnce
(RWO) 和 ReadOnlyMany
(ROX) 访问模式。如果您尝试创建一个永远不会进入成功状态的 ReadWriteMany
(RWX) PV(您使用访问模式设置 PVC 时的情况:ReadWriteMany)。
此外,如果任何 pod 尝试在其他节点上附加 ReadWriteOnce 卷,您将收到以下错误:
FailedMount Failed to attach volume "pv0001" on node "xyz" with: googleapi: Error 400: The disk resource 'abc' is already being used by 'xyz'
上面对此的引用article
如前所述 here and here,NFS 是获取 ReadWriteMany 的最简单方法,因为所有节点都需要能够 ReadWriteMany 到您用于 pods.
的存储设备那么我建议您使用 NFS 存储选项。如果您想测试它,这里有一个很好的 guide by Google 使用它的 Filestore 解决方案,它是完全托管的 NFS 文件服务器。