«k8s.io/apimachinery/pkg/runtime».Object (отсутствует метод DeepCopyObject)

Я новичок в Kubernetes. Столкновение с этой ошибкой при создании специального плагина планировщика K8. Я все делал по этой ссылке Kube-Scheduler-Plugin, все делается но когда запускаю

./hack/update-codegen.sh

Этот файл не создает DeepCopyObject, поскольку когда я запускаю команду make, он выдает эту ошибку

$ make
fatal: No names found, cannot describe anything.
fatal: No names found, cannot describe anything.
fatal: No names found, cannot describe anything.
GOOS=linux CGO_ENABLED=0 go build -ldflags '-w' -o bin/controller cmd/controller/controller.go
GOOS=linux CGO_ENABLED=0 go build -ldflags '-X k8s.io/component-base/version.gitVersion=v0.0.20240430 -w' -o bin/kube-scheduler cmd/scheduler/main.go
# sigs.k8s.io/scheduler-plugins/apis/config
apis/config/register.go:47:3: cannot use &PIDControllerArgs{} (value of type *PIDControllerArgs) as "k8s.io/apimachinery/pkg/runtime".Object value in argument to scheme.AddKnownTypes: *PIDControllerArgs does not implement "k8s.io/apimachinery/pkg/runtime".Object (missing method DeepCopyObject)
make: *** [Makefile:62: build-scheduler] Error 1

Я устранял неполадки, но не смог найти проблему и использовать тег как следует. Может ли кто-нибудь указать правильное направление для дальнейшего устранения неполадок. Спасибо

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type PIDControllerArgs struct {
    metav1.TypeMeta

    // EndpointURL is the URL to which score requests will be sent.
    EndpointURL *string

    // MaxIdleConnections defines the maximum number of idle connections to the     server.
    MaxIdleConnections *int

    // IdleConnectionTimeoutSec defines the timeout for idle connections in seconds.
    IdleConnectionTimeoutSec *int

    // RequestTimeoutSec defines the timeout for requests in seconds.
    RequestTimeoutSec *int
}

/config/v1/type.go

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// +k8s:defaulter-gen=true
type PIDControllerArgs struct {
    metav1.TypeMeta `json:",inline"`

    // EndpointURL is the URL to which score requests will be sent.
    EndpointURL *string `json:"endpointURL,omitempty"`

    // MaxIdleConnections defines the maximum number of idle connections to the server.
    MaxIdleConnections *int `json:"maxIdleConnections,omitempty"`

    // IdleConnectionTimeoutSec defines the timeout for idle connections in seconds.
    IdleConnectionTimeoutSec *int `json:"idleConnectionTimeoutSec,omitempty"`

    // RequestTimeoutSec defines the timeout for requests in seconds.
    RequestTimeoutSec *int `json:"requestTimeoutSec,omitempty"`
}

Что произойдет, если вы создадите файлы doc.go как в pkg/apis/config, так и в pkg/apis/config/v1 с // +k8s:deepcopy-gen=package,register, за которым следует правильный package ...? Я ожидаю, что при запуске go generate ./... в обоих пакетах будут созданы файлы generated.deepcopy.go, каждый из которых будет содержать методы DeepCopy*, необходимые интерфейсу (k8s.io/apimachinery/pkg/runtime.Object).

DazWilkin 30.04.2024 23:52
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
1
141
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В каждом пакете, в котором вы хотите сгенерировать код, должны быть файлы doc.go:

.
└── pkg
    └── apis
        └── config
            ├── doc.go
            ├── types.go
            └── v1
                ├── doc.go
                └── types.go

Файлы doc.go должны содержать:

// +k8s:deepcopy-gen=package,register
package {name}

Где {name} заменяется именем пакета: config и v1

Структуры в двух файлах types.go должны включать имеющиеся у вас комментарии:

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

Тогда make должно работать или, если вы установили deepcopy-gen:

go install k8s.io/code-generator/cmd/deepcopy-gen@latest

Ты можешь:

deepcopy-gen \
--v=9 \
./pkg/apis/config/...

В результате в обоих пакетах должны появиться файлы generated.deepcopy.go.

Сообщение об ошибке (ниже) появляется из-за того, что интерфейс runtime#Object не работает без методов DeepCopyObject в ваших структурах. Файлы generated.deepcopy.go удовлетворяют этому требованию.

cannot use PIDControllerArgs as "k8s.io/apimachinery/pkg/runtime".Object

См. документацию deepcopy-gen.

Другие вопросы по теме