Điểm:1

Kubernetes: pod can't mount a PVC even though the latter seems to be properly bound to a PV

lá cờ ru

​Hello.

I'm experiencing a problem while trying to deploy a pod that has been configured to use a Persistent Volume. My installation is hosted on Hetzner Cloud and Kubernetes has been configured according to the instructions made available by the provider. The basic configuration seems ok since I can deploy e.g. Portainer from one of the provided manifests: it correctly mounts the PVC and runs. Since the default configuration doesn't create a persistent storage, every time I undeploy and redeploy Portainer all data are lost.

So I proceeded with the creation of a PersistentVolume, but the final step doesn't work. I can't tell whether the problem is a generic Kubernetes one or it's with my integration with Hetzner - but I think it makes sense to check first the first hypothesis. So I'm asking here before going to the Hetzner forum.

Steps:

  1. I created a Volume using the Hetzner Cloud user interface.

  2. Then I deployed a PV:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: portainer
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-portainer-test
      namespace: portainer
      labels:
        env: test
    spec:
      storageClassName: portainer-test
      accessModes:
        - ReadWriteOnce
      capacity:
        storage: 10Gi
      persistentVolumeReclaimPolicy: Retain
      volumeMode: Filesystem
      csi:
        driver: csi.hetzner.cloud
        fsType: ext4
        volumeHandle: "pv_id"

pv_id is the volume id that I can see with the Hetzner user interface.

I can see the PV with kubelet get pv -A:

NAMESPACE   NAME                                 CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS     REASON   AGE
            persistentvolume/pv-portainer-test   10Gi       RWO            Retain           Available           portainer-test            71s

Note that the namespace has not been defined... but I suppose this is not a serious issue. Maybe I'm wrong.

  1. I deployed Portainer from here and the following patch:​
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: portainer
      namespace: portainer
    spec:
      storageClassName: portainer-test
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: "10Gi"

Now with kubectl get pvc,pv -A I see that the PVC has been bound to the PV:

​NAMESPACE   NAME                              STATUS   VOLUME              CAPACITY   ACCESS MODES   STORAGECLASS     AGE
portainer   persistentvolumeclaim/portainer   Bound    pv-portainer-test   10Gi       RWO            portainer-test   16m

NAMESPACE   NAME                                 CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS     REASON   AGE
            persistentvolume/pv-portainer-test   10Gi       RWO            Retain           Bound    portainer/portainer   portainer-test            17m
  1. But the Portainer pod stays in the ContainerCreating status forever.​ With kubectl describe I see the reason:

Warning  FailedAttachVolume  2s (x7 over 38s)  attachdetach-controller  AttachVolume.Attach failed for volume "pv-portainer-test" : rpc error: code = FailedPrecondition desc = failed to publish volume: volume is attached

So it seems it is complaining because the PV is already attached... but indeed it should have been attached precisely to that pod.

Điểm:1
lá cờ in

Thông thường bạn không phải tạo PV trước, khi bạn tạo PVC, PV được tạo tự động. Tuy nhiên, hãy giữ nguyên như vậy và có nghi ngờ về lớp lưu trữ của bạn kiểm tra chân dung, bạn đã tạo ra nó như thế nào?

Nếu bạn bắt đầu lại từ đầu, tôi cho rằng bạn đã tạo bí mật cho mã thông báo API của mình cho Hetzner và kích hoạt trình điều khiển CSI, phải không? Sau đó yêu cầu PVC và triển khai vỏ không phải là vấn đề, trừ khi loại trình điều khiển được Kubernetes hỗ trợ. Tôi không biết bạn đang gặp phải loại nào, nhưng xin lưu ý rằng Kubernetes hỗ trợcsi.hetzner.cloud chỉ có v0.3, v1.0 các phiên bản.

Giả sử rằng bạn đã làm đúng mọi thứ trước đó và phiên bản Kubernetes (1.13 trở lên) và các phiên bản trình điều khiển đều tốt. Vì vậy, đây là hướng dẫn về cách tạo đối tượng PersistentVolume theo cách thủ công để thể hiện âm lượng hiện có:

phiên bản api: v1
loại: PersistentVolume
metadata:
  tên: pv-portainer-tes
thông số kỹ thuật:
  dung tích:
    lưu trữ: 10Gi
  chế độ truy cập:
    - ReadWriteOnce
  liên tụcVolumeReclaimPolicy: Giữ lại
  csi:
    trình điều khiển: csi.hetzner.cloud
    volumeHandle: portainer
    chỉ đọc: sai
    fsType: ext4
    volumeAttributes:
      foo: thanh
    bộ điều khiểnPublishSecretRef:
      tên: bí mật1
      không gian tên: mynamespace
    nodeStageSecretRef:
      Tên: MySecret2
      không gian tên: mynamespace
    nútPublishSecretRef
      Tên: MySecret3
      không gian tên: mynamespace

sau đó đính kèm và gắn kết khối lượng bằng cách triển khai một vỏ. Khi nhóm tham chiếu một ổ đĩa CSI được lên lịch, Kubernetes sẽ kích hoạt các hoạt động thích hợp đối với plugin CSI bên ngoài (ControllerPublishVolume, NodeStageVolume, NodePublishVolume, v.v.) để đảm bảo ổ đĩa đã chỉ định được gắn, gắn và sẵn sàng sử dụng bởi các vùng chứa trong vỏ quả.

Và lưu ý: có giới hạn cho trình điều khiển csi lên tới 16, vui lòng kiểm tra xem giới hạn của bạn có gần 16 không

lá cờ ru
(viết lại bình luận...)
lá cờ ru
«Thông thường bạn không phải tạo PV trước, khi bạn tạo PVC, PV sẽ được tạo tự động.» Có, nhưng vớipersistentVolumeReclaimPolicy: Xóa, trong khi tôi cần Giữ lại. «Tuy nhiên, hãy giữ nguyên như vậy và có nghi ngờ về bài kiểm tra portainer lớp lưu trữ của bạn, bạn đã tạo nó như thế nào?» Đối với những gì liên quan đến storageClass ở trên, đó là một sai lầm. Bây giờ tôi đã thay thế nó bằng hcloud-volume. Đối với phần còn lại, ví dụ bạn cung cấp rất thú vị, đặc biệt đối với những gì liên quan đến volumeHandle: portainer. Hãy để tôi thực hiện một vài nỗ lực mới và sau đó tôi sẽ nhận xét thêm.
lá cờ ru
Ok, thực tế đó là những gì tôi đã thực hiện và mô tả ở trên - volumeHandle cần phải là id của ổ đĩa mà tôi đã tạo trước. Và nó hoạt động cho những gì liên quan đến việc tạo PV, như tôi đã nói, nhưng nó không gắn vào nhóm. Theo như tôi hiểu thì không cần chỉ định các bí mật vì mã thông báo bí mật đã được cấp cho trình điều khiển Hetzner CSI trong khi cài đặt.
Điểm:1
lá cờ ru

Vấn đề không liên quan đến k8s, mà là cụ thể đối với Hetzner. Trong cấu hình dự án, tôi đã để ổ đĩa được gắn vào một máy chủ cố định, điều này rõ ràng khiến nó không khả dụng để gắn qua trình điều khiển CSI. Một người dùng tại Diễn đàn đám mây Hetzner chỉ cho tôi điều đó.

Dù sao thì tôi cũng muốn cảm ơn Bazhikov vì anh ấy đã cho tôi một số gợi ý hữu ích trong việc khắc phục các sự cố khác.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.