Design e Scaffolding de CRD com kubebuilder
Custom Resource Definitions expõem a linguagem de domínio do seu operador aos usuários do cluster como YAML.
Busque em todas as páginas da documentação
Custom Resource Definitions expõem a linguagem de domínio do seu operador aos usuários do cluster como YAML.
O kubebuilder transforma tipos de API Go e comentários de marcadores em manifestos CRD, regras RBAC e stubs de webhook através do controller-gen.
Defina tipos em api/v1/ (e versões futuras) com campos de struct marcados para JSON e validação.
Marcadores de comentário como +kubebuilder:validation:Minimum=1 tornam-se restrições OpenAPI no CRD.
Execute make manifests para regenerar o YAML sempre que os tipos mudarem.
Planeje o versionamento com antecedência: adicione v2 como um novo pacote, marque uma versão como de armazenamento, implemente a conversão se os campos mudarem de nome.
Cartão de receita de referência rápida - pronto para copiar e colar.
// +kubebuilder:object:root=true
// +kubebuilder:subresource:status
// +kubebuilder:resource:scope=Namespaced
// +kubebuilder:printcolumn:name="Replicas",type=integer,JSONPath=".spec.frontendSize"
// +kubebuilder:printcolumn:name="Ready",type=boolean,JSONPath=".status.ready"
type Guestbook struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec GuestbookSpec `json:"spec,omitempty"`
Status GuestbookStatus `json:"status,omitempty"`
}
type GuestbookSpec struct {
// +kubebuilder:validation:Minimum=1
// +kubebuilder:validation:Maximum=10
FrontendSize int32 `json:"frontendSize"`
}Quando usar isso:
kubebuilder create apikubectl get para engenheiros de suporte// api/v1/guestbook_types.go
package v1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// GuestbookSpec define o estado desejado do Guestbook.
type GuestbookSpec struct {
// +kubebuilder:validation:Minimum=1
// +kubebuilder:validation:Maximum=10
FrontendSize int32 `json:"frontendSize"`
// +kubebuilder:validation:Enum=small;medium;large
Tier string `json:"tier,omitempty"`
}
// GuestbookStatus define o estado observado do Guestbook.
type GuestbookStatus struct {
Ready bool `json:"ready,omitempty"`
Conditions []metav1.Condition `json:"conditions,omitempty"`
}
// +kubebuilder:object:root=true
// +kubebuilder:subresource:status
// +kubebuilder:storageversion
// +kubebuilder:resource:shortName=gb
// +kubebuilder:printcolumn:name="Tier",type=string,JSONPath=".spec.tier"
// +kubebuilder:printcolumn:name="Ready",type=boolean,JSONPath=".status.ready"
type Guestbook struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec GuestbookSpec `json:"spec,omitempty"`
Status GuestbookStatus `json:"status,omitempty"`
}
// +kubebuilder:object:root=true
type GuestbookList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []Guestbook `json:"items"`
}
func init() {
SchemeBuilder.Register(&Guestbook{}, &GuestbookList{})
}# Alvo do Makefile (gerado pelo kubebuilder)
controller-gen rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/basesO que isso demonstra:
+kubebuilder:storageversion fixa o armazenamento etcd nesta versãomake manifests alimenta config/crd/bases/webapp.example.com_guestbooks.yaml+kubebuilder: e emite YAML CRD, regras ClusterRole e configurações de webhook.config/crd/bases/; sobreposições kustomize corrigem nomes, namespaces e bundles de CA de webhook para instalação.PROJECT + flag create api --group (webapp.example.com/v1).subresources.status do CRD quanto permissões RBAC */status geradas a partir de marcadores +kubebuilder:rbac nos reconciliadores.| Padrão | Propósito |
|---|---|
v1alpha1 | Experimental, alterações que quebram são permitidas |
v1beta1 | Conjunto de campos estabilizando, a conversão pode aparecer |
v1 | Compatível com GA; prefira adições retrocompatíveis |
| Conversão hub-spoke | Mapeia campos v1 e v2 através de um tipo hub |
| Marcador | Efeito |
|---|---|
+kubebuilder:validation:Required | Campo obrigatório no OpenAPI |
+kubebuilder:default=value | Padrão injetado pelo CRD |
+kubebuilder:validation:Pattern | Regex em strings |
+kubebuilder:rbac:groups=...,resources=...,verbs=... | Regra RBAC em config/rbac |
+kubebuilder:webhook:... | Configuração de webhook de validação ou mutação |
// Marcadores RBAC do Reconciler (no arquivo do controller)
// +kubebuilder:rbac:groups=webapp.example.com,resources=guestbooks,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=webapp.example.com,resources=guestbooks/status,verbs=get;update;patchmake manifests sobrescreverá as alterações. Correção: altere os tipos Go e os marcadores, e regenere.v2, implemente a conversão, mantenha v1 servido.GuestbookList com +kubebuilder:object:root=true.+kubebuilder:storageversion entre as versões.omitempty em escalares não pode distinguir zero de não definido para validação. Correção: use ponteiros para inteiros opcionais ou enums quando zero for válido.Status().Update retorna 403. Correção: adicione verbos guestbooks/status aos marcadores rbac.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| kubebuilder + controller-gen | Operadores Go com APIs tipadas | O CRD é mantido por uma equipe separada em YAML bruto |
| YAML CRD escrito à mão | Fonte de verdade de esquema agnóstica de linguagem | Você quer geração de código RBAC e webhook a partir de Go |
| Validação declarativa apenas com Kubebuilder | Restrições de campo simples | Regras complexas entre campos precisam de CEL ou webhooks |
| Webhooks de Admissão para Validação | Políticas além do OpenAPI | Todas as regras simples de min/max (prefira marcadores primeiro) |
O controller-gen invocado por make manifests lê tipos Go e marcadores kubebuilder.
A saída fica em config/crd/bases/.
Execute kubebuilder create api --group webapp --version v2 --kind Guestbook, implemente a conversão, marque a versão de armazenamento na versão canônica.
A versão do CRD que o etcd persiste os objetos.
Outras versões servidas são convertidas para e a partir do armazenamento na leitura/escrita.
Marcadores são comentários interpretados pelo controller-gen no tempo de geração de código.
Sintaxe de marcador inválida falha make manifests, não go build.
Elas adicionam colunas kubectl get sem plugins personalizados.
O JSONPath deve corresponder aos campos de esquema CRD publicados.
Quando as regras envolvem múltiplos campos (spec.end > spec.start) que os marcadores OpenAPI por campo não conseguem expressar.
Adicione regras +kubebuilder:validation:XValidation em versões mais recentes do kubebuilder ou corrija o YAML CRD.
Domínio, caminho do repositório e versão do layout que o kubebuilder usa para comandos de scaffolding.
Mantenha-o no controle de versão.
Use +kubebuilder:resource:scope=Cluster em tipos com escopo de cluster.
O RBAC e o manuseio de namespace nos reconciliadores mudam de acordo.
+kubebuilder:resource:shortName=gb permite kubectl get gb.
Ainda exige que os usuários conheçam o grupo de API para nomes curtos ambíguos.
Sim.
A convenção do Kubernetes e a separação de RBAC exigem que o spec seja gravável pelo usuário e o status gravável pelo controlador.
make installVersões da Stack: Esta página foi escrita para Go 1.26.x (GC padrão Green Tea, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026