|
| 1 | +--- |
| 2 | +title: Padrão Operador |
| 3 | +content_template: templates/concept |
| 4 | +weight: 30 |
| 5 | +--- |
| 6 | + |
| 7 | +{{% capture overview %}} |
| 8 | + |
| 9 | +Operadores são extensões de software para o Kubernetes que |
| 10 | +fazem uso de [*recursos personalizados*](/docs/concepts/extend-kubernetes/api-extension/custom-resources/) |
| 11 | +para gerir aplicações e os seus componentes. Operadores seguem os |
| 12 | +princípios do Kubernetes, notavelmente o [ciclo de controle](/docs/concepts/#kubernetes-control-plane). |
| 13 | + |
| 14 | +{{% /capture %}} |
| 15 | + |
| 16 | + |
| 17 | +{{% capture body %}} |
| 18 | + |
| 19 | +## Motivação |
| 20 | + |
| 21 | +O padrão Operador tem como objetivo capturar o principal objetivo de um operador |
| 22 | +humano que gere um serviço ou um conjunto de serviços. Operadores humanos |
| 23 | +responsáveis por aplicações e serviços específicos têm um conhecimento |
| 24 | +profundo da forma como o sistema é suposto se comportar, como é instalado |
| 25 | +e como deve reagir na ocorrência de problemas. |
| 26 | + |
| 27 | +As pessoas que executam cargas de trabalho no Kubernetes habitualmente gostam |
| 28 | +de usar automação para cuidar de tarefas repetitivas. O padrão Operador captura |
| 29 | +a forma como pode escrever código para automatizar uma tarefa para além do que |
| 30 | +o Kubernetes fornece. |
| 31 | + |
| 32 | +## Operadores no Kubernetes |
| 33 | + |
| 34 | +O Kubernetes é desenhado para automação. *Out of the box*, você tem bastante |
| 35 | +automação embutida no núcleo do Kubernetes. Pode usar |
| 36 | +o Kubernetes para automatizar instalações e executar cargas de trabalho, |
| 37 | +e pode ainda automatizar a forma como o Kubernetes faz isso. |
| 38 | + |
| 39 | +O conceito de {{< glossary_tooltip text="controlador" term_id="controller" >}} no |
| 40 | +Kubernetes permite a extensão do comportamento sem modificar o código do próprio |
| 41 | +Kubernetes. |
| 42 | +Operadores são clientes da API do Kubernetes que atuam como controladores para |
| 43 | +um dado [*Custom Resource*](/docs/concepts/api-extension/custom-resources/) |
| 44 | + |
| 45 | +## Exemplo de um Operador {#exemplo} |
| 46 | + |
| 47 | +Algumas das coisas que um operador pode ser usado para automatizar incluem: |
| 48 | + |
| 49 | +* instalar uma aplicação a pedido |
| 50 | +* obter e restaurar backups do estado dessa aplicação |
| 51 | +* manipular atualizações do código da aplicação juntamente com alterações |
| 52 | + como esquemas de base de dados ou definições de configuração extra |
| 53 | +* publicar um *Service* para aplicações que não suportam a APIs do Kubernetes |
| 54 | + para as descobrir |
| 55 | +* simular una falha em todo ou parte do cluster de forma a testar a resiliência |
| 56 | +* escolher um lider para uma aplicação distribuída sem um processo |
| 57 | + de eleição de membro interno |
| 58 | + |
| 59 | +Como deve um Operador parecer em mais detalhe? Aqui está um exemplo em mais |
| 60 | +detalhe: |
| 61 | + |
| 62 | +1. Um recurso personalizado (*custom resource*) chamado SampleDB, que você pode |
| 63 | + configurar para dentro do *cluster*. |
| 64 | +2. Um *Deployment* que garante que um *Pod* está a executar que contém a |
| 65 | + parte controlador do operador. |
| 66 | +3. Uma imagem do *container* do código do operador. |
| 67 | +4. Código do controlador que consulta o plano de controle para descobrir quais |
| 68 | + recursos *SampleDB* estão configurados. |
| 69 | +5. O núcleo do Operador é o código para informar ao servidor da API (*API server*) como fazer |
| 70 | + a realidade coincidir com os recursos configurados. |
| 71 | + * Se você adicionar um novo *SampleDB*, o operador configurará *PersistentVolumeClaims* |
| 72 | + para fornecer armazenamento de base de dados durável, um *StatefulSet* para executar *SampleDB* e |
| 73 | + um *Job* para lidar com a configuração inicial. |
| 74 | + * Se você apagá-lo, o Operador tira um *snapshot* e então garante que |
| 75 | + o *StatefulSet* e *Volumes* também são removidos. |
| 76 | +6. O operador também gere backups regulares da base de dados. Para cada recurso *SampleDB*, |
| 77 | + o operador determina quando deve criar um *Pod* que possa se conectar |
| 78 | + à base de dados e faça backups. Esses *Pods* dependeriam de um *ConfigMap* |
| 79 | + e / ou um *Secret* que possui detalhes e credenciais de conexão com à base de dados. |
| 80 | +7. Como o Operador tem como objetivo fornecer automação robusta para o recurso |
| 81 | + que gere, haveria código de suporte adicional. Para este exemplo, |
| 82 | + O código verifica se a base de dados está a executar uma versão antiga e, se estiver, |
| 83 | + cria objetos *Job* que o atualizam para si. |
| 84 | + |
| 85 | +## Instalar Operadores |
| 86 | + |
| 87 | +A forma mais comum de instalar um Operador é a de adicionar a |
| 88 | +definição personalizada de recurso (*Custom Resource Definition*) e |
| 89 | +o seu Controlador associado ao seu cluster. |
| 90 | +O Controlador vai normalmente executar fora do |
| 91 | +{{< glossary_tooltip text="plano de controle" term_id="control-plane" >}}, |
| 92 | +como você faria com qualquer aplicação containerizada. |
| 93 | +Por exemplo, você pode executar o controlador no seu cluster como um *Deployment*. |
| 94 | + |
| 95 | +## Usando um Operador |
| 96 | + |
| 97 | +Uma vez que você tenha um Operador instalado, usaria-o adicionando, modificando |
| 98 | +ou apagando a espécie de recurso que o Operador usa. Seguindo o exemplo acima, |
| 99 | +você configuraria um *Deployment* para o próprio Operador, e depois: |
| 100 | + |
| 101 | +```shell |
| 102 | +kubectl get SampleDB # encontra a base de dados configurada |
| 103 | + |
| 104 | +kubectl edit SampleDB/example-database # mudar manualmente algumas definições |
| 105 | +``` |
| 106 | + |
| 107 | +…e é isso! O Operador vai tomar conta de aplicar |
| 108 | +as mudanças assim como manter o serviço existente em boa forma. |
| 109 | + |
| 110 | +## Escrevendo o seu prórpio Operador {#escrevendo-operador} |
| 111 | + |
| 112 | +Se não existir no ecosistema um Operador que implementa |
| 113 | +o comportamento que pretende, pode codificar o seu próprio. |
| 114 | +[Qual é o próximo](#qual-é-o-próximo) você vai encontrar |
| 115 | +alguns *links* para bibliotecas e ferramentas que pode usar |
| 116 | +para escrever o seu próprio Operador *cloud native*. |
| 117 | + |
| 118 | +Pode também implementar um Operador (isto é, um Controlador) usando qualquer linguagem / *runtime* |
| 119 | +que pode atuar como um [cliente da API do Kubernetes](/docs/reference/using-api/client-libraries/). |
| 120 | + |
| 121 | +{{% /capture %}} |
| 122 | + |
| 123 | +{{% capture whatsnext %}} |
| 124 | + |
| 125 | +* Aprenda mais sobre [Recursos Personalizados](/docs/concepts/extend-kubernetes/api-extension/custom-resources/) |
| 126 | +* Encontre operadores prontos em [OperatorHub.io](https://operatorhub.io/) para o seu caso de uso |
| 127 | +* Use ferramentes existentes para escrever os seus Operadores: |
| 128 | + * usando [KUDO](https://kudo.dev/) (Kubernetes Universal Declarative Operator) |
| 129 | + * usando [kubebuilder](https://book.kubebuilder.io/) |
| 130 | + * usando [Metacontroller](https://metacontroller.app/) juntamente com WebHooks que |
| 131 | + implementa você mesmo |
| 132 | + * usando o [Operator Framework](https://github.com/operator-framework/getting-started) |
| 133 | +* [Publique](https://operatorhub.io/) o seu operador para que outras pessoas o possam usar |
| 134 | +* Leia o [artigo original da CoreOS](https://coreos.com/blog/introducing-operators.html) que introduz o padrão Operador |
| 135 | +* Leia um [artigo](https://cloud.google.com/blog/products/containers-kubernetes/best-practices-for-building-kubernetes-operators-and-stateful-apps) da Google Cloud sobre as melhores práticas para contruir Operadores |
| 136 | + |
| 137 | +{{% /capture %}} |
0 commit comments