Slide 1

Slide 1 text

Kubernetes 101 and Fun | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 1

Slide 2

Slide 2 text

About me Mario-Leander Reimer Chief Technologist, QAware GmbH [email protected] twitter://@LeanderReimer http://github.com/lreimer http://speakerdeck.com/lreimer http://www.qaware.de | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 2

Slide 3

Slide 3 text

Code and article series are here ... 4 https://github.com/qaware/cloud-native-zwitscher/ 4 http://www.qaware.de/fileadmin/userupload/QAware-Cloud-Native- Artikelserie-JavaMagazin-1.pdf 4 http://www.qaware.de/fileadmin/userupload/QAware-Cloud-Native- Artikelserie-JavaMagazin-2.pdf 4 http://www.qaware.de/fileadmin/userupload/QAware-Cloud-Native- Artikelserie-JavaMagazin-3.pdf 4 http://www.qaware.de/fileadmin/userupload/QAware-Cloud-Native- Artikelserie-JavaMagazin-4.pdf | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 3

Slide 4

Slide 4 text

| ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 4

Slide 5

Slide 5 text

| ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 5

Slide 6

Slide 6 text

Design principles for Cloud Native Applications 4 Design for Performance: responsive; concurrency; efficiency. 4 Design for Automation: automate dev tasks & ops tasks. 4 Design for Resiliency: fault-tolerant; self-healing. 4 Design for Elasticity: dynamically scale; be reactive. 4 Design for Delivery: short roundtrips; automated delivery. 4 Design for Diagnosability: cluster-wide logs, traces, metrics. 4 The Twelve-Factor App Principles (https://12factor.net) | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 6

Slide 7

Slide 7 text

Cloud Native Stack required! | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 7

Slide 8

Slide 8 text

| ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 8

Slide 9

Slide 9 text

Cloud Native Stack using Kubernetes. | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 9

Slide 10

Slide 10 text

Kubernetes 101 | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 10

Slide 11

Slide 11 text

Local or Cloud setup of Kubernetes echo "- Use Vagrant for local K8s setup" export KUBERNETES_PROVIDER=vagrant export NUM_NODES=1 echo "- The default provider is GCE" export KUBERNETES_PROVIDER=gce export KUBE_GCE_ZONE=europe-west1-d export NUM_NODES=4 echo "- Another possible provider is AWS" export KUBERNETES_PROVIDER=aws export KUBE_AWS_ZONE=eu-central-1a export NODE_SIZE=t2.small curl -sS https://get.k8s.io | bash | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 11

Slide 12

Slide 12 text

Overview of Kubernetes Architecture | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 12

Slide 13

Slide 13 text

Main Kubernetes concepts 4 Services are an abstraction for a logical set of Pods. 4 Pods are the smallest deployable units of computing. 4 Deployments provide declarative updates for Pods and RCs. 4 Replica Sets ensure specified number of Pods are running. 4 Labels are key/value pairs attached to objects used for identification. | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 13

Slide 14

Slide 14 text

Deployment definition as YAML apiVersion: extensions/v1beta1 kind: Deployment metadata: name: hello-world spec: replicas: 1 template: metadata: labels: tier: web spec: containers: - name: hello-world image: "nginx" ports: - containerPort: 80 | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 14

Slide 15

Slide 15 text

Service definition as YAML apiVersion: v1 kind: Service metadata: name: hello-world labels: tier: web spec: # use NodePort here to be able to access the port on each node # use LoadBalancer for external load-balanced IP if supported type: NodePort ports: - port: 80 selector: tier: web | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 15

Slide 16

Slide 16 text

Hello World with Kubernetes $ kubectl cluster-info $ kubectl get nodes $ kubectl run hello-world --image=nginx --replicas=1 --port=80 $ kubectl expose deployment hello-world $ kubectl get deployments,services,pods $ kubectl describe pod [NAME] $ kubectl delete deployment hello-world $ kubectl create -f nginx.yml | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 16

Slide 17

Slide 17 text

Demo time. | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 17

Slide 18

Slide 18 text

The Cloud Native Zwitscher Showcase | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 18

Slide 19

Slide 19 text

| ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 19

Slide 20

Slide 20 text

The source code. | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 20

Slide 21

Slide 21 text

Dockerize it! 4 Know your base image!!! 4 The Alpine image is too thin for K8s + Spring. 4 You need Bash, DNS and Java. 4 Use a Server JRE. 4 Better build your own image. | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 21

Slide 22

Slide 22 text

Example Dockerfile for Zwitscher Service FROM qaware-oss-docker-registry.bintray.io/base/alpine-k8s-ibmjava8:8.0-3.10 MAINTAINER QAware GmbH RUN mkdir -p /opt/zwitscher-service COPY build/libs/zwitscher-service-1.1.0.jar /opt/zwitscher-service/zwitscher-service.jar COPY src/main/docker/zwitscher-service.* /opt/zwitscher-service/ RUN chmod 755 /opt/zwitscher-service/zwitscher-service.* EXPOSE 8080 CMD /opt/zwitscher-service/zwitscher-service.sh | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 22

Slide 23

Slide 23 text

Build, test, tag and push Docker images. ... $ docker built -t zwitscher-service:1.1.0 . $ docker-compose up ... $ docker tag zwitscher-service:1.1.0 \ qaware-oss-docker-registry.bintray.io/zwitscher/zwitscher-service ... $ docker push qaware-oss-docker-registry.bintray.io/zwitscher/zwitscher-service | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 23

Slide 24

Slide 24 text

Kubernetize: single or multi-container pods? | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 24

Slide 25

Slide 25 text

Possible variation using K8s infrastructure. | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 25

Slide 26

Slide 26 text

Define a deployment per container. apiVersion: extensions/v1beta1 kind: Deployment metadata: name: zwitscher-service spec: replicas: 1 template: metadata: labels: zwitscher: service spec: containers: - name: zwitscher-service image: "qaware-oss-docker-registry.bintray.io/zwitscher/zwitscher-service:1.1.0" ports: - containerPort: 8080 env: - name: EUREKA_HOST value: zwitscher-eureka | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 26

Slide 27

Slide 27 text

Define a service per deployment. apiVersion: v1 kind: Service metadata: name: zwitscher-service labels: zwitscher: service spec: # use NodePort here to be able to access the port on each node # use LoadBalancer for external load-balanced IP if supported type: NodePort ports: - port: 8080 selector: zwitscher: service | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 27

Slide 28

Slide 28 text

Be careful using resource constraints. resources: # required resources for a Pod to be started requests: memory: "128Mi" cpu: "250m" # the Pod will be restarted if limits are exceeded limits: memory: "192Mi" cpu: "500m" | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 28

Slide 29

Slide 29 text

Use liveness and readiness probes with Actuator. livenessProbe: httpGet: path: /admin/health port: 8080 initialDelaySeconds: 90 timeoutSeconds: 30 readinessProbe: httpGet: path: /admin/info port: 8080 timeoutSeconds: 30 | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 29

Slide 30

Slide 30 text

Use Retry mechanism for fail-fast behavior. # bootstrap.yml spring: application: name: zwitscher-service cloud: config: enabled: true failFast: true retry: initialInterval: 1500 maxInterval: 5000 maxAttempts: 5 multiplier: 1.5 discovery: enabled: true serviceId: ZWITSCHER-CONFIG | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 30

Slide 31

Slide 31 text

Deployment time! $ kubectl create -f zwitscher-eureka/k8s-zwitscher-eureka.yml $ kubectl create -f zwitscher-config/k8s-zwitscher-config.yml $ kubectl create -f zwitscher-service/k8s-zwitscher-service.yml $ kubectl create -f zwitscher-board/k8s-zwitscher-board.yml $ kubectl create -f zwitscher-edge/k8s-zwitscher-edge.yml $ kubectl create -f zwitscher-monitor/k8s-zwitscher-monitor.yml $ kubectl get deployments,pods,services $ kubectl delete -f k8s-zwitscher.yml | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 31

Slide 32

Slide 32 text

Let's have some fun! | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 32

Slide 33

Slide 33 text

The Kubepad in action 4 A MIDI controller 4 Display deployments and pods 4 Scale deployments 4 Written in fancy Kotlin 4 Also works for DC/OS 4 https://github.com/qaware/ kubepad | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 33

Slide 34

Slide 34 text

| ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 34

Slide 35

Slide 35 text

Q & A | ContainerCon Europe 2016 | created with ‘ and ☕ by @LeanderReimer 35