Noções Básicas de Kubernetes Operators
10 exemplos para você começar com K8s Operators - 7 básicos e 3 intermediários.
Busque em todas as páginas da documentação
10 exemplos para você começar com K8s Operators - 7 básicos e 3 intermediários.
kubectl e um cluster local (kind, minikube ou Docker Desktop Kubernetes).kustomize (incluído com versões recentes do kubectl) para make deploy.go version, kubebuilder version, kubectl cluster-info.Crie um módulo com o grupo de API webapp.example.com e um tipo Guestbook.
mkdir guestbook-operator && cd guestbook-operator
kubebuilder init --domain example.com --repo example.com/guestbook-operator
kubebuilder create api --group webapp --version v1 --kind Guestbook --resource --controllerinit gera o esqueleto de main.go, Makefile e Dockerfile.create api adiciona api/v1/guestbook_types.go e internal/controller/guestbook_controller.go.go mod tidy após a estruturação para resolver os módulos do controller-runtime.Relacionado: Design de CRD e Estruturação do Kubebuilder - Marcadores de API e geração de código
Use controller-gen através do Makefile do projeto para emitir o YAML de instalação.
make manifests
ls config/crd/bases/make manifests executa controller-gen com marcadores +kubebuilder dos tipos Go.config/crd/bases/ e config/rbac/.kubectl apply.Relacionado: Design de CRD e Estruturação do Kubebuilder - marcadores de validação
Aplique CRDs e RBAC gerados ao kind ou minikube.
make install
kubectl get crd | grep webappmake install aplica as bases de CRD de config/crd.guestbooks.webapp.example.com aparece antes de iniciar o gerenciador.Relacionado: Gerenciador, Cliente e Esquema do controller-runtime - Registro do Esquema
O controlador gerado implementa Reconcile com um cliente tipado.
func (r *GuestbookReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
var gb webappv1.Guestbook
if err := r.Get(ctx, req.NamespacedName, &gb); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
}
// TODO: garantir que os recursos filhos desejados existam
return ctrl.Result{}, nil
}req.NamespacedName identifica o objeto que acionou o trabalho.client.IgnoreNotFound(err) quando o CR foi excluído.ctrl.Result{} vazio significa sucesso sem reenfileiramento forçado.Relacionado: Escrevendo um Reconciliador: Loop ctrl.Request & Reconcile - reenfileiramento e erros
Conecte o reconciliador em main.go com o cliente e o esquema do Gerenciador.
if err = (&controller.GuestbookReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Guestbook")
os.Exit(1)
}mgr.GetClient() é um cliente em cache seguro para leituras dentro da reconciliação.SetupWithManager registra watches e conecta a workqueue.Relacionado: Gerenciador, Cliente e Esquema do controller-runtime - Ciclo de vida do Gerenciador
Inicie o operador contra seu kubeconfig com a eleição de líder desabilitada para desenvolvimento.
make runmake run executa go run ./cmd/main.go com acesso ao cluster sem envtest.kubectl apply -f config/samples/.Relacionado: Eleição de Líder, Métricas e Observabilidade do Operador - endpoints de saúde e métricas
Use o manifesto de exemplo gerado para acionar a reconciliação.
apiVersion: webapp.example.com/v1
kind: Guestbook
metadata:
name: guestbook-sample
namespace: default
spec:
frontendSize: 2kubectl apply -f config/samples/webapp_v1_guestbook.yaml
kubectl get guestbook guestbook-sample -o yamlconfig/samples/ após create api..status assim que você as implementar.spec e confirme se o reconciliador é executado novamente (orientado por nível).Relacionado: Watches, Predicates, Owner References & Finalizers - filtragem de eventos
Vincule o ciclo de vida de um Deployment filho ao CR Guestbook pai.
dep := &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{
Name: gb.Name + "-frontend", Namespace: gb.Namespace,
}}
if err := controllerutil.SetControllerReference(&gb, dep, r.Scheme); err != nil {
return ctrl.Result{}, err
}SetControllerReference requer que o proprietário tenha o sinalizador de controlador definido.Relacionado: Watches, Predicates, Owner References & Finalizers - GC e watches
Bloqueie a remoção do CR até que a limpeza externa seja concluída.
if !controllerutil.ContainsFinalizer(&gb, finalizerName) {
controllerutil.AddFinalizer(&gb, finalizerName)
return ctrl.Result{}, r.Update(ctx, &gb)
}
if !gb.DeletionTimestamp.IsZero() {
// desfaça os recursos externos, então:
controllerutil.RemoveFinalizer(&gb, finalizerName)
return ctrl.Result{}, r.Update(ctx, &gb)
}Update.Relacionado: Watches, Predicates, Owner References & Finalizers - segurança de descarte
Teste a lógica de reconciliação sem um cluster ativo usando envtest.
make testtestEnv := &envtest.Environment{
CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")},
}
cfg, err := testEnv.Start()suite_test.go.make test executa go test com CRDs carregados em um plano de controle local.Relacionado: Testando Operadores com envtest e cliente fake - padrões de cliente fake
Versões da Stack: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC, 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: 18 de jul. de 2026