【问题标题】:kubernetes go-client PersistentVolumeClaim not provisioned on request, stuck in Pending statekubernetes go-client PersistentVolumeClaim 未按请求配置,卡在 Pending 状态
【发布时间】:2019-08-17 11:22:23
【问题描述】:

在我使用 api.PersistentVolumeClaims(namespace).Create(createOpts) 调用后使用 go-client API 时,PersistentVolumeClaim 显示为资源,但仍处于 Pending 状态。使用kubectl describe pvc 时没有看到任何事件,也没有看到正在创建的任何卷等。

$ kubectl describe pvc --namespace=test -R
Name:          93007732-9d8c-406e-be99-f48faed3a061
Namespace:     test
StorageClass:  microk8s-hostpath
Status:        Pending
Volume:        93007732-9d8c-406e-be99-f48faed3a061
Labels:        <none>
Annotations:   <none>
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      0
Access Modes:  
VolumeMode:    Filesystem
Events:        <none>
Mounted By:    <none>

我使用的代码如下:


        volume, errGo := uuid.NewRandom()                                                                                                                                                 
        if errGo != nil {                                                                                                                                                                 
                job.failed = kv.Wrap(errGo).With("stack", stack.Trace().TrimRuntime())                                                                                                    
                return job.failed                                                                                                                                                         
        }                                                                                                                                                                                 
        job.volume = volume.String()

        fs := v1.PersistentVolumeFilesystem
        createOpts := &v1.PersistentVolumeClaim{
                ObjectMeta: metav1.ObjectMeta{
                        Name:      job.volume,
                        Namespace: job.namespace,
                        UID:       types.UID(job.volume),
                },
                Spec: v1.PersistentVolumeClaimSpec{
                        AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
                        Resources: v1.ResourceRequirements{
                                Requests: v1.ResourceList{
                                        v1.ResourceName(v1.ResourceStorage): resource.MustParse("10Gi"),
                                },
                        },
                        VolumeName: job.volume,
                        VolumeMode: &fs,
                },
                Status: v1.PersistentVolumeClaimStatus{
                        Phase:       v1.ClaimBound,
                        AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
                        Capacity: v1.ResourceList{
                                v1.ResourceName(v1.ResourceStorage): resource.MustParse("10Gi"),
                        },
                },
        }

        api := Client().CoreV1()
        if _, errGo = api.PersistentVolumeClaims(namespace).Create(createOpts); errGo != nil {
                job.failed = kv.Wrap(errGo).With("stack", stack.Trace().TrimRuntime())
                return job.failed
        }

我试图找到将 Create API 与持久卷一起使用的好示例,但大多数示例似乎是针对观察者等的,因此我花了很长时间尝试对代码进行逆向工程,引导我明确设置 Status 但这似乎影响为零。我还尝试在 Spec 中默认 VolumeMode,但没有帮助。

我读到的例子来自:

https://github.com/kubernetes/kubernetes/blob/master/pkg/controller/volume/persistentvolume/framework_test.go
https://godoc.org/k8s.io/api/core/v1#PersistentVolumeSpec
https://github.com/vladimirvivien/k8s-client-examples/tree/master/go/pvcwatch
https://medium.com/programming-kubernetes/building-stuff-with-the-kubernetes-api-part-4-using-go-b1d0e3c1c899

有谁知道这些 API 的实际示例代码超出了 _test.go 文件中的单元测试,或者任何人都可以提供任何关于如何让创建过程在集群中实际滚动的提示?我假设当我尝试创建 Claim 资源时,会自动配置所需的下游资源,例如 Volume 等。

非常感谢您看到这里...

【问题讨论】:

    标签: kubernetes persistent-volume-claims kubernetes-go-client


    【解决方案1】:

    您在代码中所做的看起来是正确的。但是,您的 PVC 似乎找不到匹配的 PV 来绑定在一起。

    看起来您正在使用hostPath PV(带有storage classdoesn't support dynamic provisioning。另外,记录了here

    因此很可能您必须创建一个 hostPath PV,以便您的 PVC 可以绑定到它。卷的大小必须等于或大于您在 PVC 中请求的大小。

    另一种选择是使用支持动态配置的Local 卷,该卷不同于hostPath。

    您可以通过查看您的 K8s 控制平面领导者上的 kube-controller-manager 日志来调试 PVC/PV 的动态配置和绑定。

    【讨论】:

    • 感谢您的帮助。我通过删除 ObjectMeta 部分中的 UID 和 Spec 部分中的 VolumeName 来使其工作。这些似乎暗示供应是由您建议的另一个实体完成的。我认为我们在状态中看到的 hostPath 可能是使用 microk8s 的产物,所以没问题。再次感谢您的帮助。
    猜你喜欢
    • 2020-11-22
    • 2019-03-05
    • 2019-02-21
    • 2022-08-23
    • 1970-01-01
    • 2019-05-20
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多