The road to being a first-class Kubernetes application
Floris Bruynooghe
flub@devork.be
@flubdevork
Skip boilerplate
Simple architecture
apiVersion: extensions/v1beta
kind: ReplicaSet
metadata:
name: ...
spec:
replicas: 3
template:
spec:
containers:
- image: ...
args: ...
restartPolicy: Always
spec:
containers:
- image: ...
args:
- --loglevel=DEBUG
import logging
logging.info('Some message')
import sys, logbook
logbook.StreamHandler(sys.stdout).push_application()
log = logbook.Logger('main')
try:
raise Exception('oops')
except Exception:
log.exception('This is bad')
sys.exit(1)
import structlog
log = structlog.get_logger()
log = log.bind(user='flub')
log.info('msg.parsed', valid=True)
containers:
- name: spam
readinessProbe:
tcpSocket:
port: 1234
- name: ham
readinessProbe:
httpGet:
path: /healthz
port: 8080
containers:
- name: spam
readinessProbe:
...
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
- name: ham
livenessProbe:
httpGet:
path: /heathz
port: 8080
import signal
signal.signal(signal.SIGTERM,
lambda s, f: mainloop.signal_shutdown())
Prometheus
import prometheus_client as prom
reqs = prom.Counter('requests', 'Number of requests')
failed_reqs = prom.Counter('requests.failed', 'Number of failed requests')
prom.start_http_server(8000)
def handle(req):
reqs.inc()
with failed_reqs.count_exceptions():
...
flub@devork.be | @flubdevork