Aprendendo Kubernetes

O Kubernetes, ou K8S, é uma ferramenta de orquestração de contêineres, open-source, criada pelo google em 2000, com o objetivo de desenvolver aplicações distribuídas.

Quais problemas o Kubernetes resolve?

  • Autoscaling

    • Escalar ou reduzir, recursos ou número de máquinas, de maneira automatizada.
  • Deep Tracing

    • Capacidade de rastrear e monitorar todas as atividades de uma aplicação
  • Service Discovery

    • Capacidade de localizar ou acessar aplicações sobre um mesmo contexto de infraestrutura.
  • Roteamento e redes

  • Gerenciamento distribuido

  • Confusão de comunicação

Control Plane

A arquitetura do Kubernetes é definida por um cluster onde existe um node central que controla os nodes de trabalho, ou workers, que estão associados a ele, sendo assim, todo node de trabalho tem um control plane e pode resolver vários processos que recebe de demanda através do mesmo.

O control plane é o cérebro do sistema, que toma decisões sobre como os aplicativos devem ser executados e garante que o estado real do cluster corresponda ao desejado.

Em oposição ao conceito de máquinas virtuais, os nodes de trabalho são representados por múltiplas máquinas físicas, entretanto, respondem como se fosse apenas uma única máquina, utilizando o control plane para estabelecer esse ponto de acesso e gestão.

Com este ponto de acesso unificado, o processo faz-se simples para gerir cada máquina e consequentemente de cada processo executado nos nodes de trabalho, vale destacar que nenhum processo executa de maneira agregada, sobre o mesmo local físico, afinal estão todos separados pelos nodes de trabalho. Os serviços de um control plane são:

  • Scheduler Service:

    • Decide onde implantar tarefas no cluster.
  • API Service:

    • Fornece interface para gerenciar recursos no Kubernetes.
  • Node Controller:

    • Monitora e gerencia o estado dos nodes de trabalho.
  • State Storage:

    • Refere-se ao ETCD, um banco de dados que armazena o estado de configuração do cluster Kubernetes.

O node de trabalho

Os nodes de trabalhos, ou workers, são construídos por três partes, o process ao qual você delega que esse node seja executado, o proxy que cuida de toda camada de rede dentro para fora, e por fim, o kubelet que é responsável pelo estado do node assim como pela interface de comunicação com o control plane.

Kubeclt

É uma ferramenta CLI do Kubernetes onde, eu como desenvolvedor, posso inserir comandos que vão corresponder a uma ação exposta via API pelo control plane. Se trata de um recurso fundamental, pois é o único ponto de controle para toda e qualquer aplicação que esteja utilizando o Kubernetes como infraestrutura.

Possíveis comandos com o kubectl

kubectl get nodes : Lista os nodes disponíveis

kubectl top nodes : Lista os nodes e também seus recursos

Workloads

Tem por definição, tudo aquilo posto ao Kubernetes que gere alguma carga de trabalho, como por exemplo, aplicações, regras de rede, regras de ingress e etc.

Por padrão, o Kubernetes possui alguns workloads que são nativos

  • Pod

    • A menor unidade de implantação no Kubernetes, que contém um ou mais contêineres e compartilha recursos e rede.

    • Uma abstração de conjunto de containers

    • Contém cada um seu endereço de ip único dentro do cluster

    • Pode receber metadados para documentar e fazer gestão

    • Como uma abstração de um conjunto de containers é efêmero.

  • Deployment

    • Gerencia a implantação de aplicativos.

    • Gerencia a escalabilidade para os recursos do aplicativo.

    • Controla a manutenção dos pods em seu mesmo contexto.

    • Separação lógica não física.

  • ReplicaSet

    • Garante que o número especificado de réplicas de pods esteja em execução e mantém a alta disponibilidade dos aplicativos.
  • Horizontal Pod Scaler

    • Automatiza o dimensionamento de pods com base na métrica de uso de recursos, garantindo o desempenho ideal.
  • Ingress

    • Gerencia o acesso externo aos serviços no cluster Kubernetes, roteando o tráfego com base em regras definidas.
  • Service

    • Fornece uma abstração de rede para permitir a comunicação entre pods, permitindo a descoberta dinâmica de serviços no cluster.

