SlideShare una empresa de Scribd logo
1 de 47
Descargar para leer sin conexión
Docker und Kubernetes
Patterns & Anti-Patterns
Josef Adersberger ( @adersberger, #cloudnativenerd)
Safe Harbor Statement
• Selbst identifizierte und recherchierte Patterns - 

teilweise noch nicht geläufig
• Haben sich in realen Projekten als wertvoll erwiesen
• Auswahl, kein Anspruch aufVollständigkeit
• Kein Pattern-Formalismus
HYPERSCALE
RESILIENT
OPEX SAVINGS
SPEED
CLOUD NATIVE APPLICATIONS
PACKAGED AND
DISTRIBUTED AS CONTAINERS
DYNAMICALLY
EXECUTED IN THE CLOUD
BUILD AND COMPOSED
AS MICROSERVICES
Lasst uns 

Cloud Native
Anwendungen 

bauen!
WIE ?????
… so dass es mir bei der
Entwicklung und in
Produktion nicht auf die
Nase fällt.
CLOUD NATIVE HELL
Modus: Jugend forscht
https://www.weltmaschine.de/physik/geschichte_des_universums
2013 2015
Jugend forscht Patterns und Anti-Patterns
docker run -it -v /var/run/docker.sock:/var/run/docker.sock qaware/devbox
Dings
Bums
*
*
Abstraktionsgrad
Sweetspot für Docker/k8s Patterns/Antipatterns
Abstraktion stabil genug
Konkrete Beispiele möglich
Abstraktionsgrad
(1) CONTAINER-LEVEL
(II) PLATTFORM-LEVEL
(III) DELIVERY-LEVEL
(1) CONTAINER-LEVEL
(II) PLATTFORM-LEVEL
(III) DELIVERY-LEVEL
OPS COMPONENT
DESIGN
Design Components
• Complexity unit
• Data integrity unit
• Cohesive feature unit
• Decoupled unit
PATTERN
• Planning unit
• Team assignment unit
• Development unit
• Integration unit
BUILD
Dev Components
+
RUN
Ops Components
• Release unit
• Deployment unit
• Runtime unit
• Scaling unit
+
Container = Verpackung für Ops Components
Standard-Schnittstellen für Standard-Betriebsprozeduren
Einfach zu transportierende, schnell zu startende und mit
wenig Overhead ausführbare Software-Einheiten
Container
Prozess

(pid 1)
Well-behaved Process
reagiert auf SIGTERM [1] oder 

definiert ein STOPSIGNAL [2] für einen

würdevollen Abgang
gibt sinnvolle Exit Codes zurück [3]:

0 = OK, 1 = allgemeiner Fehler, …
schreibt Log-Ausgaben auf 

STDOUT/STDERR [4], damit sie per 

Docker Log Driver verschifft werden 

können
Vordergrund-Prozess, kein 

Daemon- oder Hintergrund-Prozess

CMD ["nginx", "-g", "daemon off;"]
[1] https://medium.com/@gchudnov/trapping-signals-in-docker-
containers-7a57fdda7d86
[2] https://docs.docker.com/engine/reference/builder/#stopsignal
[3] http://tldp.org/LDP/abs/html/exitcodes.html
[4] https://success.docker.com/article/Docker_Reference_Architecture-
_Docker_Logging_Design_and_Best_Practices
[5] http://label-schema.org/rc1
[6] https://alexei-led.github.io/post/docker_testing
Container Interface
EXPOSE von allen 

von außen zugänglichen Ports

EXPOSE 80 443
Alle Umgebungsvariablen,

die von außen gesetzt werden können

per ENV definieren und möglichst mit

sinnvollem Default-Wert besetzen

ENV NGINX_VERSION 1.9.9
Dockerfile als Interface Definition
Kommentare und LABEL [5]
ENV, EXPOSE und VOLUME

(möglichst im Block und ganz am Schluss)
ENTRYPOINT für Prozessstart und 

CMD für Default-Argumente

ENTRYPOINT ["/entrypoint.sh"] 

CMD ["--db", "localhost","--user", “root”]
Standard-Entrypoints 

(z.B. docker run my-container /usr/bin/test)
run: Container produktiv laufen lassen (default)
run-dev: im Dev-Modus laufen mit z.B.Verbose Log
test:Testfälle im Container durchlaufen lassen
HEALTHCHECK: einen Healthcheck durchführen
debug: eine passende interaktive Shell öffnen
help: einen Hilfe zurVerwendung anzeigen
BEISPIEL: LABELS
http://label-schema.org/rc1
https://microbadger.com/images/microscaling/microscaling
CONTAINER INITIALIZER PATTERN
Container
Initializer

(pid 1)
Prozess
Prozess-
management

(Exit, SIG,
Zombies)
Log-
Umleitung
(syslog, files)
Config-
Dateien
schreiben
Cron
Warten auf
TCP/HTTP
Endpunkt
Chaperone

(veraltet)
x x x x
Dockerize x x x
Tini 

(in Docker >
1.13 enthalten)
x
dumb-init x
pid1 x
TrivialRC x
phusion
baseimage
x x x
… oder eigenes Shell-Skript oder Go-Programm (aber Achtung: Prozess stets mit exec starten!)
IMAGE LAYER ARCHITECTURE PATTERN
Layer 2
Layer 4
Layer 3
My Image
Layer 1
FROM debian:jessie
ENV NGINX_VERSION 1.12.2-1~jessie
RUN apt-get update && 
apt-get install -y ca-certificates && 

nginx=${NGINX_VERSION} && 
rm -rf /var/lib/apt/lists/*
RUN ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
Layer 5
jede Instruktion im Dockerfile erzeugt einen
neuen Layer (manche einen mit 0 Bytes)
Base Image
Scratch
Niemals latest Tag nutzen!
Layer 2
Layer 4
Layer 3
My Image
Layer 1
Layer 5
Änderung
FROM debian:jessie
ENV NGINX_VERSION 1.12.2-1~jessie
RUN apt-get update && 
apt-get install -y ca-certificates && 

wget nginx=${NGINX_VERSION} && 
rm -rf /var/lib/apt/lists/*
RUN ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
Cache wird invalidiert [1]:
Muss neu gebaut und
transportiert werden!
[1] mehr zu Docker Caching: https://www.ctl.io/developers/blog/post/caching-docker-images
Layer 2
Layer 4
Layer 3
My Image
Layer 1
Layer 5
Änderungs- und
Transporteinheit
klein
geringer Impact
von Änderungen
Layer 2
Layer 4
Layer 3
My Image
Layer 1
Layer 5
Base Image
volatil
stabil
klein
groß
klein:Alpine-*, Baseimage-
Docker, Busybox, Scratch
• Minimale Docker Images mit Java 9: https://blog.dekstroza.io/building-minimal-docker-containers-with-java-9
• Security Checks von Docker Images: Clair & docker-bench-security & dockscan
1. Abhängigkeiten
2. Applikation
3. Konfiguration
4. Metadaten / Schnittstelle
IMAGE SHRINKING 101
• Unnötige Layer vermeiden
• RUN Chaining: 

RUN apk add --update wget git && rm -rf /var/cache/apk/*
• Alle Layer verschmelzen zu einem (nur bei Basis-Images empfehlenswert): 

docker export + docker import

• Platzschonende Installation von Paketen

RUN apt-get update && apt-get install -y —no-install-recommends apache2 wget && apt-get
clean && rm -rf /var/lib/apt/lists/*
IMAGE METAMORPHOSIS ANTIPATTERN
DEV INT PROD
myimage-dev myimage-int myimage-prod
myimage
DEV.config INT.config PROD.config
STATEFUL CONTAINER ANTIPATTERN
mycontainer
Prozess
Container
FileSystem
• Zustand im Hauptspeicher:
User-Session
• Zustand auf Platte: Logs,
Anwendungsdaten
• Container sind flüchtig:
Zustand kann verloren
gehen
• Das Container FS ist
langsam
mycontainer
VOLUME In-Memory 

DB/Grid 

(z.B. redis, Ignite, Hazelcast)
Für Log-Dateien:
RUN ln -sf /proc/1/fd/1 /var/log/test.log
Prozess
CONTAINER UNITTESTING PATTERN
nginx-container-test.rb
describe package('nginx') do
it { should be_installed }
end
describe port(80) do
it { should be_listening }
end
https://www.inspec.io
Alternativen: goss+dgoss, ServerSpec, Bats, Testinfra
(1) CONTAINER-LEVEL
(II) PLATTFORM-LEVEL
(III) DELIVERY-LEVEL
Kubernetes Patterns, Bilgin Ibryam und Roland Huß, https://leanpub.com/k8spatterns
ENTERPRISE POD ANTIPATTERN
Pod
Web

Server
Data-
base
App

Server
• verletzt das Single

Responsibility Prinzip
• Scheduling schwierig 

durch hohe Anforderungen
• unzureichende Isolation 

(Netzwerk,Volumes, IPC,

Hostname, PID)
MQ

Broker
STRUCTURAL CONTAINER PATTERNS
• Scheduling (Quartz)
• Failbot
Pod
Application Container
Pattern Container
Other Container
“Design patterns for container-based distributed systems”. Brendan Burns, David Oppenheimer. 2016
Sidecar (Sidekick): Enhance container behaviour
Ambassador: Proxy communication
• TLS tunnel (Stunnel, ghosttunnel, istio)
• Circuit Breaking (linkerd, istio)
• Request monitoring (linkerd, istio)
Adapter: Provide standardized interface
• Configuration (ConfigMaps & Secrets to files)
• Log extraction / re-formatting / shipping (fluentd)
EXTERNALIZED CONFIGURATION
apiVersion: v1
kind: ConfigMap
metadata: 
  name: april-aos-runtime-config
data: 
  april-aos.properties: |       
    com.foo.iap.april.jwt.secret=some-secret      
    osmc.username=april   
    osmc.url=https://www.magic.works
    ...
  april-feature-togglz.properties: |         
    WRITE_TEXT5_TO_SOFAK_INVOICES=false
    ...
  log4j2.xml: |   
    <?xml version="1.0" encoding="UTF-8"?>   
    <Configuration monitorInterval="60">
      <Appenders> ... </Appenders>
      <Loggers> ... </Loggers>
    </Configuration>
spec:     
  containers:     
    - name: april-aos-runtime
      image: 'april-aos-runtime:1.5.0'
      imagePullPolicy: Always       
      ports:       
      - containerPort: 8080      
     
      volumeMounts:       
      - mountPath: /april/cfg         
        name: april-aos-runtime-config-vol     
 
  volumes:     
  - name: april-aos-runtime-config-vol          
    configMap:         
      name: april-aos-runtime-config
PATTERN
Umgebungsspezifische Konfiguration: ConfigMap ENV
Dynamische Konfiguration: ConfigMap Files
Statische Konfiguration: Config Files im Container
PACKAGE MANAGEMENT PATTERN
• kubectl, kubectl, kubectl, …
• Konfiguration?
• Endpunkte?
https://helm.sh
• Chart suchen auf https://hub.kubeapps.com
• Doku dort lesen (README.md)
• Konfigurationsparameter lesen: 

helm inspect stable/spark
• Chart starten mit überschriebener Konfiguration:

helm install --name my-release 

-f values.yaml stable/spark
SERVICE MESH PATTERN
Pod Pod
Pod
• Sichere Kommunikation (2-Way-SSL,Token Relay)
• Resilienz (Circuit Breaker)
• Policy Enforcement
• Diagnostizierbarkeit (Traces, Logs, Metriken)
• A/BTesting, Canary Releases
• Fault Injection, LatencyTesting
• LocationTransparency
Pod Pod
Pod
Proxy
Proxy
Proxy
Mesh Control Plane
• ohne Anpassung der Anwendungen!
• zentral gesteuert!
DIAGNOSABILITYTRIANGLE PATTERN
Metrics
Events / LogsTraces
Diagnosability
Triangle
DIAGNOSABILITYTRIANGLE
Metrics (RED = rate, errors, duration)
Events / LogsDistributed Traces
Diagnosability
Triangle
OPERATORS
(Betriebsroboter)
[1] https://coreos.com/operators
[2] https://kubernetes.io/docs/concepts/api-extension/custom-resources
[3] https://github.com/giantswarm/operatorkit
[4] https://github.com/sapcc/kubernetes-operators
[5] https://www.youtube.com/watch?v=cj5uk1uje_Y
Zustandsbehaftete 

Infrastruktur

(z.B. Datenbanken)
• Cluster Join / Leave
• Failover auslösen
• Fehlerzustände erkennen
• Migration von Daten
Standard-

Betriebsprozeduren
für Anwendungen
• Zertifikate einspielen
• Neue Konfiguration einspielen
• Komplexe Rollout-Szenarien
• Alerting
…
(1) CONTAINER-LEVEL
(II) PLATTFORM-LEVEL
(III) DELIVERY-LEVEL
DEV ORCHESTRATION PATTERN
• schnelle Roundtrips
• geringe Komplexität
• lokales Troubleshooting 
Bei einzelnen lokalen Prozessen, die in ein existierendes Remote-
Cluster gehängt werden sollen: https://www.telepresence.io
kompose
K8s and OpenShift
Deployment YAML
Dockerfile +
docker-compose.yml
Local Development Cloud Deployment
PROMOTION PATTERN
MicroservicePipelines
Stage n Stage n+1
Promotion
Degradation
QUELLEN
• Generell
• Container Patterns: https://l0rd.github.io/containerspatterns/#1
• Docker
• DockerFile Best Practices: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#use-a-dockerignore-file
• DockerTools: https://github.com/veggiemonk/awesome-docker
• OpenShift General Docker Guidelines: https://docs.openshift.com/enterprise/3.0/creating_images/guidelines.html
• Common Docker Mistakes: https://runnable.com/blog/9-common-dockerfile-mistakes
• Kubernetes
• Kubernetes Patterns: https://vimeo.com/233785743
• Kubernetes Best Practices: https://www.youtube.com/watch?v=BznjDNxp4Hs
• Continuous Delivery
• Continuous Delivery Patterns: https://continuousdelivery.com/implementing/patterns/
https://www.heise.de/developer/know-how-1033.html
42 http://www.qaware.de/news/java-magazin-cloud-native-universum
43
#Cloudkoffer
#Kubepad
QAware, Booth 618 (OG)
#CloudNativeNerd
https://www.qaware.de
https://slideshare.net/qaware
https://github.com/qaware
&
@adersberger
Design-Prinzipien Cloud-nativer Anwendungen
• Design for Distribution: Container, Microservices, API-driven
• Design for Performance: Responsive, concurrent, high utilization
• Design for Automation: Automate dev and ops tasks
• Design for Resiliency: Fault-tolerant and resilient
• Design for Elasticity: Dynamisch skalierbar und reaktiv.
• Design for Security: User context, application context and secret logistics.
• Design for Delivery: Kurze Roundtrips und automatisierte Provisionierung.
• Design for Diagnosability: Cluster-weite Logs, Metriken und Traces.
• Design for Autonomy: Die sich selbst betreibende Software.
System
Subsystem
Komponenten
Services
Monolith
Macroservices
Microservices
Nanoservices
Good starting point
Dev Components Ops Components
Decomposition Trade-Offs
+ Independent releases, deployments, teams
+ Short roundtrips
+ Runtime isolation (crash, slow-down)
+ More flexible to scale
+ Higher resources utilisation
- Distribution debt
- Increased infrastructure complexity
- Increased troubleshooting complexity
- Increased integration complexity
- Higher resource overhead (potentially)

Más contenido relacionado

La actualidad más candente

Open Patterns for Day 2 Ops [Gluecon 2017]
Open Patterns for Day 2 Ops [Gluecon 2017]Open Patterns for Day 2 Ops [Gluecon 2017]
Open Patterns for Day 2 Ops [Gluecon 2017]rhirschfeld
 
Der Status Quo des Chaos Engineerings
Der Status Quo des Chaos EngineeringsDer Status Quo des Chaos Engineerings
Der Status Quo des Chaos EngineeringsQAware GmbH
 
Continuous Delivery für Infrastrukturdienste in Container-Umgebungen
Continuous Delivery für Infrastrukturdienste in Container-UmgebungenContinuous Delivery für Infrastrukturdienste in Container-Umgebungen
Continuous Delivery für Infrastrukturdienste in Container-UmgebungenNicholas Dille
 
Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Josef Adersberger
 
In-Memory Computing mit Apache Ignite und Kubernetes
In-Memory Computing mit Apache Ignite und KubernetesIn-Memory Computing mit Apache Ignite und Kubernetes
In-Memory Computing mit Apache Ignite und KubernetesQAware GmbH
 
Ausrollen von Multi-Tier-Applikationen mit Docker
Ausrollen von Multi-Tier-Applikationen mit DockerAusrollen von Multi-Tier-Applikationen mit Docker
Ausrollen von Multi-Tier-Applikationen mit DockerB1 Systems GmbH
 
Leveraging the Power of Solr with Spark
Leveraging the Power of Solr with SparkLeveraging the Power of Solr with Spark
Leveraging the Power of Solr with SparkQAware GmbH
 
Per Anhalter zu Cloud-nativen API Gateways
Per Anhalter zu Cloud-nativen API GatewaysPer Anhalter zu Cloud-nativen API Gateways
Per Anhalter zu Cloud-nativen API GatewaysQAware GmbH
 
Steinzeit war gestern! Wege der Cloud-nativen Evolution.
Steinzeit war gestern! Wege der Cloud-nativen Evolution.Steinzeit war gestern! Wege der Cloud-nativen Evolution.
Steinzeit war gestern! Wege der Cloud-nativen Evolution.QAware GmbH
 
OWASP German Day 2016 - Sicher in die Cloud mit Angular 2 und Spring Boot
OWASP German Day 2016 - Sicher in die Cloud mit Angular 2 und Spring BootOWASP German Day 2016 - Sicher in die Cloud mit Angular 2 und Spring Boot
OWASP German Day 2016 - Sicher in die Cloud mit Angular 2 und Spring BootAndreas Falk
 
Dataservices - Data Processing mit Microservices
Dataservices - Data Processing mit MicroservicesDataservices - Data Processing mit Microservices
Dataservices - Data Processing mit MicroservicesQAware GmbH
 
Tipps und Tricks im Umgang mit Docker
Tipps und Tricks im Umgang mit DockerTipps und Tricks im Umgang mit Docker
Tipps und Tricks im Umgang mit DockerNicholas Dille
 
Private Cloud mit Ceph und OpenStack
Private Cloud mit Ceph und OpenStackPrivate Cloud mit Ceph und OpenStack
Private Cloud mit Ceph und OpenStackDaniel Schneller
 
Technische Gründe für schlechte Entwicklungsperformance
Technische Gründe für schlechte EntwicklungsperformanceTechnische Gründe für schlechte Entwicklungsperformance
Technische Gründe für schlechte EntwicklungsperformanceOPEN KNOWLEDGE GmbH
 
Helm – The Kubernetes Package Manager
Helm – The Kubernetes Package ManagerHelm – The Kubernetes Package Manager
Helm – The Kubernetes Package Managerinovex GmbH
 
Kaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes seinKaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes seinStephan Kaps
 

La actualidad más candente (20)

Open Patterns for Day 2 Ops [Gluecon 2017]
Open Patterns for Day 2 Ops [Gluecon 2017]Open Patterns for Day 2 Ops [Gluecon 2017]
Open Patterns for Day 2 Ops [Gluecon 2017]
 
Der Status Quo des Chaos Engineerings
Der Status Quo des Chaos EngineeringsDer Status Quo des Chaos Engineerings
Der Status Quo des Chaos Engineerings
 
Continuous Delivery für Infrastrukturdienste in Container-Umgebungen
Continuous Delivery für Infrastrukturdienste in Container-UmgebungenContinuous Delivery für Infrastrukturdienste in Container-Umgebungen
Continuous Delivery für Infrastrukturdienste in Container-Umgebungen
 
Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?
 
Dockerize It - Mit apex in die amazon cloud
Dockerize It - Mit apex in die amazon cloudDockerize It - Mit apex in die amazon cloud
Dockerize It - Mit apex in die amazon cloud
 
In-Memory Computing mit Apache Ignite und Kubernetes
In-Memory Computing mit Apache Ignite und KubernetesIn-Memory Computing mit Apache Ignite und Kubernetes
In-Memory Computing mit Apache Ignite und Kubernetes
 
Nginx
NginxNginx
Nginx
 
Ausrollen von Multi-Tier-Applikationen mit Docker
Ausrollen von Multi-Tier-Applikationen mit DockerAusrollen von Multi-Tier-Applikationen mit Docker
Ausrollen von Multi-Tier-Applikationen mit Docker
 
Leveraging the Power of Solr with Spark
Leveraging the Power of Solr with SparkLeveraging the Power of Solr with Spark
Leveraging the Power of Solr with Spark
 
Per Anhalter zu Cloud-nativen API Gateways
Per Anhalter zu Cloud-nativen API GatewaysPer Anhalter zu Cloud-nativen API Gateways
Per Anhalter zu Cloud-nativen API Gateways
 
Steinzeit war gestern! Wege der Cloud-nativen Evolution.
Steinzeit war gestern! Wege der Cloud-nativen Evolution.Steinzeit war gestern! Wege der Cloud-nativen Evolution.
Steinzeit war gestern! Wege der Cloud-nativen Evolution.
 
OWASP German Day 2016 - Sicher in die Cloud mit Angular 2 und Spring Boot
OWASP German Day 2016 - Sicher in die Cloud mit Angular 2 und Spring BootOWASP German Day 2016 - Sicher in die Cloud mit Angular 2 und Spring Boot
OWASP German Day 2016 - Sicher in die Cloud mit Angular 2 und Spring Boot
 
Dataservices - Data Processing mit Microservices
Dataservices - Data Processing mit MicroservicesDataservices - Data Processing mit Microservices
Dataservices - Data Processing mit Microservices
 
Tipps und Tricks im Umgang mit Docker
Tipps und Tricks im Umgang mit DockerTipps und Tricks im Umgang mit Docker
Tipps und Tricks im Umgang mit Docker
 
Private Cloud mit Ceph und OpenStack
Private Cloud mit Ceph und OpenStackPrivate Cloud mit Ceph und OpenStack
Private Cloud mit Ceph und OpenStack
 
Einführung in Docker
Einführung in DockerEinführung in Docker
Einführung in Docker
 
Technische Gründe für schlechte Entwicklungsperformance
Technische Gründe für schlechte EntwicklungsperformanceTechnische Gründe für schlechte Entwicklungsperformance
Technische Gründe für schlechte Entwicklungsperformance
 
Was ist Docker ?
Was ist Docker ?Was ist Docker ?
Was ist Docker ?
 
Helm – The Kubernetes Package Manager
Helm – The Kubernetes Package ManagerHelm – The Kubernetes Package Manager
Helm – The Kubernetes Package Manager
 
Kaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes seinKaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes sein
 

Similar a Docker und Kubernetes Patterns & Anti-Patterns

Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdfDockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdfSyahri Ramadhan
 
Docker for Windows / Windows Container
Docker for Windows / Windows ContainerDocker for Windows / Windows Container
Docker for Windows / Windows ContainerThomas Wilhelm Wiefel
 
Boost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with DockerBoost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with DockerSteven Grzbielok
 
Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17remigius-stalder
 
In den sicheren Hafen jax2020
In den sicheren Hafen jax2020In den sicheren Hafen jax2020
In den sicheren Hafen jax2020Stephan Kaps
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 
docker.io - Secure And Portable Containers Made Easy
docker.io - Secure And Portable Containers Made Easydocker.io - Secure And Portable Containers Made Easy
docker.io - Secure And Portable Containers Made Easyinovex GmbH
 
Vagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenVagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenOPITZ CONSULTING Deutschland
 
docker.io @ CentOS 7 - Secure And Portable Containers Made Easy
docker.io @ CentOS 7 - Secure And Portable Containers Made Easydocker.io @ CentOS 7 - Secure And Portable Containers Made Easy
docker.io @ CentOS 7 - Secure And Portable Containers Made Easyinovex GmbH
 
Hendrik Jungnitsch: Software verpacken mit Docker
Hendrik Jungnitsch: Software verpacken mit DockerHendrik Jungnitsch: Software verpacken mit Docker
Hendrik Jungnitsch: Software verpacken mit Dockergedoplan
 
Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!OPEN KNOWLEDGE GmbH
 
Was gibt es Neues im Docker-Universum
Was gibt es Neues im Docker-UniversumWas gibt es Neues im Docker-Universum
Was gibt es Neues im Docker-UniversumNicholas Dille
 
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)Containerized End-2-End-Testing - Software-QS-Tag (deutsch)
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)Tobias Schneck
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesGregor Biswanger
 
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...inovex GmbH
 
WebLogic im Docker Container
WebLogic im Docker ContainerWebLogic im Docker Container
WebLogic im Docker ContainerAndreas Koop
 
Containerized End-2-End Testing - JUG Saxony Day
Containerized End-2-End Testing - JUG Saxony DayContainerized End-2-End Testing - JUG Saxony Day
Containerized End-2-End Testing - JUG Saxony DayTobias Schneck
 

Similar a Docker und Kubernetes Patterns & Anti-Patterns (20)

Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdfDockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
 
Docker for Windows / Windows Container
Docker for Windows / Windows ContainerDocker for Windows / Windows Container
Docker for Windows / Windows Container
 
Boost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with DockerBoost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with Docker
 
Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17
 
In den sicheren Hafen jax2020
In den sicheren Hafen jax2020In den sicheren Hafen jax2020
In den sicheren Hafen jax2020
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
docker.io - Secure And Portable Containers Made Easy
docker.io - Secure And Portable Containers Made Easydocker.io - Secure And Portable Containers Made Easy
docker.io - Secure And Portable Containers Made Easy
 
Vagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenVagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und Architekten
 
docker.io @ CentOS 7 - Secure And Portable Containers Made Easy
docker.io @ CentOS 7 - Secure And Portable Containers Made Easydocker.io @ CentOS 7 - Secure And Portable Containers Made Easy
docker.io @ CentOS 7 - Secure And Portable Containers Made Easy
 
Hendrik Jungnitsch: Software verpacken mit Docker
Hendrik Jungnitsch: Software verpacken mit DockerHendrik Jungnitsch: Software verpacken mit Docker
Hendrik Jungnitsch: Software verpacken mit Docker
 
Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!
 
Was gibt es Neues im Docker-Universum
Was gibt es Neues im Docker-UniversumWas gibt es Neues im Docker-Universum
Was gibt es Neues im Docker-Universum
 
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)Containerized End-2-End-Testing - Software-QS-Tag (deutsch)
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
FLOW3-Workshop F3X12
FLOW3-Workshop F3X12FLOW3-Workshop F3X12
FLOW3-Workshop F3X12
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
 
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
 
WebLogic im Docker Container
WebLogic im Docker ContainerWebLogic im Docker Container
WebLogic im Docker Container
 
Containerized End-2-End Testing - JUG Saxony Day
Containerized End-2-End Testing - JUG Saxony DayContainerized End-2-End Testing - JUG Saxony Day
Containerized End-2-End Testing - JUG Saxony Day
 
WebLogic im Docker Container
WebLogic im Docker ContainerWebLogic im Docker Container
WebLogic im Docker Container
 

Más de Josef Adersberger

Into the cloud, you better fly by sight
Into the cloud, you better fly by sightInto the cloud, you better fly by sight
Into the cloud, you better fly by sightJosef Adersberger
 
Serverless containers … with source-to-image
Serverless containers  … with source-to-imageServerless containers  … with source-to-image
Serverless containers … with source-to-imageJosef Adersberger
 
The need for speed – transforming insurance into a cloud-native industry
The need for speed – transforming insurance into a cloud-native industryThe need for speed – transforming insurance into a cloud-native industry
The need for speed – transforming insurance into a cloud-native industryJosef Adersberger
 
The good, the bad, and the ugly of migrating hundreds of legacy applications ...
The good, the bad, and the ugly of migrating hundreds of legacy applications ...The good, the bad, and the ugly of migrating hundreds of legacy applications ...
The good, the bad, and the ugly of migrating hundreds of legacy applications ...Josef Adersberger
 
Patterns and Pains of Migrating Legacy Applications to Kubernetes
Patterns and Pains of Migrating Legacy Applications to KubernetesPatterns and Pains of Migrating Legacy Applications to Kubernetes
Patterns and Pains of Migrating Legacy Applications to KubernetesJosef Adersberger
 
Istio By Example (extended version)
Istio By Example (extended version)Istio By Example (extended version)
Istio By Example (extended version)Josef Adersberger
 
The Good, the Bad and the Ugly of Migrating Hundreds of Legacy Applications ...
 The Good, the Bad and the Ugly of Migrating Hundreds of Legacy Applications ... The Good, the Bad and the Ugly of Migrating Hundreds of Legacy Applications ...
The Good, the Bad and the Ugly of Migrating Hundreds of Legacy Applications ...Josef Adersberger
 
Dataservices - Processing Big Data The Microservice Way
Dataservices - Processing Big Data The Microservice WayDataservices - Processing Big Data The Microservice Way
Dataservices - Processing Big Data The Microservice WayJosef Adersberger
 
Time Series Processing with Solr and Spark
Time Series Processing with Solr and SparkTime Series Processing with Solr and Spark
Time Series Processing with Solr and SparkJosef Adersberger
 
Time Series Processing with Apache Spark
Time Series Processing with Apache SparkTime Series Processing with Apache Spark
Time Series Processing with Apache SparkJosef Adersberger
 
Clickstream Analysis with Spark
Clickstream Analysis with Spark Clickstream Analysis with Spark
Clickstream Analysis with Spark Josef Adersberger
 
Software-Sanierung: Wie man kranke Systeme wieder gesund macht.
Software-Sanierung: Wie man kranke Systeme wieder gesund macht.Software-Sanierung: Wie man kranke Systeme wieder gesund macht.
Software-Sanierung: Wie man kranke Systeme wieder gesund macht.Josef Adersberger
 

Más de Josef Adersberger (14)

Into the cloud, you better fly by sight
Into the cloud, you better fly by sightInto the cloud, you better fly by sight
Into the cloud, you better fly by sight
 
Serverless containers … with source-to-image
Serverless containers  … with source-to-imageServerless containers  … with source-to-image
Serverless containers … with source-to-image
 
The need for speed – transforming insurance into a cloud-native industry
The need for speed – transforming insurance into a cloud-native industryThe need for speed – transforming insurance into a cloud-native industry
The need for speed – transforming insurance into a cloud-native industry
 
The good, the bad, and the ugly of migrating hundreds of legacy applications ...
The good, the bad, and the ugly of migrating hundreds of legacy applications ...The good, the bad, and the ugly of migrating hundreds of legacy applications ...
The good, the bad, and the ugly of migrating hundreds of legacy applications ...
 
Patterns and Pains of Migrating Legacy Applications to Kubernetes
Patterns and Pains of Migrating Legacy Applications to KubernetesPatterns and Pains of Migrating Legacy Applications to Kubernetes
Patterns and Pains of Migrating Legacy Applications to Kubernetes
 
Istio By Example (extended version)
Istio By Example (extended version)Istio By Example (extended version)
Istio By Example (extended version)
 
The Good, the Bad and the Ugly of Migrating Hundreds of Legacy Applications ...
 The Good, the Bad and the Ugly of Migrating Hundreds of Legacy Applications ... The Good, the Bad and the Ugly of Migrating Hundreds of Legacy Applications ...
The Good, the Bad and the Ugly of Migrating Hundreds of Legacy Applications ...
 
Dataservices - Processing Big Data The Microservice Way
Dataservices - Processing Big Data The Microservice WayDataservices - Processing Big Data The Microservice Way
Dataservices - Processing Big Data The Microservice Way
 
Time Series Processing with Solr and Spark
Time Series Processing with Solr and SparkTime Series Processing with Solr and Spark
Time Series Processing with Solr and Spark
 
JEE on DC/OS
JEE on DC/OSJEE on DC/OS
JEE on DC/OS
 
Time Series Processing with Apache Spark
Time Series Processing with Apache SparkTime Series Processing with Apache Spark
Time Series Processing with Apache Spark
 
Big Data Landscape 2016
Big Data Landscape 2016Big Data Landscape 2016
Big Data Landscape 2016
 
Clickstream Analysis with Spark
Clickstream Analysis with Spark Clickstream Analysis with Spark
Clickstream Analysis with Spark
 
Software-Sanierung: Wie man kranke Systeme wieder gesund macht.
Software-Sanierung: Wie man kranke Systeme wieder gesund macht.Software-Sanierung: Wie man kranke Systeme wieder gesund macht.
Software-Sanierung: Wie man kranke Systeme wieder gesund macht.
 

Docker und Kubernetes Patterns & Anti-Patterns

  • 1. Docker und Kubernetes Patterns & Anti-Patterns Josef Adersberger ( @adersberger, #cloudnativenerd)
  • 2. Safe Harbor Statement • Selbst identifizierte und recherchierte Patterns - 
 teilweise noch nicht geläufig • Haben sich in realen Projekten als wertvoll erwiesen • Auswahl, kein Anspruch aufVollständigkeit • Kein Pattern-Formalismus
  • 4. CLOUD NATIVE APPLICATIONS PACKAGED AND DISTRIBUTED AS CONTAINERS DYNAMICALLY EXECUTED IN THE CLOUD BUILD AND COMPOSED AS MICROSERVICES
  • 5. Lasst uns 
 Cloud Native Anwendungen 
 bauen!
  • 6. WIE ????? … so dass es mir bei der Entwicklung und in Produktion nicht auf die Nase fällt.
  • 10. docker run -it -v /var/run/docker.sock:/var/run/docker.sock qaware/devbox Dings Bums * * Abstraktionsgrad Sweetspot für Docker/k8s Patterns/Antipatterns Abstraktion stabil genug Konkrete Beispiele möglich
  • 13. OPS COMPONENT DESIGN Design Components • Complexity unit • Data integrity unit • Cohesive feature unit • Decoupled unit PATTERN • Planning unit • Team assignment unit • Development unit • Integration unit BUILD Dev Components + RUN Ops Components • Release unit • Deployment unit • Runtime unit • Scaling unit +
  • 14. Container = Verpackung für Ops Components Standard-Schnittstellen für Standard-Betriebsprozeduren Einfach zu transportierende, schnell zu startende und mit wenig Overhead ausführbare Software-Einheiten
  • 15. Container Prozess
 (pid 1) Well-behaved Process reagiert auf SIGTERM [1] oder 
 definiert ein STOPSIGNAL [2] für einen
 würdevollen Abgang gibt sinnvolle Exit Codes zurück [3]:
 0 = OK, 1 = allgemeiner Fehler, … schreibt Log-Ausgaben auf 
 STDOUT/STDERR [4], damit sie per 
 Docker Log Driver verschifft werden 
 können Vordergrund-Prozess, kein 
 Daemon- oder Hintergrund-Prozess
 CMD ["nginx", "-g", "daemon off;"] [1] https://medium.com/@gchudnov/trapping-signals-in-docker- containers-7a57fdda7d86 [2] https://docs.docker.com/engine/reference/builder/#stopsignal [3] http://tldp.org/LDP/abs/html/exitcodes.html [4] https://success.docker.com/article/Docker_Reference_Architecture- _Docker_Logging_Design_and_Best_Practices [5] http://label-schema.org/rc1 [6] https://alexei-led.github.io/post/docker_testing Container Interface EXPOSE von allen 
 von außen zugänglichen Ports
 EXPOSE 80 443 Alle Umgebungsvariablen,
 die von außen gesetzt werden können
 per ENV definieren und möglichst mit
 sinnvollem Default-Wert besetzen
 ENV NGINX_VERSION 1.9.9 Dockerfile als Interface Definition Kommentare und LABEL [5] ENV, EXPOSE und VOLUME
 (möglichst im Block und ganz am Schluss) ENTRYPOINT für Prozessstart und 
 CMD für Default-Argumente
 ENTRYPOINT ["/entrypoint.sh"] 
 CMD ["--db", "localhost","--user", “root”] Standard-Entrypoints 
 (z.B. docker run my-container /usr/bin/test) run: Container produktiv laufen lassen (default) run-dev: im Dev-Modus laufen mit z.B.Verbose Log test:Testfälle im Container durchlaufen lassen HEALTHCHECK: einen Healthcheck durchführen debug: eine passende interaktive Shell öffnen help: einen Hilfe zurVerwendung anzeigen
  • 17. CONTAINER INITIALIZER PATTERN Container Initializer
 (pid 1) Prozess Prozess- management
 (Exit, SIG, Zombies) Log- Umleitung (syslog, files) Config- Dateien schreiben Cron Warten auf TCP/HTTP Endpunkt Chaperone
 (veraltet) x x x x Dockerize x x x Tini 
 (in Docker > 1.13 enthalten) x dumb-init x pid1 x TrivialRC x phusion baseimage x x x … oder eigenes Shell-Skript oder Go-Programm (aber Achtung: Prozess stets mit exec starten!)
  • 18. IMAGE LAYER ARCHITECTURE PATTERN Layer 2 Layer 4 Layer 3 My Image Layer 1 FROM debian:jessie ENV NGINX_VERSION 1.12.2-1~jessie RUN apt-get update && apt-get install -y ca-certificates && 
 nginx=${NGINX_VERSION} && rm -rf /var/lib/apt/lists/* RUN ln -sf /dev/stderr /var/log/nginx/error.log EXPOSE 80 443 CMD ["nginx", "-g", "daemon off;"] Layer 5 jede Instruktion im Dockerfile erzeugt einen neuen Layer (manche einen mit 0 Bytes) Base Image Scratch Niemals latest Tag nutzen!
  • 19. Layer 2 Layer 4 Layer 3 My Image Layer 1 Layer 5 Änderung FROM debian:jessie ENV NGINX_VERSION 1.12.2-1~jessie RUN apt-get update && apt-get install -y ca-certificates && 
 wget nginx=${NGINX_VERSION} && rm -rf /var/lib/apt/lists/* RUN ln -sf /dev/stderr /var/log/nginx/error.log EXPOSE 80 443 CMD ["nginx", "-g", "daemon off;"] Cache wird invalidiert [1]: Muss neu gebaut und transportiert werden! [1] mehr zu Docker Caching: https://www.ctl.io/developers/blog/post/caching-docker-images
  • 20. Layer 2 Layer 4 Layer 3 My Image Layer 1 Layer 5 Änderungs- und Transporteinheit klein geringer Impact von Änderungen
  • 21. Layer 2 Layer 4 Layer 3 My Image Layer 1 Layer 5 Base Image volatil stabil klein groß klein:Alpine-*, Baseimage- Docker, Busybox, Scratch • Minimale Docker Images mit Java 9: https://blog.dekstroza.io/building-minimal-docker-containers-with-java-9 • Security Checks von Docker Images: Clair & docker-bench-security & dockscan 1. Abhängigkeiten 2. Applikation 3. Konfiguration 4. Metadaten / Schnittstelle
  • 22. IMAGE SHRINKING 101 • Unnötige Layer vermeiden • RUN Chaining: 
 RUN apk add --update wget git && rm -rf /var/cache/apk/* • Alle Layer verschmelzen zu einem (nur bei Basis-Images empfehlenswert): 
 docker export + docker import
 • Platzschonende Installation von Paketen
 RUN apt-get update && apt-get install -y —no-install-recommends apache2 wget && apt-get clean && rm -rf /var/lib/apt/lists/*
  • 23. IMAGE METAMORPHOSIS ANTIPATTERN DEV INT PROD myimage-dev myimage-int myimage-prod myimage DEV.config INT.config PROD.config
  • 24. STATEFUL CONTAINER ANTIPATTERN mycontainer Prozess Container FileSystem • Zustand im Hauptspeicher: User-Session • Zustand auf Platte: Logs, Anwendungsdaten • Container sind flüchtig: Zustand kann verloren gehen • Das Container FS ist langsam mycontainer VOLUME In-Memory 
 DB/Grid 
 (z.B. redis, Ignite, Hazelcast) Für Log-Dateien: RUN ln -sf /proc/1/fd/1 /var/log/test.log Prozess
  • 25. CONTAINER UNITTESTING PATTERN nginx-container-test.rb describe package('nginx') do it { should be_installed } end describe port(80) do it { should be_listening } end https://www.inspec.io Alternativen: goss+dgoss, ServerSpec, Bats, Testinfra
  • 27. Kubernetes Patterns, Bilgin Ibryam und Roland Huß, https://leanpub.com/k8spatterns
  • 28. ENTERPRISE POD ANTIPATTERN Pod Web
 Server Data- base App
 Server • verletzt das Single
 Responsibility Prinzip • Scheduling schwierig 
 durch hohe Anforderungen • unzureichende Isolation 
 (Netzwerk,Volumes, IPC,
 Hostname, PID) MQ
 Broker
  • 29. STRUCTURAL CONTAINER PATTERNS • Scheduling (Quartz) • Failbot Pod Application Container Pattern Container Other Container “Design patterns for container-based distributed systems”. Brendan Burns, David Oppenheimer. 2016 Sidecar (Sidekick): Enhance container behaviour Ambassador: Proxy communication • TLS tunnel (Stunnel, ghosttunnel, istio) • Circuit Breaking (linkerd, istio) • Request monitoring (linkerd, istio) Adapter: Provide standardized interface • Configuration (ConfigMaps & Secrets to files) • Log extraction / re-formatting / shipping (fluentd)
  • 30. EXTERNALIZED CONFIGURATION apiVersion: v1 kind: ConfigMap metadata:    name: april-aos-runtime-config data:    april-aos.properties: |            com.foo.iap.april.jwt.secret=some-secret           osmc.username=april        osmc.url=https://www.magic.works     ...   april-feature-togglz.properties: |              WRITE_TEXT5_TO_SOFAK_INVOICES=false     ...   log4j2.xml: |        <?xml version="1.0" encoding="UTF-8"?>        <Configuration monitorInterval="60">       <Appenders> ... </Appenders>       <Loggers> ... </Loggers>     </Configuration> spec:        containers:          - name: april-aos-runtime       image: 'april-aos-runtime:1.5.0'       imagePullPolicy: Always              ports:              - containerPort: 8080                   volumeMounts:              - mountPath: /april/cfg                  name: april-aos-runtime-config-vol          volumes:        - name: april-aos-runtime-config-vol               configMap:                name: april-aos-runtime-config PATTERN Umgebungsspezifische Konfiguration: ConfigMap ENV Dynamische Konfiguration: ConfigMap Files Statische Konfiguration: Config Files im Container
  • 31. PACKAGE MANAGEMENT PATTERN • kubectl, kubectl, kubectl, … • Konfiguration? • Endpunkte? https://helm.sh • Chart suchen auf https://hub.kubeapps.com • Doku dort lesen (README.md) • Konfigurationsparameter lesen: 
 helm inspect stable/spark • Chart starten mit überschriebener Konfiguration:
 helm install --name my-release 
 -f values.yaml stable/spark
  • 32. SERVICE MESH PATTERN Pod Pod Pod • Sichere Kommunikation (2-Way-SSL,Token Relay) • Resilienz (Circuit Breaker) • Policy Enforcement • Diagnostizierbarkeit (Traces, Logs, Metriken) • A/BTesting, Canary Releases • Fault Injection, LatencyTesting • LocationTransparency Pod Pod Pod Proxy Proxy Proxy Mesh Control Plane • ohne Anpassung der Anwendungen! • zentral gesteuert!
  • 33. DIAGNOSABILITYTRIANGLE PATTERN Metrics Events / LogsTraces Diagnosability Triangle
  • 34. DIAGNOSABILITYTRIANGLE Metrics (RED = rate, errors, duration) Events / LogsDistributed Traces Diagnosability Triangle
  • 35. OPERATORS (Betriebsroboter) [1] https://coreos.com/operators [2] https://kubernetes.io/docs/concepts/api-extension/custom-resources [3] https://github.com/giantswarm/operatorkit [4] https://github.com/sapcc/kubernetes-operators [5] https://www.youtube.com/watch?v=cj5uk1uje_Y Zustandsbehaftete 
 Infrastruktur
 (z.B. Datenbanken) • Cluster Join / Leave • Failover auslösen • Fehlerzustände erkennen • Migration von Daten Standard-
 Betriebsprozeduren für Anwendungen • Zertifikate einspielen • Neue Konfiguration einspielen • Komplexe Rollout-Szenarien • Alerting …
  • 37. DEV ORCHESTRATION PATTERN • schnelle Roundtrips • geringe Komplexität • lokales Troubleshooting  Bei einzelnen lokalen Prozessen, die in ein existierendes Remote- Cluster gehängt werden sollen: https://www.telepresence.io kompose K8s and OpenShift Deployment YAML Dockerfile + docker-compose.yml Local Development Cloud Deployment
  • 38. PROMOTION PATTERN MicroservicePipelines Stage n Stage n+1 Promotion Degradation
  • 39.
  • 40. QUELLEN • Generell • Container Patterns: https://l0rd.github.io/containerspatterns/#1 • Docker • DockerFile Best Practices: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#use-a-dockerignore-file • DockerTools: https://github.com/veggiemonk/awesome-docker • OpenShift General Docker Guidelines: https://docs.openshift.com/enterprise/3.0/creating_images/guidelines.html • Common Docker Mistakes: https://runnable.com/blog/9-common-dockerfile-mistakes • Kubernetes • Kubernetes Patterns: https://vimeo.com/233785743 • Kubernetes Best Practices: https://www.youtube.com/watch?v=BznjDNxp4Hs • Continuous Delivery • Continuous Delivery Patterns: https://continuousdelivery.com/implementing/patterns/
  • 43. 43
  • 46. Design-Prinzipien Cloud-nativer Anwendungen • Design for Distribution: Container, Microservices, API-driven • Design for Performance: Responsive, concurrent, high utilization • Design for Automation: Automate dev and ops tasks • Design for Resiliency: Fault-tolerant and resilient • Design for Elasticity: Dynamisch skalierbar und reaktiv. • Design for Security: User context, application context and secret logistics. • Design for Delivery: Kurze Roundtrips und automatisierte Provisionierung. • Design for Diagnosability: Cluster-weite Logs, Metriken und Traces. • Design for Autonomy: Die sich selbst betreibende Software.
  • 47. System Subsystem Komponenten Services Monolith Macroservices Microservices Nanoservices Good starting point Dev Components Ops Components Decomposition Trade-Offs + Independent releases, deployments, teams + Short roundtrips + Runtime isolation (crash, slow-down) + More flexible to scale + Higher resources utilisation - Distribution debt - Increased infrastructure complexity - Increased troubleshooting complexity - Increased integration complexity - Higher resource overhead (potentially)