SlideShare a Scribd company logo
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 1
Kubernetes
Architecture & Introduction
Dr. Stefan Schimanski, Sergiusz Urbaniak
hash tag #k8sber
follow @kubernetesBER
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 2
Engineers @ Mesosphere
Working on Kubernetes-on-Mesos
https://github.com/kubernetes/kubernetes/tree/master/contrib/mesos
Who are we?
Stefan
@the1stein
sttts@github
Sergiusz
@mieszkoman
s-urbaniak@github
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 3
The company behind:
● Apache Mesos (https://mesos.apache.org/)
A distributed systems kernel.
● Marathon (https://mesosphere.github.io/marathon/)
An Apache Mesos framework
for long-running applications.
● Chronos (http://mesos.github.io/chronos/)
A distributed cron replacement.
Who/What is Mesosphere?
DCOS
(https://mesosphere.com/)
A data center operating system.
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 4
- Archeology: before and without Kubernetes
- Deployment: kube-up, DCOS, GKE
- Core Architecture: the apiserver, the kubelet and the scheduler
- Compute Model: the pod, the service and the controller
No whitepaper talk. We dive deep!
Next 45 Minutes
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 5
Python based agent to deploy declarative pods using Docker.
How it all started
googlearchive / container-agent
...
Kubernetes:
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 6
[...] container group defined by the manifest to share:
● Network Namespaces
● Volumes
This creates a runtime environment where:
● Containers can connect to a service running in other containers of the same group
using localhost and a fixed port.
● Containers of the same group can't run services on the same ports.
● Containers of the same group can mount shared volumes defined in the manifest.
A Pod was described as a ...
googlearchive / container-agent
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 7
[...] container group defined by the manifest to share:
● Network Namespaces
● Volumes
This creates a runtime environment where:
● Containers can connect to a service running in other containers of the same group
using localhost and a fixed port.
● Containers of the same group can't run services on the same ports.
● Containers of the same group can mount shared volumes defined in the manifest.
A Pod was described as a ...
googlearchive / container-agent Still true with
Kubernetes
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 8
$ docker run -it --name mypod busybox sleep 9999999
$ docker run -it --ipc=container:mypod --net=container:mypod
-v /tmp/mypod:/tmp/mypod
-w /tmp/mypod ubuntu python3 -m http.server 80
$ docker run -it --ipc=container:mypod --net=container:mypod
-v /tmp/mypod:/tmp/mypod
sttts/busybox-curl /bin/sh
A Pod in Docker terms:
Back to the roots
“root”, “pause” or
“infrastructure” container
“webserver”
“busybox”, our worker
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 9
A Pod in Docker terms – visually
● Note: different OSes, resource constraints, restart policies
mypod
eth0: 192.168.66.6
lo: 127.0.0.1
ipc
net
/tmp/mypod
webserver:80
busybox
sleep
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 10
while true; do
curl -k 'https://mobile.twitter.com/search?q=%23kubernetes%20%23berlin&s=typd' 
> /tmp/mypod/index.html
sleep 10
done
A little Twitter Mirror Pod
mypod
eth0: 192.168.66.6
lo: 127.0.0.1
ipc
net
/tmp/mypod
webserver:80
busybox
sleep
http 192.168.66.6:80
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 11
$ git clone git@github.com:kubernetes/kubernetes.git
$ cd kubernetes
$ build/run.sh hack/build-go.sh && make
$ KUBERNETES_PROVIDER=mesos/docker cluster/kube-up.sh
$ alias kubectl=_output/local/bin/darwin/amd64/kubectl
$ kubectl get pods
Get a Kubernetes cluster: mesos/docker with kube-up
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 12
$ dcos config prepend package.sources 
https://github.com/mesosphere/multiverse/archive/version-1.x.zip
$ dcos package install kubernetes
$ dcos kubectl create -f nginx.yml
pods/nginx
$ dcos kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 1m
Package for
Mesosphere’s
DCOS
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 13
Google
CKontainer
Engine
● install the gcloud cli
● prepare your Google Cloud account with a project with
enabled GCE APIs, e.g. “kube-test-1154”
$ gcloud components install kubectl
$ gcloud container clusters create demo-cluster --num-nodes=2
$ gcloud config set container/cluster demo-cluster
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 1m
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 14
Getting Started Guides
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 15
$ git clone git@github.com:kubernetes/kubernetes.git
$ cd kubernetes
$ build/run.sh hack/build-go.sh && make
$ KUBERNETES_PROVIDER=mesos/docker cluster/kube-up.sh
$ alias kubectl=_output/local/bin/darwin/amd64/kubectl
$ kubectl get pods
Get a Kubernetes cluster: mesos/docker with kube-up
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 16
Kubernetes Core Architecture – the apiserver
apiserver
default namespace
kube-system namespace
kube-dns fluentdkube-ui
PodsPodsPods
PodsPodsServices
PodsPodsRCs
PodsPodsSecrets
PodsPodsVolumesPodsPodsJobs
...
...
...
etcd clu ster
store
state
● all the cluster state
● no logic, only storage and API
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 17
Kubernetes Core Architecture – the apiserver
apiserver
default namespace
kube-system namespace
kube-dns fluentdkube-ui
PodsPodsPods
PodsPodsServices
PodsPodsRCs
PodsPodsSecrets
PodsPodsVolumesPodsPodsJobs
...
...
...RESTAPI
kubectl
HTTP Kubernetes
cluster
etcd clu ster
store
state
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved.
node Anode A
18
Kubernetes Core Architecture – the components
kubectl
HTTP
apiserver
default namespace
kube-system namespace
kube-dns fluentdkube-ui
PodsPodsPods
PodsPodsServices
PodsPodsRCs
PodsPodsSecrets
PodsPodsVolumesPodsPodsJobs
...
...
...
watches
for new
pods
node A kubelet
Scheduler
assigns pods
to nodes
etcd clu ster
store
state
launches pods
with Docker or rkt
Controller
Manager
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 19
kubectl - interacting with a Kubernetes cluster
Usage:
kubectl [flags]
kubectl [command]
Available Commands:
get Display one or many resources
describe Show details of a specific resource or group of resources
create Create a resource by filename or stdin
replace Replace a resource by filename or stdin.
patch Update field(s) of a resource by stdin.
delete Delete resources by filenames, stdin, resources and names, or by resources and label selector.
edit Edit a resource on the server
apply Apply a configuration to a resource by filename or stdin
namespace SUPERSEDED: Set and view the current Kubernetes namespace
logs Print the logs for a container in a pod.
rolling-update Perform a rolling update of the given ReplicationController.
scale Set a new size for a Replication Controller.
attach Attach to a running container.
exec Execute a command in a container.
port-forward Forward one or more local ports to a pod.
proxy Run a proxy to the Kubernetes API server
run Run a particular image on the cluster.
stop Deprecated: Gracefully shut down a resource by name or filename.
expose Take a replication controller, service or pod and expose it as a new Kubernetes Service
autoscale Auto-scale a replication controller
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 20
Same Pod in Kubernetes
$ kubectl create -f mypod.yaml
pod "mypod" created
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: webserver
image: ubuntu
workingDir: /tmp/mypod
command: ["python3", "-m", "http.server", "80"]
volumeMounts:
- name: htdocs
mountPath: /tmp/mypod
- name: busybox
image: sttts/busybox-curl
tty: true
stdin: true
volumeMounts:
- name: htdocs
mountPath: /tmp/mypod
volumes:
- name: htdocs
hostPath:
path: /tmp/mypod
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 21
Documentation
Documentation landing page: http://kubernetes.io/v1.1
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 22
Documentation - Schema
JSON/YAML/REST schema: http://kubernetes.io/v1.1/docs/api-reference/v1/definitions.html
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 23
Examples – learn from them
Deployment examples: https://github.com/kubernetes/kubernetes/tree/master/examples
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 24
Browsing the API
Open https://192.168.65.65:6443/swagger-ui/
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 25
The source of truth: api/v1/types.go
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 26
On the wire (JSON only)
$ curl -k -u admin:admin 
https://192.168.65.39:6443/api/v1/namespaces/default/pods/mypod
{
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "mypod",
"namespace": "default",
"selfLink": "/api/v1/namespaces/default/pods/mypod",
"uid": "37d657dc-b47a-11e5-938a-0242c0a84127",
"resourceVersion": "5792",
"creationTimestamp": "2016-01-06T13:34:32Z",
"annotations": {
"k8s.mesosphere.io/bindingHost": "192.168.65.44",
"k8s.mesosphere.io/executorId": "cf3cd4adb282b475_k8sm-executor",
"k8s.mesosphere.io/offerId": "20160106-081826-641837248-5050-1-O3680",
"k8s.mesosphere.io/slaveId": "20160106-081826-641837248-5050-1-S1",
"k8s.mesosphere.io/taskId": "pod.380df08e-b47a-11e5-8201-0242c0a8412b"
}
},
"spec": {
"volumes": [
{
"name": "htdocs",
"hostPath": {
"path": "/tmp/mypod"
}
},
{
"name": "default-token-b3a3b",
"secret": {
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 27
● in metadata block of every API resource
● labels can be used to filter objects serverside (annotations can’t)
$ kubectl get nodes -l gen=2011
Labels & Annotations
"annotations": {
"k8s.mesosphere.io/bindingHost": "192.168.65.44",
"k8s.mesosphere.io/executorId": "k8sm-executor",
...
}
for tooling
"labels": {
"git": "cb52d79578b1379e32b7e6a119ed16232ef1b13b",
"env": "prod",
"sla": "super-premium",
"app": "webshop",
"tier": "frontend"
}
for
user/admin
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 28
Getting the Pod IP
$ kubectl get pod mypod -o yaml
…
hostIP: 192.168.65.68
phase: Running
podIP: 192.168.66.11
startTime: 2016-01-07T08:33:55Z
$ kubectl get pod mypod -o template --template='{{.status.podIP}}'
192.168.66.12
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 29
From Pod to Pod
consumer
192.168.66.42
busybox
mypod with IP
192.168.66.6
webserver:80
busybox
pause
pause
192.168.66.6:80
mypod2 with IP
192.168.66.8
webserver:80
busybox
pause
192.168.66.8:80
● cluster routable IPs
● native ports without conflicts
● no “pod” service discovery available
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 30
A Service
consumer
192.168.66.42
busybox
mypod with IP
192.168.66.6
webserver:80
busybox
pause
pause
10.10.10.7:80
mypod2 with IP
192.168.66.8
webserver:80
busybox
pause
10.10.10.7:80
● a service as a static API object
$ kubectl create -f service.yaml
● virtual, but static IP (usually 10.x.y.z)
● no service discovery necessary
Service“mypods”withvirtualIP10.10.10.7
endpoint for
mypod
endpoint for
mypod2
192.168.66.8:80
192.168.66.6:80
brilliant
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 31
Defining a Service
$ cat mypods-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mypods
spec:
ports:
- port: 80
selector:
name: mypod
$ kubectl create -f mypods-service.yaml
service "mypods" created
$ kubectl get services
NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGE
k8sm-scheduler 10.10.10.34 <none> 10251/TCP <none> 6h
kubernetes 10.10.10.1 <none> 443/TCP <none> 6h
mypods 10.10.10.32 <none> 80/TCP name=mypods 5m
● match pods with these labels
● a service without any pod is completely valid
● services exist on their own
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 32
A Service, available on each node
consumer
192.168.66.42
busybox
mypod with IP
192.168.66.6
webserver:80
busybox
pause
pause
10.10.10.7:80
mypod2 with IP
192.168.66.8
webserver:80
busybox
pause
10.10.10.7:80
Service“mypods”withvirtualIP10.10.10.7
endpoint for
mypod
endpoint for
mypod2
192.168.66.8:80
192.168.66.6:80
● Implemented by kube-proxy
○ in user-mode (simple proxy)
○ or using iptables
● on every node!
traffic from a pod is
intercepted on the host of the
pod, not the destination of the
connection.
!
node A
Note: In addition kube-proxy makes
services available for other hosts, e.
g. for internet clients
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 33
mypod with IP
192.168.66.6
webserver:80
busybox
pause
mypod2 with IP
192.168.66.8
webserver:80
busybox
pause
Service“mypods”withvirtualIP10.10.10.7
endpoint for
mypod
endpoint for
mypod2
192.168.66.8:80
192.168.66.6:80
● 1 endpoint for each matching pod of a service
● endpoint = pod-IP:port, e.g. 192.168.66.6:80
$ kubectl get endpoints kube-ui
NAME ENDPOINTS AGE
mypods 192.168.65.68:8001 2s
Service Endpoints
Special in Kuberentes-Mesos because it
runs without overlay network here. Otherwise, :80
would be visible here.
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 34
Behind the scenes – Linux iptables
$ iptables -t nat -n -L
...
Chain KUBE-PORTALS-CONTAINER (1 references)
target prot opt source destination
REDIRECT tcp -- 0.0.0.0/0 10.10.10.3 /* kube-system/kube-ui: */ tcp dpt:80 redir ports 45123
REDIRECT tcp -- 0.0.0.0/0 10.10.10.181 /* default/k8sm-scheduler: */ tcp dpt:10251 redir ports 59722
REDIRECT tcp -- 0.0.0.0/0 10.10.10.1 /* default/kubernetes: */ tcp dpt:443 redir ports 55836
REDIRECT udp -- 0.0.0.0/0 10.10.10.10 /* kube-system/kube-dns:dns */ udp dpt:53 redir ports 57016
REDIRECT tcp -- 0.0.0.0/0 10.10.10.10 /* kube-system/kube-dns:dns-tcp */ tcp dpt:53 redir ports 42340
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 35
● state consists of all API objects, stored on the API-Server
● core Kubernetes architecture principle:
logic is in control loops (“controllers”) which
● are state-less (can recover from failure)
● and decoupled (communication via API-Server)
State plus Control
read state
process
state
write state
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 36
A Control Loop to run Pods
INPUT:
REPLICAS: number of mypods that should be running
ALGORITHM
1. running := number of running pods with label name=mypod
2. If running > REPLICAS => delete some mypods
3. If REPLICAS > running => launch some mypods
4. Goto 1
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 37
REPLICAS = int(sys.argv[1])
master = os.getenv("KUBERNETES_MASTER", "http://localhost:8080")
kubeclient = toolkit.KubeHTTPClient(api_server=master, debug=False)
while True:
# count mypods
response = kubeclient.execute_operation(method="GET",
ops_path="/api/v1/namespaces/default/pods?labelSelector=name%3Dmypod")
mypods = response.json()['items']
running_mypods = len(mypods)
print "{} running".format(running_mypods)
...
Getting # of running mypods
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 38
if running_mypods > REPLICAS:
to_delete = running_mypods - REPLICAS
print " Too many are running. Deleting {} pods:".format(to_delete)
for pod in mypods[:to_delete]:
print " Deleting pod {}".format(pod['metadata']['name'])
kubeclient.delete_resource(pod['metadata']['selfLink'])
If running > REPLICAS => delete some mypods
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 39
elif REPLICAS > running_mypods:
to_launch = REPLICAS - running_mypods
for n in range(0, to_launch):
mypod_spec, _ = util.load_yaml(filename="mypod.yaml")
mypod_spec["metadata"]["name"] += "-" + shortuuid.uuid()[:4].lower()
print "Launching pod {}".format(mypod_spec["metadata"]["name"])
response = kubeclient.execute_operation(method='POST',
ops_path = "/api/v1/namespaces/default/pods",
payload = util.serialize_tojson(mypod_spec))
If REPLICAS > running => launch some mypods
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 40
apiVersion: v1
kind: ReplicationController
metadata:
name: mypod
spec:
replicas: 10
selector:
name: mypod
template:
metadata:
labels:
name: mypod
spec:
containers:
- name: webserver
image: ubuntu
...
$ kubectl create -f mypod-rc.yaml
$ kubectl scale --replicas=5 rc/mypod
Kubernetes Replication Controllers – “RCs”
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 41
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: mypod
spec:
selector:
name: mypod
template:
metadata:
labels:
name: mypod
spec:
nodeSelector:
env=dmz
containers:
- name: webserver
image: ubuntu
...
● DaemonSets run pods once per node
● MyCassandraController might run Cassandra instances
● MyGaleraController might run MySQL Galera instances
● MyHaproxyUpdateController might write haproxy.conf
● MyNodeUpdateController might do rolling security
updates on nodes or of containers
● MyBitcoinScheduler might schedule bitcoin pods for
spare resources
Other Controllers
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 42
Controllers, controllers everywhere ...
etcd apiserver
controller-manager
scheduler
node controller
endpoint controller
kube-proxy
kube-proxy
kube-proxy
kubelet
kubelet
kubelet
replication controller
daemonset controller
service controller
token controller
resource quota
controller
persistent volume
controller
service account
controller
...
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 43
Of course: we are hiring in Hamburg, Berlin & San Francisco!
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 44
Backup
#k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 45
$ kubectl get pods -l "name=mypod" -w --v=9
=> GET https://192.168.65.39:6443/api/v1/watch/namespaces/default/pods?
labelSelector=name%3Dmypod
{"type":"ADDED","object":{"kind":"Pod","apiVersion":"v1", ...}}
{"type":"MODIFIED","object":{"kind":"Pod","apiVersion":"v1", …}}
{"type":"DELETED","object":{"kind":"Pod","apiVersion":"v1",...}}
Watches

More Related Content

PDF
Hands-On Introduction to Kubernetes at LISA17
PDF
Kubernetes Basics
PDF
Kubernetes 101
PDF
Introduction to Kubernetes Workshop
PDF
Kubernetes
PPTX
Kubernetes Introduction
PDF
Kubernetes Networking
PDF
KubeVirt (Kubernetes and Cloud Native Toronto)
Hands-On Introduction to Kubernetes at LISA17
Kubernetes Basics
Kubernetes 101
Introduction to Kubernetes Workshop
Kubernetes
Kubernetes Introduction
Kubernetes Networking
KubeVirt (Kubernetes and Cloud Native Toronto)

What's hot (20)

PDF
Kubernetes - introduction
PDF
Best Practices with Azure Kubernetes Services
PPTX
Docker and kubernetes
PDF
Kubernetes Architecture | Understanding Kubernetes Components | Kubernetes Tu...
PDF
Kubernetes Introduction
PDF
Deploying your first application with Kubernetes
PPTX
Kubernetes Introduction
PPTX
A brief study on Kubernetes and its components
PPTX
Docker Ecosystem on Azure
PDF
PPTX
DevOps with Kubernetes
ODP
Kubernetes Architecture
PDF
Introduction of Kubernetes - Trang Nguyen
PDF
Kubernetes
PDF
WSO2Con US 2015 Kubernetes: a platform for automating deployment, scaling, an...
PDF
Introduction to kubernetes
PDF
(Draft) Kubernetes - A Comprehensive Overview
PPTX
Kubernetes PPT.pptx
PPTX
Introduction to helm
Kubernetes - introduction
Best Practices with Azure Kubernetes Services
Docker and kubernetes
Kubernetes Architecture | Understanding Kubernetes Components | Kubernetes Tu...
Kubernetes Introduction
Deploying your first application with Kubernetes
Kubernetes Introduction
A brief study on Kubernetes and its components
Docker Ecosystem on Azure
DevOps with Kubernetes
Kubernetes Architecture
Introduction of Kubernetes - Trang Nguyen
Kubernetes
WSO2Con US 2015 Kubernetes: a platform for automating deployment, scaling, an...
Introduction to kubernetes
(Draft) Kubernetes - A Comprehensive Overview
Kubernetes PPT.pptx
Introduction to helm
Ad

Viewers also liked (10)

PDF
Kubernetes architecture
PDF
SAP HANA Transformation: Cloud Advantage
PPTX
Virtustream presentation
PDF
MT125 Virtustream Enterprise Cloud: Purpose Built to Run Mission Critical App...
PDF
Scaling Docker with Kubernetes
PDF
Introduction to Kubernetes
PDF
Kubernetes Architecture and Introduction – Paris Kubernetes Meetup
PDF
kubernetes for beginners
PPTX
Introduction to Kubernetes
PDF
An Introduction to Kubernetes
Kubernetes architecture
SAP HANA Transformation: Cloud Advantage
Virtustream presentation
MT125 Virtustream Enterprise Cloud: Purpose Built to Run Mission Critical App...
Scaling Docker with Kubernetes
Introduction to Kubernetes
Kubernetes Architecture and Introduction – Paris Kubernetes Meetup
kubernetes for beginners
Introduction to Kubernetes
An Introduction to Kubernetes
Ad

Similar to Kubernetes Architecture and Introduction (20)

PDF
An Introduction to the Kubernetes API
PDF
Build Your Own CaaS (Container as a Service)
PDF
Kubernetes for the PHP developer
PDF
Kubernetes Kops - Automation Night
PDF
Kubernetes extensibility
PPTX
Spring Boot on Kubernetes/OpenShift
PDF
Kubernetes for Java Developers
PDF
Kubernetes - Sailing a Sea of Containers
PDF
From dev to prod: Kubernetes on AWS (short ver.)
PDF
Docker kubernetes fundamental(pod_service)_190307
PDF
Using Kubernetes for Continuous Integration and Continuous Delivery. Java2days
PDF
Using Kubernetes for Continuous Integration and Continuous Delivery
PPTX
Learn kubernetes in 90 minutes
PDF
Docker Dhahran November 2017 meetup
PDF
Azure kubernetes service (aks) part 3
PDF
KubeCon EU 2016: Leveraging ephemeral namespaces in a CI/CD pipeline
PDF
Kubernetes Cluster API - managing the infrastructure of multi clusters (k8s ...
PDF
Federated Kubernetes: As a Platform for Distributed Scientific Computing
PDF
Kubernetes meetup 102
PDF
Kubernetes for Java developers
An Introduction to the Kubernetes API
Build Your Own CaaS (Container as a Service)
Kubernetes for the PHP developer
Kubernetes Kops - Automation Night
Kubernetes extensibility
Spring Boot on Kubernetes/OpenShift
Kubernetes for Java Developers
Kubernetes - Sailing a Sea of Containers
From dev to prod: Kubernetes on AWS (short ver.)
Docker kubernetes fundamental(pod_service)_190307
Using Kubernetes for Continuous Integration and Continuous Delivery. Java2days
Using Kubernetes for Continuous Integration and Continuous Delivery
Learn kubernetes in 90 minutes
Docker Dhahran November 2017 meetup
Azure kubernetes service (aks) part 3
KubeCon EU 2016: Leveraging ephemeral namespaces in a CI/CD pipeline
Kubernetes Cluster API - managing the infrastructure of multi clusters (k8s ...
Federated Kubernetes: As a Platform for Distributed Scientific Computing
Kubernetes meetup 102
Kubernetes for Java developers

More from Stefan Schimanski (15)

PDF
Cutting the Kubernetes Monorepo in pieces
PDF
Kubernetes API code-base tour
PDF
Extending kubernetes with CustomResourceDefinitions
PDF
Extending Kubernetes – Admission webhooks
PDF
KubeCon EU 2018 – Sig API Machinery Deep Dive
PDF
Cutting the Kubernetes Monorepo in pieces – never learnt more about git
PDF
Git deep dive – chopping Kubernetes
PDF
Extending the Kube API
PDF
Meetup - Principles of the kube api and how to extend it
PDF
Extend and build on Kubernetes
PDF
Kubernetes API - deep dive into the kube-apiserver
PDF
Elastic etcd
PDF
Kubernetes on Top of Mesos on Top of DCOS
PDF
Cluster Networking with Docker
PDF
Beyond static configuration
Cutting the Kubernetes Monorepo in pieces
Kubernetes API code-base tour
Extending kubernetes with CustomResourceDefinitions
Extending Kubernetes – Admission webhooks
KubeCon EU 2018 – Sig API Machinery Deep Dive
Cutting the Kubernetes Monorepo in pieces – never learnt more about git
Git deep dive – chopping Kubernetes
Extending the Kube API
Meetup - Principles of the kube api and how to extend it
Extend and build on Kubernetes
Kubernetes API - deep dive into the kube-apiserver
Elastic etcd
Kubernetes on Top of Mesos on Top of DCOS
Cluster Networking with Docker
Beyond static configuration

Recently uploaded (20)

PPT
Project quality management in manufacturing
PPTX
Current and future trends in Computer Vision.pptx
PDF
TFEC-4-2020-Design-Guide-for-Timber-Roof-Trusses.pdf
PDF
Human-AI Collaboration: Balancing Agentic AI and Autonomy in Hybrid Systems
PDF
Unit I ESSENTIAL OF DIGITAL MARKETING.pdf
PDF
Automation-in-Manufacturing-Chapter-Introduction.pdf
PPTX
Safety Seminar civil to be ensured for safe working.
PDF
Mohammad Mahdi Farshadian CV - Prospective PhD Student 2026
PDF
PREDICTION OF DIABETES FROM ELECTRONIC HEALTH RECORDS
PPTX
OOP with Java - Java Introduction (Basics)
PPTX
web development for engineering and engineering
DOCX
ASol_English-Language-Literature-Set-1-27-02-2023-converted.docx
PPTX
bas. eng. economics group 4 presentation 1.pptx
PPTX
Infosys Presentation by1.Riyan Bagwan 2.Samadhan Naiknavare 3.Gaurav Shinde 4...
PDF
BMEC211 - INTRODUCTION TO MECHATRONICS-1.pdf
PDF
SM_6th-Sem__Cse_Internet-of-Things.pdf IOT
PDF
III.4.1.2_The_Space_Environment.p pdffdf
PDF
R24 SURVEYING LAB MANUAL for civil enggi
PPTX
Sustainable Sites - Green Building Construction
PDF
Evaluating the Democratization of the Turkish Armed Forces from a Normative P...
Project quality management in manufacturing
Current and future trends in Computer Vision.pptx
TFEC-4-2020-Design-Guide-for-Timber-Roof-Trusses.pdf
Human-AI Collaboration: Balancing Agentic AI and Autonomy in Hybrid Systems
Unit I ESSENTIAL OF DIGITAL MARKETING.pdf
Automation-in-Manufacturing-Chapter-Introduction.pdf
Safety Seminar civil to be ensured for safe working.
Mohammad Mahdi Farshadian CV - Prospective PhD Student 2026
PREDICTION OF DIABETES FROM ELECTRONIC HEALTH RECORDS
OOP with Java - Java Introduction (Basics)
web development for engineering and engineering
ASol_English-Language-Literature-Set-1-27-02-2023-converted.docx
bas. eng. economics group 4 presentation 1.pptx
Infosys Presentation by1.Riyan Bagwan 2.Samadhan Naiknavare 3.Gaurav Shinde 4...
BMEC211 - INTRODUCTION TO MECHATRONICS-1.pdf
SM_6th-Sem__Cse_Internet-of-Things.pdf IOT
III.4.1.2_The_Space_Environment.p pdffdf
R24 SURVEYING LAB MANUAL for civil enggi
Sustainable Sites - Green Building Construction
Evaluating the Democratization of the Turkish Armed Forces from a Normative P...

Kubernetes Architecture and Introduction

  • 1. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 1 Kubernetes Architecture & Introduction Dr. Stefan Schimanski, Sergiusz Urbaniak hash tag #k8sber follow @kubernetesBER
  • 2. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 2 Engineers @ Mesosphere Working on Kubernetes-on-Mesos https://github.com/kubernetes/kubernetes/tree/master/contrib/mesos Who are we? Stefan @the1stein sttts@github Sergiusz @mieszkoman s-urbaniak@github
  • 3. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 3 The company behind: ● Apache Mesos (https://mesos.apache.org/) A distributed systems kernel. ● Marathon (https://mesosphere.github.io/marathon/) An Apache Mesos framework for long-running applications. ● Chronos (http://mesos.github.io/chronos/) A distributed cron replacement. Who/What is Mesosphere? DCOS (https://mesosphere.com/) A data center operating system.
  • 4. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 4 - Archeology: before and without Kubernetes - Deployment: kube-up, DCOS, GKE - Core Architecture: the apiserver, the kubelet and the scheduler - Compute Model: the pod, the service and the controller No whitepaper talk. We dive deep! Next 45 Minutes
  • 5. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 5 Python based agent to deploy declarative pods using Docker. How it all started googlearchive / container-agent ... Kubernetes:
  • 6. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 6 [...] container group defined by the manifest to share: ● Network Namespaces ● Volumes This creates a runtime environment where: ● Containers can connect to a service running in other containers of the same group using localhost and a fixed port. ● Containers of the same group can't run services on the same ports. ● Containers of the same group can mount shared volumes defined in the manifest. A Pod was described as a ... googlearchive / container-agent
  • 7. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 7 [...] container group defined by the manifest to share: ● Network Namespaces ● Volumes This creates a runtime environment where: ● Containers can connect to a service running in other containers of the same group using localhost and a fixed port. ● Containers of the same group can't run services on the same ports. ● Containers of the same group can mount shared volumes defined in the manifest. A Pod was described as a ... googlearchive / container-agent Still true with Kubernetes
  • 8. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 8 $ docker run -it --name mypod busybox sleep 9999999 $ docker run -it --ipc=container:mypod --net=container:mypod -v /tmp/mypod:/tmp/mypod -w /tmp/mypod ubuntu python3 -m http.server 80 $ docker run -it --ipc=container:mypod --net=container:mypod -v /tmp/mypod:/tmp/mypod sttts/busybox-curl /bin/sh A Pod in Docker terms: Back to the roots “root”, “pause” or “infrastructure” container “webserver” “busybox”, our worker
  • 9. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 9 A Pod in Docker terms – visually ● Note: different OSes, resource constraints, restart policies mypod eth0: 192.168.66.6 lo: 127.0.0.1 ipc net /tmp/mypod webserver:80 busybox sleep
  • 10. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 10 while true; do curl -k 'https://mobile.twitter.com/search?q=%23kubernetes%20%23berlin&s=typd' > /tmp/mypod/index.html sleep 10 done A little Twitter Mirror Pod mypod eth0: 192.168.66.6 lo: 127.0.0.1 ipc net /tmp/mypod webserver:80 busybox sleep http 192.168.66.6:80
  • 11. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 11 $ git clone [email protected]:kubernetes/kubernetes.git $ cd kubernetes $ build/run.sh hack/build-go.sh && make $ KUBERNETES_PROVIDER=mesos/docker cluster/kube-up.sh $ alias kubectl=_output/local/bin/darwin/amd64/kubectl $ kubectl get pods Get a Kubernetes cluster: mesos/docker with kube-up
  • 12. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 12 $ dcos config prepend package.sources https://github.com/mesosphere/multiverse/archive/version-1.x.zip $ dcos package install kubernetes $ dcos kubectl create -f nginx.yml pods/nginx $ dcos kubectl get pods NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 1m Package for Mesosphere’s DCOS
  • 13. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 13 Google CKontainer Engine ● install the gcloud cli ● prepare your Google Cloud account with a project with enabled GCE APIs, e.g. “kube-test-1154” $ gcloud components install kubectl $ gcloud container clusters create demo-cluster --num-nodes=2 $ gcloud config set container/cluster demo-cluster $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 1m
  • 14. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 14 Getting Started Guides
  • 15. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 15 $ git clone [email protected]:kubernetes/kubernetes.git $ cd kubernetes $ build/run.sh hack/build-go.sh && make $ KUBERNETES_PROVIDER=mesos/docker cluster/kube-up.sh $ alias kubectl=_output/local/bin/darwin/amd64/kubectl $ kubectl get pods Get a Kubernetes cluster: mesos/docker with kube-up
  • 16. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 16 Kubernetes Core Architecture – the apiserver apiserver default namespace kube-system namespace kube-dns fluentdkube-ui PodsPodsPods PodsPodsServices PodsPodsRCs PodsPodsSecrets PodsPodsVolumesPodsPodsJobs ... ... ... etcd clu ster store state ● all the cluster state ● no logic, only storage and API
  • 17. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 17 Kubernetes Core Architecture – the apiserver apiserver default namespace kube-system namespace kube-dns fluentdkube-ui PodsPodsPods PodsPodsServices PodsPodsRCs PodsPodsSecrets PodsPodsVolumesPodsPodsJobs ... ... ...RESTAPI kubectl HTTP Kubernetes cluster etcd clu ster store state
  • 18. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. node Anode A 18 Kubernetes Core Architecture – the components kubectl HTTP apiserver default namespace kube-system namespace kube-dns fluentdkube-ui PodsPodsPods PodsPodsServices PodsPodsRCs PodsPodsSecrets PodsPodsVolumesPodsPodsJobs ... ... ... watches for new pods node A kubelet Scheduler assigns pods to nodes etcd clu ster store state launches pods with Docker or rkt Controller Manager
  • 19. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 19 kubectl - interacting with a Kubernetes cluster Usage: kubectl [flags] kubectl [command] Available Commands: get Display one or many resources describe Show details of a specific resource or group of resources create Create a resource by filename or stdin replace Replace a resource by filename or stdin. patch Update field(s) of a resource by stdin. delete Delete resources by filenames, stdin, resources and names, or by resources and label selector. edit Edit a resource on the server apply Apply a configuration to a resource by filename or stdin namespace SUPERSEDED: Set and view the current Kubernetes namespace logs Print the logs for a container in a pod. rolling-update Perform a rolling update of the given ReplicationController. scale Set a new size for a Replication Controller. attach Attach to a running container. exec Execute a command in a container. port-forward Forward one or more local ports to a pod. proxy Run a proxy to the Kubernetes API server run Run a particular image on the cluster. stop Deprecated: Gracefully shut down a resource by name or filename. expose Take a replication controller, service or pod and expose it as a new Kubernetes Service autoscale Auto-scale a replication controller
  • 20. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 20 Same Pod in Kubernetes $ kubectl create -f mypod.yaml pod "mypod" created apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: webserver image: ubuntu workingDir: /tmp/mypod command: ["python3", "-m", "http.server", "80"] volumeMounts: - name: htdocs mountPath: /tmp/mypod - name: busybox image: sttts/busybox-curl tty: true stdin: true volumeMounts: - name: htdocs mountPath: /tmp/mypod volumes: - name: htdocs hostPath: path: /tmp/mypod
  • 21. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 21 Documentation Documentation landing page: http://kubernetes.io/v1.1
  • 22. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 22 Documentation - Schema JSON/YAML/REST schema: http://kubernetes.io/v1.1/docs/api-reference/v1/definitions.html
  • 23. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 23 Examples – learn from them Deployment examples: https://github.com/kubernetes/kubernetes/tree/master/examples
  • 24. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 24 Browsing the API Open https://192.168.65.65:6443/swagger-ui/
  • 25. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 25 The source of truth: api/v1/types.go
  • 26. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 26 On the wire (JSON only) $ curl -k -u admin:admin https://192.168.65.39:6443/api/v1/namespaces/default/pods/mypod { "kind": "Pod", "apiVersion": "v1", "metadata": { "name": "mypod", "namespace": "default", "selfLink": "/api/v1/namespaces/default/pods/mypod", "uid": "37d657dc-b47a-11e5-938a-0242c0a84127", "resourceVersion": "5792", "creationTimestamp": "2016-01-06T13:34:32Z", "annotations": { "k8s.mesosphere.io/bindingHost": "192.168.65.44", "k8s.mesosphere.io/executorId": "cf3cd4adb282b475_k8sm-executor", "k8s.mesosphere.io/offerId": "20160106-081826-641837248-5050-1-O3680", "k8s.mesosphere.io/slaveId": "20160106-081826-641837248-5050-1-S1", "k8s.mesosphere.io/taskId": "pod.380df08e-b47a-11e5-8201-0242c0a8412b" } }, "spec": { "volumes": [ { "name": "htdocs", "hostPath": { "path": "/tmp/mypod" } }, { "name": "default-token-b3a3b", "secret": {
  • 27. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 27 ● in metadata block of every API resource ● labels can be used to filter objects serverside (annotations can’t) $ kubectl get nodes -l gen=2011 Labels & Annotations "annotations": { "k8s.mesosphere.io/bindingHost": "192.168.65.44", "k8s.mesosphere.io/executorId": "k8sm-executor", ... } for tooling "labels": { "git": "cb52d79578b1379e32b7e6a119ed16232ef1b13b", "env": "prod", "sla": "super-premium", "app": "webshop", "tier": "frontend" } for user/admin
  • 28. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 28 Getting the Pod IP $ kubectl get pod mypod -o yaml … hostIP: 192.168.65.68 phase: Running podIP: 192.168.66.11 startTime: 2016-01-07T08:33:55Z $ kubectl get pod mypod -o template --template='{{.status.podIP}}' 192.168.66.12
  • 29. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 29 From Pod to Pod consumer 192.168.66.42 busybox mypod with IP 192.168.66.6 webserver:80 busybox pause pause 192.168.66.6:80 mypod2 with IP 192.168.66.8 webserver:80 busybox pause 192.168.66.8:80 ● cluster routable IPs ● native ports without conflicts ● no “pod” service discovery available
  • 30. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 30 A Service consumer 192.168.66.42 busybox mypod with IP 192.168.66.6 webserver:80 busybox pause pause 10.10.10.7:80 mypod2 with IP 192.168.66.8 webserver:80 busybox pause 10.10.10.7:80 ● a service as a static API object $ kubectl create -f service.yaml ● virtual, but static IP (usually 10.x.y.z) ● no service discovery necessary Service“mypods”withvirtualIP10.10.10.7 endpoint for mypod endpoint for mypod2 192.168.66.8:80 192.168.66.6:80 brilliant
  • 31. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 31 Defining a Service $ cat mypods-service.yaml apiVersion: v1 kind: Service metadata: name: mypods spec: ports: - port: 80 selector: name: mypod $ kubectl create -f mypods-service.yaml service "mypods" created $ kubectl get services NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGE k8sm-scheduler 10.10.10.34 <none> 10251/TCP <none> 6h kubernetes 10.10.10.1 <none> 443/TCP <none> 6h mypods 10.10.10.32 <none> 80/TCP name=mypods 5m ● match pods with these labels ● a service without any pod is completely valid ● services exist on their own
  • 32. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 32 A Service, available on each node consumer 192.168.66.42 busybox mypod with IP 192.168.66.6 webserver:80 busybox pause pause 10.10.10.7:80 mypod2 with IP 192.168.66.8 webserver:80 busybox pause 10.10.10.7:80 Service“mypods”withvirtualIP10.10.10.7 endpoint for mypod endpoint for mypod2 192.168.66.8:80 192.168.66.6:80 ● Implemented by kube-proxy ○ in user-mode (simple proxy) ○ or using iptables ● on every node! traffic from a pod is intercepted on the host of the pod, not the destination of the connection. ! node A Note: In addition kube-proxy makes services available for other hosts, e. g. for internet clients
  • 33. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 33 mypod with IP 192.168.66.6 webserver:80 busybox pause mypod2 with IP 192.168.66.8 webserver:80 busybox pause Service“mypods”withvirtualIP10.10.10.7 endpoint for mypod endpoint for mypod2 192.168.66.8:80 192.168.66.6:80 ● 1 endpoint for each matching pod of a service ● endpoint = pod-IP:port, e.g. 192.168.66.6:80 $ kubectl get endpoints kube-ui NAME ENDPOINTS AGE mypods 192.168.65.68:8001 2s Service Endpoints Special in Kuberentes-Mesos because it runs without overlay network here. Otherwise, :80 would be visible here.
  • 34. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 34 Behind the scenes – Linux iptables $ iptables -t nat -n -L ... Chain KUBE-PORTALS-CONTAINER (1 references) target prot opt source destination REDIRECT tcp -- 0.0.0.0/0 10.10.10.3 /* kube-system/kube-ui: */ tcp dpt:80 redir ports 45123 REDIRECT tcp -- 0.0.0.0/0 10.10.10.181 /* default/k8sm-scheduler: */ tcp dpt:10251 redir ports 59722 REDIRECT tcp -- 0.0.0.0/0 10.10.10.1 /* default/kubernetes: */ tcp dpt:443 redir ports 55836 REDIRECT udp -- 0.0.0.0/0 10.10.10.10 /* kube-system/kube-dns:dns */ udp dpt:53 redir ports 57016 REDIRECT tcp -- 0.0.0.0/0 10.10.10.10 /* kube-system/kube-dns:dns-tcp */ tcp dpt:53 redir ports 42340
  • 35. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 35 ● state consists of all API objects, stored on the API-Server ● core Kubernetes architecture principle: logic is in control loops (“controllers”) which ● are state-less (can recover from failure) ● and decoupled (communication via API-Server) State plus Control read state process state write state
  • 36. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 36 A Control Loop to run Pods INPUT: REPLICAS: number of mypods that should be running ALGORITHM 1. running := number of running pods with label name=mypod 2. If running > REPLICAS => delete some mypods 3. If REPLICAS > running => launch some mypods 4. Goto 1
  • 37. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 37 REPLICAS = int(sys.argv[1]) master = os.getenv("KUBERNETES_MASTER", "http://localhost:8080") kubeclient = toolkit.KubeHTTPClient(api_server=master, debug=False) while True: # count mypods response = kubeclient.execute_operation(method="GET", ops_path="/api/v1/namespaces/default/pods?labelSelector=name%3Dmypod") mypods = response.json()['items'] running_mypods = len(mypods) print "{} running".format(running_mypods) ... Getting # of running mypods
  • 38. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 38 if running_mypods > REPLICAS: to_delete = running_mypods - REPLICAS print " Too many are running. Deleting {} pods:".format(to_delete) for pod in mypods[:to_delete]: print " Deleting pod {}".format(pod['metadata']['name']) kubeclient.delete_resource(pod['metadata']['selfLink']) If running > REPLICAS => delete some mypods
  • 39. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 39 elif REPLICAS > running_mypods: to_launch = REPLICAS - running_mypods for n in range(0, to_launch): mypod_spec, _ = util.load_yaml(filename="mypod.yaml") mypod_spec["metadata"]["name"] += "-" + shortuuid.uuid()[:4].lower() print "Launching pod {}".format(mypod_spec["metadata"]["name"]) response = kubeclient.execute_operation(method='POST', ops_path = "/api/v1/namespaces/default/pods", payload = util.serialize_tojson(mypod_spec)) If REPLICAS > running => launch some mypods
  • 40. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 40 apiVersion: v1 kind: ReplicationController metadata: name: mypod spec: replicas: 10 selector: name: mypod template: metadata: labels: name: mypod spec: containers: - name: webserver image: ubuntu ... $ kubectl create -f mypod-rc.yaml $ kubectl scale --replicas=5 rc/mypod Kubernetes Replication Controllers – “RCs”
  • 41. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 41 apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: mypod spec: selector: name: mypod template: metadata: labels: name: mypod spec: nodeSelector: env=dmz containers: - name: webserver image: ubuntu ... ● DaemonSets run pods once per node ● MyCassandraController might run Cassandra instances ● MyGaleraController might run MySQL Galera instances ● MyHaproxyUpdateController might write haproxy.conf ● MyNodeUpdateController might do rolling security updates on nodes or of containers ● MyBitcoinScheduler might schedule bitcoin pods for spare resources Other Controllers
  • 42. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 42 Controllers, controllers everywhere ... etcd apiserver controller-manager scheduler node controller endpoint controller kube-proxy kube-proxy kube-proxy kubelet kubelet kubelet replication controller daemonset controller service controller token controller resource quota controller persistent volume controller service account controller ...
  • 43. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 43 Of course: we are hiring in Hamburg, Berlin & San Francisco!
  • 44. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 44 Backup
  • 45. #k8sber @the1stein @mieszkoman © 2015 Mesosphere, Inc. All Rights Reserved. 45 $ kubectl get pods -l "name=mypod" -w --v=9 => GET https://192.168.65.39:6443/api/v1/watch/namespaces/default/pods? labelSelector=name%3Dmypod {"type":"ADDED","object":{"kind":"Pod","apiVersion":"v1", ...}} {"type":"MODIFIED","object":{"kind":"Pod","apiVersion":"v1", …}} {"type":"DELETED","object":{"kind":"Pod","apiVersion":"v1",...}} Watches