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

Un año con Kubernetes en Producción

Un año con Kubernetes en Producción

Charla que di en nerdear.la 2017, explicando nuestra experiencia usando Kubernetes en Producción por un año en mi trabajo (invisionapp.com) Buenos Aires, Argentina

Pablo Fredrikson

June 23, 2017
Tweet

More Decks by Pablo Fredrikson

Other Decks in Technology

Transcript

  1. Pablo Fredrikson @pablokbs • Nerd • 12 años con Linux

    / Open Source • Senior SRE @ Invision • 2º Año en Nerdear.la!
  2. Ingeniería en Invision • Startup 6 años de antigüedad •

    Hace 2 años ◦ ~20 personas en Ingeniería ◦ Teníamos ~5 servers windows, storage y DBs • Actualmente ◦ ~110 personas en Ingeniería ◦ ~1500 instancias en AWS ◦ ~7000 containers en ~30 entornos ◦ ~100 deploys únicos por semana • Velocidad
  3. Mini startups • Equipos de menos de 7-8 personas •

    Autónomos ◦ Deploys ◦ Código ◦ Herramientas ◦ Responsabilidades ◦ Configuraciones ◦ Formas de trabajo (Google Hangouts, Trello, JIRA, standups)
  4. Migrando a Docker / Kubernetes • Usábamos chef • Migramos

    el entorno local de Vagrant a Docker • Empezamos a probar Kubernetes
  5. ¿Qué es Kubernetes? “Kubernetes es todo lo que le falta

    a Docker para poder correr en Producción.” Juan Moyano @ nerdear.la 2016
  6. ¿Qué es Kubernetes? “Kubernetes es casi todo lo que le

    falta a Docker para poder correr en Producción.” Pablo Fredrikson @ nerdear.la 2017
  7. Manifiestos apiVersion: v1 kind: Pod metadata: name: envar-demo labels: purpose:

    demonstrate-envars spec: containers: - name: envar-demo-container image: gcr.io/google-samples/node-hello:1.0 env: - name: DEMO_GREETING value: "Hello from the environment"
  8. Kubernetes no es perfecto • No maneja generación de manifiestos

    • No maneja variables de entorno • Los deploys están atados a los manifiestos
  9. kit • Continuous deployment para Kubernetes • ¿Cómo funciona? ◦

    Desarrollador hace el push a github ◦ Dispara el build en Codeship ◦ Kit hace el push del release al repo de Kubernetes ◦ Se generan los manifiestos ◦ Se aplican los manifiestos (deploy) • ¡Es open source! https://invisionapp.github.io/kit/
  10. Plantillas de manifiestos (mustache) apiVersion: v1 kind: Pod metadata: name:

    envar-demo labels: purpose: demonstrate-envars spec: containers: - name: envar-demo-container image: {{{envar-demo.image}}} env: - name: DEMO_GREETING value: "Hello from the environment" https://mustache.github.io/
  11. Env-API / S3 secrets s3://mysecrets/production/nerdearla-cluster/myservicio/MYSQL_USER s3://mysecrets/production/nerdearla-cluster/myservicio/MYSQL_PASSWORD s3://mysecrets/production/nerdearla-cluster/myservicio/MYSQL_HOST s3://mysecrets/production/nerdearla-cluster/myservicio/SQS_URL s3://mysecrets/production/nerdearla-cluster/common/S3_BUCKET s3://mysecrets/production/common/REDIS_HOST

    s3://mysecrets/staging/nerdearla-cluster/myservicio/MYSQL_USER s3://mysecrets/staging/nerdearla-cluster/myservicio/MYSQL_PASSWORD s3://mysecrets/staging/nerdearla-cluster/myservicio/MYSQL_HOST s3://mysecrets/staging/nerdearla-cluster/myservicio/SQS_URL s3://mysecrets/staging/nerdearla-cluster/common/S3_BUCKET s3://mysecrets/staging/common/REDIS_HOST
  12. Env-API / Terraform resource "aws_sqs_queue" "my-sqs-queue" { name = "${var.cluster_name}-my-sqs-queue"

    } resource "aws_s3_bucket_object" "s3_sqs_perm_queue_url" { bucket = "${var.secrets_bucket}" key = "${var.environment}/${var.cluster_name}/common/SQS_URL" acl = "bucket-owner-full-control" content = "${aws_sqs_queue.my-sqs-queue.id}" }
  13. Plantillas de manifiestos (mustache) apiVersion: v1 kind: Pod metadata: name:

    envar-demo labels: purpose: demonstrate-envars spec: containers: - name: envar-demo-container image: {{{envar-demo.image}}} env: {{#envar-demo.env}} - name: {{{name}}} value: "{{{value}}}" {{/envar-demo.env}} https://mustache.github.io/
  14. Manifiesto generado usando kit y env-api apiVersion: v1 kind: Pod

    metadata: name: envar-demo labels: purpose: demonstrate-envars spec: containers: - name: envar-demo-container image: quay.io/invision/my-service:adssadads1234 env: - name: MYSQL_HOST value: mysql.invisionapp.local - name: MYSQL_USER value: myuser - name: MYSQL_PASSWORD value: !myp4ssw0rd!
  15. Single tenant ? Namespaces! • Generamos toda la infraestructura y

    todo lo necesario para levantar el stack completo en ~15 minutos: ◦ Crear manifiestos para namespaces ◦ Crear certificados SSL, third party services ◦ Crear todos los recursos de AWS (ELBs, ALBs, ASGs, buckets S3, RDS, DNS, SQS, SNS, Lambda, y mucho más) ◦ Generar los manifiestos con las imágenes y variables de entorno para todos los servicios (data, auth, etc) ◦ Bootstrap de la aplicación (~50 microservicios) ◦ Todo esto sin interacción de developers
  16. Usando Kubernetes en Producción • Reducimos costos de AWS en

    un 50% (principalmente ec2) • Incrementamos la velocidad de creación de entornos (de 1 o 2 días a 30 minutos) • Mayor consistencia (automatización - menos errores humanos) • Estabilidad - Dejás de manejar instancias o contenedores y manejás clusters • Rollbacks rápidos y seguros • Auto healing
  17. Pero … nadie dijo que iba a ser fácil •

    Problemas con DNS • Healthcheck -> default-http-backend • kit-destroyer • Nginx - Java affinity • Liveness probe - danger - no tiene rolling deploys • Networking • Es nuevo