kubernetes go-клиентская система PersistentVolumeClaim не подготовлена по запросу, застряла в состоянии ожидания

#kubernetes #persistent-volume-claims #kubernetes-go-client

#kubernetes #постоянные заявки на объем #kubernetes-go-client

Вопрос:

При использовании go-client API после 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 := amp;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: amp;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 , но, похоже, это не оказало никакого влияния. Я также попытался установить 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, или кто-нибудь может дать какие-либо подсказки относительно того, как фактически запустить процесс создания в кластере? Я предположил, что ресурсы, необходимые для последующего потока, например, том и т.д., Автоматически предоставляются, когда я пытаюсь создать ресурс заявки.

Большое спасибо за просмотр, если вы зашли так далеко…

Ответ №1:

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

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

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

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

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

Комментарии:

1. Спасибо за вашу помощь. Я заставил его работать, удалив UID в разделе ObjectMeta и VolumeName в разделе спецификации. Похоже, это подразумевает, что предоставление выполняется другим объектом, как вы предлагаете. Я думаю, что путь к хосту, который мы видим в статусе, может быть артефактом использования microk8s, и поэтому все в порядке. Еще раз спасибо за вашу помощь.