Un año y medio con Kubernetes en producción

Un año y medio con Kubernetes en producción

Charla que di en Pycon.AR 2017, en Córdoba, Argentina. Hablo sobre mi experiencia corriendo Kubernetes en producción por un año medio..

04280fd182525cdaee76572782ec34c0?s=128

Pablo Fredrikson

November 18, 2017
Tweet

Transcript

  1. Un año con Kubernetes en Producción Pablo Fredrikson - Lead

    SRE @ Invision @pablokbs un año y medio PYCONAR CBA 2017
  2. Pablo Fredrikson @pablokbs • Nerd • 12 años con Linux

    / Open Source • Lead SRE @ Invision • 1º vez como speaker en una PyCon PYCONAR CBA 2017
  3. 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 ◦ ~1600 instancias en AWS ◦ ~10000 containers en ~50 entornos ◦ ~100 deploys únicos por semana • Velocidad PYCONAR CBA 2017
  4. 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) PYCONAR CBA 2017
  5. Historia • Usábamos chef • Migramos el entorno local de

    Vagrant a Docker • Docker local -> Que bien! • Chef en Producción -> Que mal! • Había que estandarizar PYCONAR CBA 2017
  6. Que es Docker? FROM alpine:3.6 ENV PYTHON_VERSION 3.6.3 RUN set

    -ex \ && apk add --no-cache --virtual .fetch-deps \ gnupg \ libressl \ tar \ xz \ \ && wget -O python.tar.xz "https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-$PYTHON_VERSION.tar.xz" ... CMD ["python3"] PYCONAR CBA 2017
  7. Que es Docker? FROM python:3.4-slim RUN apt-get update && apt-get

    install -y \ gcc \ gettext \ mysql-client libmysqlclient-dev \ postgresql-client libpq-dev \ sqlite3 \ --no-install-recommends && rm -rf /var/lib/apt/lists/* ENV DJANGO_VERSION 1.10.4 RUN pip install mysqlclient psycopg2 django=="$DJANGO_VERSION" PYCONAR CBA 2017
  8. Historia • Docker local -> Que bien! • Chef en

    Producción -> Que mal! • Había que estandarizar PYCONAR CBA 2017
  9. ¿Qué es Kubernetes? “Kubernetes es casi todo lo que le

    falta a Docker para poder correr en Producción.” Pablo Fredrikson @ nerdear.la 2017 PYCONAR CBA 2017
  10. Kubernetes en 5 minutos PYCONAR CBA 2017 Servicios de cluster

    de Kubernetes API worker K worker K worker K deployment pod1: - container1 - container2 replicas: 3 pod2: - container3 replicas: 2 p1r1 p2r1 p1r2 p1r3 p2r2
  11. Kubernetes en 5 minutos PYCONAR CBA 2017 Servicios de cluster

    de Kubernetes API worker K worker K worker K deployment pod1: - container1 - container2 replicas: 3 pod2: - container3 replicas: 2 p1r1 p2r1 p1r2 p1r3 p2r2
  12. 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" PYCONAR CBA 2017
  13. Kubernetes no es perfecto • No maneja generación de manifiestos

    • No maneja variables de entorno • Los deploys están atados a los manifiestos PYCONAR CBA 2017
  14. 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/ PYCONAR CBA 2017
  15. 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/ PYCONAR CBA 2017
  16. Env-API / in-config.yaml default: NEW_RELIC_SERVICE_NAME: myservice-$${CLUSTER} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD}

    DEBUG: false testing: SERVER_TYPE: QA DEBUG: true staging: SERVER_TYPE: PREVIEW production: SERVER_TYPE: LIVE PYCONAR CBA 2017
  17. Env-API / S3 secrets s3://mysecrets/production/mycluster/myservicio/MYSQL_USER s3://mysecrets/production/mycluster/myservicio/MYSQL_PASSWORD s3://mysecrets/production/mycluster/myservicio/MYSQL_HOST s3://mysecrets/production/mycluster/myservicio/SQS_URL s3://mysecrets/production/mycluster/common/S3_BUCKET s3://mysecrets/production/common/REDIS_HOST

    s3://mysecrets/staging/mycluster/myservicio/MYSQL_USER s3://mysecrets/staging/mycluster/myservicio/MYSQL_PASSWORD s3://mysecrets/staging/mycluster/myservicio/MYSQL_HOST s3://mysecrets/staging/mycluster/myservicio/SQS_URL s3://mysecrets/staging/mycluster/common/S3_BUCKET s3://mysecrets/staging/common/REDIS_HOST PYCONAR CBA 2017
  18. 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}" } PYCONAR CBA 2017
  19. Env-API / Workflow PYCONAR CBA 2017 Platform teams

  20. 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/ PYCONAR CBA 2017
  21. 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! PYCONAR CBA 2017
  22. 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 PYCONAR CBA 2017
  23. 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 PYCONAR CBA 2017
  24. 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 PYCONAR CBA 2017
  25. Kubernetes es el servicio del equipo de SRE PYCONAR CBA

    2017
  26. ¿Preguntas? @pablokbs @InvisionApp PYCONAR CBA 2017