【问题标题】:Kubernetes - For Scale, pod is pending when attached the persistent volumes while scaling the pod (GKE)Kubernetes - 对于 Scale,在扩展 pod (GKE) 时附加持久卷时,pod 处于挂起状态
【发布时间】:2020-12-16 15:18:01
【问题描述】:

我在 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 卡住了,它只是挂起状态。

如果我删除了持久性卷然后对其进行了缩放,那么它可以正常工作,但使用持久性卷,它就无法正常工作。

【问题讨论】:

  • 添加kubectl get events -A的输出
  • AttachVolume.Attach 卷“pvc-123-xyz”失败:googleapi:错误 400:RESOURCE_IN_USE_BY_ANOTHER_RESOURCE - 磁盘资源 'projects/abc/zones/abc-a/disks/pvc-123-xyz ' 已被 'projects/abc/zones/abc-a/instances/instance-123' 使用
  • @ArghyaSadhu 我已经获取了事件,并且得到了类似上面的结果。你能检查一下吗?

标签: kubernetes google-kubernetes-engine persistent-volumes


【解决方案1】:

当使用标准存储类时,我假设您使用的是默认的GCEPersisentDisk Volume PlugIn。在这种情况下,您根本无法设置它们,因为它们已经由存储提供商设置(在您的情况下是 GCP,因为您使用的是 GCE 永久磁盘),这些磁盘仅支持 ReadWriteOnce(RWO) 和 ReadOnlyMany (ROX)访问模式。如果您尝试创建一个永远不会进入成功状态的ReadWriteMany(RWX) PV(您在使用 accessModes 设置 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的引用

herehere 所述,NFS 是获取 ReadWriteMany 的最简单方法,因为所有节点都需要能够将 ReadWriteMany 写入您用于 pod 的存储设备。

那么我建议您使用 NFS 存储选项。如果您想对其进行测试,这里有一个很好的 guide Google 使用它的 Filestore 解决方案,它是完全托管的 NFS 文件服务器。

【讨论】:

    【解决方案2】:

    您的 PersistentVolumeClaim 设置为:

    accessModes:
    - ReadWriteOnce
    

    但应该设置为:

    accessModes:
    - ReadWriteMany
    

    ReadWriteOnce 访问模式意味着,

    该卷可以通过单个节点 [1] 以读写方式挂载。

    当您扩展部署时,它很可能会扩展到不同的节点,因此您需要 ReadWriteMany。

    [1]https://kubernetes.io/docs/concepts/storage/persistent-volumes/

    【讨论】:

    • 我已经尝试过 ReadWriteManyReadOnlyMany 两种方式。但对我不起作用。
    • 您能否提供“kubectl get pvc”的输出以及有关待处理的 pod 中的错误消息的详细信息?后者通过“kubectl describe pod/pod-name”,然后在底部应该有一些 log-ish 消息。
    • Pod 的持久卷声明未绑定到卷。如果您的 Persistent Volume 未配置,则可能会发生此错误。
    • 我在创建部署时使用 ReadWriteMany 访问模式时遇到的上述错误。
    • pvc 的输出 { "apiVersion": "v1", "kind": "PersistentVolumeClaim", "metadata": { "finalizers": [ "kubernetes.io/ pvc-protection" ], "name": "jenkins-celery", }, "spec": { "accessModes": [ "ReadWriteMany" ], "resources": { "requests": { "storage": "5Gi" } }, "storageClassName": "standard", "volumeMode": "Filesystem" }, "status": { "phase": "Pending" } }
    猜你喜欢
    • 1970-01-01
    • 2018-06-12
    • 2018-07-02
    • 1970-01-01
    • 2018-02-28
    • 2019-12-22
    • 1970-01-01
    • 2021-09-15
    • 2018-11-18
    相关资源
    最近更新 更多