Slide 1

Slide 1 text

PYTHON, Kubernetes & FRIENDS @AGONZALEZRO

Slide 2

Slide 2 text

WHAT IS Kubernetes?

Slide 3

Slide 3 text

Framework for building distributed systems. (Kelsey's dixit)

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

OUR FIRST APP! $ kubectl run pygrunn \ --image=python:2.7 \ --command -- python -m SimpleHTTPServer

Slide 6

Slide 6 text

WHAT DO WE GET HERE?

Slide 7

Slide 7 text

A POD $ kubectl get pods NAME READY STATUS RESTARTS AGE pygrunn-1906403705-dckh7 1/1 Running 0 1m

Slide 8

Slide 8 text

A REPLICA SET $ kubectl get replicasets NAME DESIRED CURRENT AGE pygrunn-1552838933 1 1 11s

Slide 9

Slide 9 text

AND A DEPLOYMENT $ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE pygrunn 1 1 1 1 2m

Slide 10

Slide 10 text

SHOW IT TO THE WORLD $ kubectl expose deployment pygrunn \ --port=80 --target-port=8000 --type=LoadBalancer

Slide 11

Slide 11 text

LET'S USE THE WAITING TIME $ kubectl exec -it pygrunn-1906403705-dckh7 bash

Slide 12

Slide 12 text

HERE IT IS $ kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE pygrunn 10.3.255.124 130.211.52.23 80/TCP 57s

Slide 13

Slide 13 text

HN FRONT PAGE! $ kubectl scale deployment pygrunn --replicas=3

Slide 14

Slide 14 text

THE END (FOR NOW)

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

WHAT WE DID THERE? ▸ Pods ▸ Replica Set ▸ Service ▸ Deployment

Slide 17

Slide 17 text

A "REAL" DEPLOYMENT

Slide 18

Slide 18 text

MAIN.PY from flask import Flask, url_for app = Flask(__name__) @app.route('/') def index(): return ''.format( url_for('static', filename='grumpy.gif') ) if __name__ == '__main__': app.run(host='0.0.0.0')

Slide 19

Slide 19 text

DOCKERFILE FROM python:2.7.11-onbuild EXPOSE 5000 CMD ["uwsgi", "-http 5000", "-w main"]

Slide 20

Slide 20 text

$ docker build -t agonzalezro/pygrunn:grumpy . $ docker push agonzalezro/pygrunn

Slide 21

Slide 21 text

DEPLOYMENT.YAML (1/3) apiVersion: extensions/v1beta1 kind: Deployment metadata: name: pygrunn-deploy labels: name: pygrunn-deploy ...

Slide 22

Slide 22 text

DEPLOYMENT.YAML (2/3) ... spec: replicas: 3 selector: matchLabels: name: flask-app template: metadata: labels: name: flask-app ...

Slide 23

Slide 23 text

DEPLOYMENT.YAML (3/3) ... spec: containers: - name: app image: agonzalezro/pygrunn:grumpy ports: - containerPort: 5000 - name: nginx image: agonzalezro/pygrunn-nginx ports: - containerPort: 80 readinessProbe: httpGet: path: / port: 80

Slide 24

Slide 24 text

apiVersion: extensions/v1beta1 kind: Deployment metadata: name: pygrunn-deploy labels: name: pygrunn-deploy spec: replicas: 3 selector: matchLabels: name: flask-app template: metadata: labels: name: flask-app spec: containers: - name: app image: agonzalezro/pygrunn:happy ports: - containerPort: 5000 - name: nginx image: agonzalezro/pygrunn-nginx ports: - containerPort: 80 readinessProbe: httpGet: path: / port: 80

Slide 25

Slide 25 text

SERVICE.YAML apiVersion: v1 kind: Service metadata: name: flask-service spec: type: LoadBalancer ports: - port: 80 targetPort: 5000 selector: name: flask-app

Slide 26

Slide 26 text

$ kubectl create -f deployment.yaml -f service.yaml

Slide 27

Slide 27 text

$ sed -i "s/replicas: 3/replicas: 5/" deployment.yaml $ kubectl apply -f deployment.yaml

Slide 28

Slide 28 text

$ sed -i "s/grumpy/happy/" deployment.yaml $ kubectl apply -f deployment.yaml

Slide 29

Slide 29 text

HOMEWORK ▸ Add a nginx in top ▸ Add a DB ▸ Use a private registry

Slide 30

Slide 30 text

THE END (AGAIN)

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

Thanks! @AGONZALEZRO