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 文件服务器。