未根据要求提供kubernetes go-client PersistentVolumeClaim,处于待处理状态

时间:2019-03-27 00:10:35

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

在我使用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

有人知道_test.go文件中超出单元测试范围的这些API的实际示例代码吗,还是有人可以提供有关如何使创建过程在群集中实际滚动的任何提示吗?我已经假定在尝试创建Claim资源时会自动调配诸如Volume等所需的下游资源。

非常感谢您来此看看...

1 个答案:

答案 0 :(得分:2)

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

您似乎正在使用hostPathstorage class PV(带有doesn't support dynamic provisioning)。另外,已记录here

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

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

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