Construindo uma plataforma de Kubernetes pronta para produção

Marcus Rios

{
    "nome": "Marcus Rios",
    "função": "Software Engineer @ Elo7",
    "educação": [
        "Redes de Computadores",
        "Ciência da Computação (wip)"
    ],
    "interesses": [
        "assistir séries",
        "video-games",
        "ler sobre tópicos aleatórios"
    ],
    "telegram": "@marcusrios",
    "linkedin": "https://www.linkedin.com/in/-mvmr/"
}

Como o elo7 fazia alguns anos atrás?

  • Docker puro (~2014/2015)
  • portabilidade
  • configurações manuais
  • pouca automação

  • aumento na complexidade de gerenciamento

Como podemos melhorar esse fluxo?

  • fleet (~2015)

  • coreos

  • systemd

  • harbor

  • versionamento de dockerfiles

  • gerenciamento centralizado

Tudo indo muito bem :)

Só que não :-(

  • Problemas de escalabilidade

  • Acoplamento perigoso com o etcd

  • Instabilidade preocupante

  • Baixa confiabilidade

Novamente precisávamos repensar a plataforma

Análise das soluções existentes

  • AWS ECS
  • Docker Swarm
  • Mesos + Marathon (DC/OS)
  • Kubernetes

Mais detalhes sobre esse processo aqui: https://elo7.dev/orquestrando-containers/

Construindo uma plataforma do zero

  • Optamos por fazer a instalação do zero
  • Terraform para automação da infra
  • Uso massivo do cloud-init + systemd
  • vault para gerenciamento de certificados

Vault

  • Gerencia certificados usados por todos componentes
  • Auth-backend com o GitHub
  • little-bird para emitir certificados para usuários

Estendendo funcionalidades

  • kube2iam
  • external-dns
  • metrics-server
  • prometheus
  • nginx-ingress-controller
apiVersion: v1
kind: Pod
metadata:
  name: aws-cli
  labels:
    name: aws-cli
  annotations:
    iam.amazonaws.com/role: role-arn
spec:
  containers:
  - image: fstab/aws-cli
    command:
      - "/usr/local/bin/aws"
      - "s3"
      - "ls"
      - "some-bucket"
    name: aws-cli
apiVersion: "v1"
kind: "Service"
metadata:
  name: "my-service"
  labels:
    name: "my-service"
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-internal: "0.0.0.0/0"
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "some-aws-certificate-arn"
    external-dns.alpha.kubernetes.io/hostname: "my-service.elo7.dev"
  namespace: prod
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 8080
  selector:
    app: "my-app"

Recaptulando ferramentas

E o futuro?

  • Istio
  • ArgoCD
  • Helm
  • Let's encrypt para gerenciamento de certificados ssl para apps

Dúvidas?

Obrigado!

Construindo uma plataforma de Kubernetes pronta para produção

By Marcus Rios

Construindo uma plataforma de Kubernetes pronta para produção

  • 577