kubernetes go-client PersistentVolumeClaim не предоставлен по запросу, застрял в состоянии ожидания - PullRequest
1 голос
/ 27 марта 2019

При использовании API go-client после использования вызова api.PersistentVolumeClaims(namespace).Create(createOpts) PersistentVolumeClaim отображается как ресурс, но остается в состоянии ожидания. Я не вижу никаких событий при использовании 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
        }

Я пытался найти хорошие примеры использования API создания с постоянными томами, но большинство примеров, как представляется, для наблюдателей и т. Д., И поэтому я потратил довольно много времени, пытаясь проанализировать код, ведя меня в явном виде, установив Status, но, похоже, это оказали нулевое воздействие. Я также попытался по умолчанию использовать VolumeMode в Spec, что не помогло.

Примеры, которые я прочитал, взяты из:

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, или кто-нибудь может дать какие-либо подсказки о том, как заставить процесс создания действительно перемещаться в кластере? Я предположил, что нижестоящие ресурсы, необходимые, например, для тома и т. Д., Автоматически выделяются при попытке создать ресурс заявки.

Большое спасибо, что заглянули, если вы зашли так далеко ...

1 Ответ

2 голосов
/ 27 марта 2019

То, что вы делаете в коде, выглядит правильно. Тем не менее, похоже, что ваш PVC не может найти соответствующий PV для связывания вместе.

Похоже, что вы используете hostPath PV (с классом хранения ), который не поддерживает динамическое предоставление . Также документировано здесь .

Так что, скорее всего, вам придется создать PV hostPath, чтобы ваш PVC мог связываться с ним. Объем должен быть равен или больше по размеру, как то, что вы запрашиваете в вашем PVC.

Другим вариантом является использование Local тома, который поддерживает динамическое предоставление, отличное от hostPath.

Вы можете отладить динамическое выделение ресурсов и привязку PVC / PV, просмотрев журналы kube-controller-manager на вашем лидере плоскости управления K8s.

...