Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Criando operators para Kubernetes usando Go

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →

Criando operators para Kubernetes usando Go

Palestra apresentada no Golang SP, link da palestra: https://www.youtube.com/watch?v=TfrNmPPNMuk

Alguns slides possuem o link para um Gif de demonstração

Avatar for Matheus Moraes

Matheus Moraes

June 18, 2020

Other Decks in Technology

Transcript

  1. // Principais características • Expõe uma API REST • Usa

    o etcd como seu database • Possui o kubectl como principal client de sua API • Recursos geralmente são declarados em YAML • Arquitetura com foco em eventos • API extensível
  2. // O Recurso deployment Cabeçalho: Padrão para todos os recursos,

    descreve qual versão da API será usada, qual o tipo (Kind) do recurso que está descrito e qual o nome desse recurso. $ cat resource.yaml
  3. // O Recurso deployment Spec: Específico por tipo (Kind) de

    recurso. Descreve o estado desejado do recurso que está sendo criado. $ cat resource.yaml
  4. // Para visualizar todos os recursos e APIs • $

    kubectl api-resources • $ kubectl api-versions
  5. // Kubernetes $ kubectl apply -f resource.yaml API Server API

    Server: Responsável pelo gerenciamento e validação do manifesto.
  6. // Kubernetes $ kubectl apply -f resource.yaml API Server etcd:

    Responsável por guardar o manifesto (age como um banco de dados) etcd
  7. // Kubernetes $ kubectl apply -f resource.yaml API Server controller-manager:

    Controla a estado atual vs estado desejado do cluster. etcd controller-manager
  8. // Kubernetes • Expõe uma API REST • Usa o

    etcd como seu database • Possui o kubectl como principal client de sua API • Recursos geralmente são declarados em YAML • Arquitetura com foco em eventos • API extensível
  9. // Custom resource definition (CRD) Spec: Declaração do recurso, podendo

    incluir validações que serão validadas direto pela API
  10. // Kubernetes Operator • Um pattern introduzido pelo CoreOS •

    Um controller não core do Kubernetes • Usa CRDs! • Específico para uma aplicação • Estende a API do Kubernetes para fazer da aplicação um Custom Resource
  11. // Vantagens de usar um Operator • Encapsula lógica que

    um “Operador” teria sobre o negócio • Abstrai para dentro do Kubernetes algo que não é nativo do Kubernetes • Faz uso da API nativa do Kubernetes • Orientado a eventos (Conectado diretamente ao etcd) • Interação via kubectl
  12. // Exemplo de Operators • https://github.com/argoproj/argo-cd • https://github.com/zalando/postgres-operator • https://github.com/jaegertracing/jaeger-operator

    • https://github.com/coreos/prometheus-operator • https://github.com/operator-framework/awesome-operators
  13. // AWS IAM Roles - O que é • IAM:

    Identity Access Manager • Role: perfil a ser incorporado pela aplicação com permissões pré definidas a recursos da AWS • Cada aplicação possui uma role • Uma role possui N policies • Eram gerenciadas fora do cluster, via terraform • Aplicações frequentemente precisavam ser migradas de cluster/conta AWS, e as roles eram esquecidas.
  14. // AWS IAM Roles - Critérios de aceite • Maneira

    mais fácil de escrever policies sem usar JSON • Opção de usar policies já existentes na AWS • Suporte a policies em JSON para casos específicos
  15. // AWS IAM Roles: Um operator • Porque um Operator?

    ◦ Move junto com o cluster ◦ Gerenciamento acoplado à aplicação ◦ Continua infra as code ◦ Entra no workflow para quem já está acostumado a trabalhar com o ecossistema do Kubernetes
  16. // Como criar um Operator • Client nativo do Kubernetes

    em Go: k8s.io/client-go • Kopf (https://github.com/zalando-incubator/kopf) • Kubebuilder (https://github.com/kubernetes-sigs/kubebuilder) • Operator-sdk (https://github.com/operator-framework/operator-sdk) ◦ Go ◦ Helm ◦ Ansible
  17. // Como criar um Operator • Client nativo do Kubernetes

    em Go: k8s.io/client-go • Kopf (https://github.com/zalando-incubator/kopf) • Kubebuilder (https://github.com/kubernetes-sigs/kubebuilder) • Operator-sdk (https://github.com/operator-framework/operator-sdk) ◦ Go ◦ Helm ◦ Ansible
  18. // Instalando operator-sdk https://sdk.operatorframework.io/docs/install-operator-sdk/#install-from-github-release # Set the release version variable

    $ RELEASE_VERSION=v0.18.1 # Linux $ curl -LO https://github.com/operator-framework/operator-sdk/releases/download/${RELEASE_VERSION}/operat or-sdk-${RELEASE_VERSION}-x86_64-linux-gnu # macOS $ curl -LO https://github.com/operator-framework/operator-sdk/releases/download/${RELEASE_VERSION}/operat or-sdk-${RELEASE_VERSION}-x86_64-apple-darwin
  19. // Operator-sdk cmd: Arquivo principal do operator, instancia um novo

    manager que registra todos os custom resources definitions dentro de pkg/apis e inicia todos os controllers dentro de pkg/controllers
  20. // Operator-sdk pkg/controller: Implementação dos controllers. Usuários devem editar os

    arquivos pkg/controller/<kind>/<kind>_controller.go para implementar a lógica de gerenciamento de recursos.
  21. // Operator-sdk pkg/apis: Path que define as APIs (Custom resources

    definitions). Usuários devem editar pkg/apis/<group>/<version>/<kind>_types.go para definir seus recursos e importá-los no controller.
  22. // Operator-sdk deploy: Recursos necessários para o deploy do Operator

    em si. Role, ServiceAccount, RoleBinding e Deployment.
  23. // Para regerar código • $ operator-sdk generate k8s ◦

    Gera deep copy para API do Kubernetes • $ operator-sdk generate crds ◦ Gera o CRD baseado no arquivo iamrole_types.go ◦ Validação adicionais usando markers: https://book.kubebuilder.io/reference/markers/crd-validation.html
  24. // Reconcile loop • Funciona como uma fila • Pode

    responder OK • Pode responder erro • Pode responder para tentar mais tarde
  25. // Deletando o recurso • Caso seu operator faça uso

    de outros recursos do cluster, você deve declarar o seu custom resource como “dono” do objeto e assim que o custom resource for deletado o recurso declarado como propriedade também será deletado. • Exemplo: Deployment apagado, pods são apagados.