Slide 1

Slide 1 text

Un año con Kubernetes en Producción Pablo Fredrikson - Lead SRE @ Invision @pablokbs un año y medio PYCONAR CBA 2017

Slide 2

Slide 2 text

Pablo Fredrikson @pablokbs ● Nerd ● 12 años con Linux / Open Source ● Lead SRE @ Invision ● 1º vez como speaker en una PyCon PYCONAR CBA 2017

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

Historia ● Docker local -> Que bien! ● Chef en Producción -> Que mal! ● Había que estandarizar PYCONAR CBA 2017

Slide 9

Slide 9 text

¿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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Env-API / Workflow PYCONAR CBA 2017 Platform teams

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Kubernetes es el servicio del equipo de SRE PYCONAR CBA 2017

Slide 26

Slide 26 text

¿Preguntas? @pablokbs @InvisionApp PYCONAR CBA 2017