Redes no Kubernetes

Dentro do Kubernetes todas as entidades se comunicam entre si, pods comunicam com pods e nodes se comunicam com nodes, todavia, existem duas abordagens para essa exposição sendo a primeira seria feita individualmente por cada entidade e a outra seria a concentração em um único lugar, ao qual, chamamos de api gateway.

Caso dois pods tentem se comunicar, estando sob o mesmo node, eles irão sempre utilizar uma rede interna. Entretanto, caso estejam em nodes diferentes utilizam da camada de proxy para se comunicar.

Services e os workloads de rede

Um conjunto de métodos de acesso, em rede, aos recursos do Kubernetes. Considerando a natureza efêmera dos pods, o ip dos mesmos também não é fixo portanto se fazem necessárias algumas abstrações para diferentes tipos de comunicações.

  • Custer IP

    • Para contextos de acesso interno dentro do cluster, está abstração de rede entrega um endereço para que pods e nodes diferentes se comuniquem.
  • Node Port

    • Para contextos de acesso externo, está abstração de rede entrega uma porta para internet ao utilizar o mesmo ip do node
  • Load Balancer

    • Para contextos de acesso externo, está abstração de rede entrega um balanceamento de carga expondo um ip fixo, sendo assim uma abstração e um superset do Node Port.
  • Ingress

    • Para contextos de acesso externo, gerencia o acesso aos serviços no cluster, roteando o tráfego com base em regras definidas. O Ingress atua como um controlador lógico e abstrato para o gerenciamento de regras de roteamento.
  • Ingress Controller

    • Para contextos de acesso externo, implementa as regras de roteamento definidas no recurso Ingress. O Ingress Controller traduz as regras em configurações específicas do ambiente, como regras de balanceamento de carga ou proxy reverso, para direcionar o tráfego externo para os serviços internos apropriados.

Segurança no Kubernetes

Namespace

É um divisão lógica dentro do mesmo cluster, de tal forma onde é possível dividir as aplicações sem que as mesmas estejam separadas por nodes. Ainda que não exista uma separação física, pode-se imaginar que o namespace é uma subdivisão do cluster. Um exemplo de casos de uso para namespaces são para permissões e recursos.

Permissões servem para diferenciar hierarquias e ações permitidas entre os diferentes escopos, por exemplo, é natural que um desenvolvedor tenha mais operações permitidas no seu usuário quando em ambiente de testes do que em produção.

Recursos servem para dimensionar cargas e custos de operações conforme os escopos citados acima, por exemplo, ambientes de testes não consomem tantos recursos computacionais quanto o ambiente de produção.

RBAC

Uma sigla que tem por definição Role based access control, é a maneira ao qual o Kubernetes resolve as permissões, sendo o RBAC um conceito baseado em papéis(roles) que seriam algo como políticas de acesso para um perfil.

Para cada role, é necessário vincular a mesma a alguém, para isso definimos o role binding que registra em um arquivo usuários que detém aquele papel.

Como padrão, o Kubernetes adota dois workloads para implementar como segurança dos dados sensíveis, uma delas se chama secrets e a outra configmap

  • Secret

    • Armazena informações confidenciais, como senhas e chaves de API, de forma segura.

    • Encoding para base64

    • Utilizado principalmente com environment para as aplicações servidas pelo node

    • kubectl create secret generic db-user-pass —from-file=./file.txt

    • kubectl describe secrets/db-user-pass

  • Configmap

    • Mantém configurações de aplicativos em formato de chave-valor, permitindo a separação de configurações e código.

    • Tem por característica a simplicidade em relação as secrets

    • Normalmente utilizado para definir constantes, inclusive podendo alterar esse valor sem precisar refazer um deploy.