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

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..

Pablo Fredrikson

November 18, 2017
Tweet

More Decks by Pablo Fredrikson

Other Decks in Technology

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. 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
  20. 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
  21. 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
  22. 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
  23. 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