【问题标题】:Kubernetes: failed to mount unformatted volume as read onlyKubernetes:无法将未格式化的卷挂载为只读
【发布时间】:2019-04-25 18:53:10
【问题描述】:

我正在尝试将 gcePersistentDisk 用作 ReadOnlyMany,以便我在多个节点上的 pod 可以读取此磁盘上的数据。遵循文档here 相同。

要创建并稍后格式化 gce 永久磁盘,我已按照文档 here 中的说明进行操作。按照这个文档,我已经进入其中一个节点并格式化了磁盘。请参阅下面的完整错误以及其他 yaml 文件。

kubectl 描述 pods -l podName

Name:               punk-fly-nodejs-deployment-5dbbd7b8b5-5cbfs
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               gke-mycluster-default-pool-b1c1d316-d016/10.160.0.12
Start Time:         Thu, 25 Apr 2019 23:55:38 +0530
Labels:             app.kubernetes.io/instance=punk-fly
                    app.kubernetes.io/name=nodejs
                    pod-template-hash=1866836461
Annotations:        kubernetes.io/limit-ranger=LimitRanger plugin set: cpu request for container nodejs
Status:             Pending
IP:
Controlled By:      ReplicaSet/punk-fly-nodejs-deployment-5dbbd7b8b5
Containers:
  nodejs:
    Container ID:
    Image:          rajesh12/smartserver:server
    Image ID:
    Port:           3002/TCP
    Host Port:      0/TCP
    State:          Waiting
      Reason:       ContainerCreating
    Ready:          False

    Restart Count:  0
    Requests:
      cpu:  100m
    Environment:
      MYSQL_HOST:           mysqlservice
      MYSQL_DATABASE:       app
      MYSQL_ROOT_PASSWORD:  password
    Mounts:
      /usr/src/ from helm-vol (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-jpkzg (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  helm-vol:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  my-readonly-pvc
    ReadOnly:   true
  default-token-jpkzg:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-jpkzg
    Optional:    false
QoS Class:       Burstable
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason                  Age               From                                               Message
  ----     ------                  ----              ----                                               -------
  Normal   Scheduled               2m                default-scheduler                                  Successfully assigned default/punk-fly-nodejs-deployment-5dbbd7b8b5-5cbfs to gke-mycluster-default-pool-b1c1d316-d016
  Normal   SuccessfulAttachVolume  1m                attachdetach-controller                            AttachVolume.Attach succeeded for volume "pvc-9c796180-677e-11e9-ad35-42010aa0000f"
  Warning  FailedMount             10s (x8 over 1m)  kubelet, gke-mycluster-default-pool-b1c1d316-d016  MountVolume.MountDevice failed for volume "pvc-9c796180-677e-11e9-ad35-42010aa0000f" : failed to mount unformatted volume as read only
  Warning  FailedMount             0s                kubelet, gke-mycluster-default-pool-b1c1d316-d016  Unable to mount volumes for pod "punk-fly-nodejs-deployment-5dbbd7b8b5-5cbfs_default(86293044-6787-11e9-ad35-42010aa0000f)": timeout expired waiting for volumes to attach or mount for pod "default"/"punk-fly-nodejs-deployment-5dbbd7b8b5-5cbfs". list of unmounted volumes=[helm-vol]. list of unattached volumes=[helm-vol default-token-jpkzg]

readonly_pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-readonly-pv
spec:
  storageClassName: ""
  capacity:
    storage: 1G
  accessModes:
    - ReadOnlyMany
  gcePersistentDisk:
    pdName: mydisk0
    fsType: ext4
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-readonly-pvc
spec:
  accessModes:
    - ReadOnlyMany
  resources:
    requests:
      storage: 1G

deployment.yaml

  volumes:
    - name: helm-vol
      persistentVolumeClaim:
        claimName: my-readonly-pvc
        readOnly: true
  containers:
    - name: {{ .Values.app.backendName }}
      image: "{{ .Values.image.repository }}:{{ .Values.image.tagServer }}"
      imagePullPolicy: {{ .Values.image.pullPolicy }}
      env:
      - name: MYSQL_HOST
        value: mysqlservice
      - name: MYSQL_DATABASE
        value: app
      - name: MYSQL_ROOT_PASSWORD
        value: password
      ports:
        - name: http-backend
          containerPort: 3002
      volumeMounts:
        - name: helm-vol
          mountPath: /usr/src/

【问题讨论】:

    标签: docker kubernetes google-kubernetes-engine


    【解决方案1】:

    听起来您的PVC 正在动态配置一个未使用default StorageClass 格式化的新卷

    您的 Pod 可能是在与您配置 PV 的位置不同的可用性中创建的。为 gce 卷设置多个 Pod 读取器的问题是 Pod 必须始终位于同一可用区中。

    一些选项:

    • 只需在您的节点所在的同一可用区创建和格式化PV

    • 在定义 PV 时,您可以指定 Node Affinity 以确保它始终被分配给特定节点。

    • 定义一个指定文件系统的StorageClass

      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      metadata:
        name: mysc
      provisioner: kubernetes.io/aws-ebs
      parameters:
        type: gp2
        fsType: ext4
      

      然后在你的 PVC 中使用它:

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: my-pvc
      spec:
        accessModes:
          - ReadOnlyMany
        resources:
          requests:
            storage: 1G
        storageClassName: mysc
      

      卷将自动配置和格式化。

    【讨论】:

      【解决方案2】:

      我在尝试使用访问模式 ReadWriteOnce 配置永久磁盘时收到相同的错误消息。对我来说解决问题的是从部署规范的volumes 声明中删除属性readOnly: true。对于您的 deployment.yaml 文件,就是这个块:

      volumes:
      - name: helm-vol
        persistentVolumeClaim:
          claimName: my-readonly-pvc
          readOnly: true
      

      尝试删除该行,看看错误是否消失。

      【讨论】:

        【解决方案3】:

        我遇到了同样的错误,并设法使用相关文章中关于使用预先存在的磁盘的几行来修复它 https://cloud.google.com/kubernetes-engine/docs/how-to/persistent-volumes/preexisting-pd

        您需要将storageClassNamevolumeName 添加到您的持久卷声明中:

        apiVersion: v1
        kind: PersistentVolumeClaim
        metadata:
          name: pv-claim-demo
        spec:
          # It's necessary to specify "" as the storageClassName
          # so that the default storage class won't be used, see
          # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class-1
          storageClassName: ""
          volumeName: pv-demo
          accessModes:
            - ReadOnlyMany
          resources:
            requests:
              storage: 500G
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-10
          • 1970-01-01
          • 2016-12-24
          • 2017-03-14
          • 2021-11-22
          • 1970-01-01
          • 1970-01-01
          • 2019-01-09
          相关资源
          最近更新 更多