Kubernetes
From sketch to production
Sergiy Shevchenko
Software Engineer
eTuitus an Infocert Company
Architecture
master
node 1
Docker
kubelet
kube-proxy
node 2
Docker
kubelet
kube-proxy
etcd
API
server
Controller
manager
Scheduler
kubectl
YAML declarative
Architecture
master
node 2
Docker
kubelet
kube-proxy
etcd
API
server
Controller
manager
Scheduler
kubectl
YAML declarative
Kubernetes
Building
Bricks
Container
Image CMD
Pod
Container 1 Container 2
...
localhost eth0
volume2volume1
tier: backend version: 0.1
Labels and selectors
tier: backend
version: 0.1
app: foo
partition: customer_1
app in (foo, bar)
partition !=
customer_1
tier == backend
Architecture
master
node 2
Docker
kubelet
kube-proxy
etcd
API
server
Controller
manager
Scheduler
kubectl
YAML declarative
Pod object (manual-bash.yaml)
apiVersion: v1
kind: Pod
metadata:
name: manual-bash
spec:
containers:
- name: bash
image: ubuntu:18.04
command: bash
args: [-c, "while true; do sleep 1; date; done"]
Pod object (manual-bash.yaml)
apiVersion: v1
kind: Pod
metadata:
name: manual-bash
spec:
containers:
- name: bash
image: ubuntu:18.04
command: bash
args: [-c, "while true; do sleep 1; date; done"]
Pod object (manual-bash.yaml)
apiVersion: v1
kind: Pod
metadata:
name: manual-bash
spec:
containers:
- name: bash
image: ubuntu:18.04
command: bash
args: [-c, "while true; do sleep 1; date; done"]
Pod object (manual-bash.yaml)
apiVersion: v1
kind: Pod
metadata:
name: manual-bash
spec:
containers:
- name: bash
image: ubuntu:18.04
command: bash
args: [-c, "while true; do sleep 1; date; done"]
Pod object (manual-bash.yaml)
apiVersion: v1
kind: Pod
metadata:
name: manual-bash
labels:
tier: backend
spec:
containers:
- name: bash
image: ubuntu:18.04
command: bash
args: [-c, "while true; do sleep 1; date; done"]
Replica set
N
Replica set
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: backend
spec:
replicas: 3
selector:
matchLabels:
tier: backend
template:
metadata:
labels:
tier: backend
spec:
containers:
- name: go-back
image: myregistry.local/backend:0.15.7
Deployment
N
History
Deploy
Pod
N
Deployment
3
0.15.1
1
0.15.2
Deployment
3
0.15.1
1
0.15.2
Deployment
2
0.15.1
1
0.15.2
Deployment
2
0.15.1
1
0.15.2
Deployment
1
0.15.1
2
0.15.2
Deployment
0
0.15.1
2
0.15.2
Deployment
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: backend
spec:
replicas: 3
selector:
matchLabels:
tier: backend
template:
metadata:
labels:
tier: backend
spec:
containers:
- name: go-back
image: myregistry.local/backend:0.15.7
Kubernetes building bricks
N
Deployment
Service
DNS
Virtual IP
LoadBalancer
Selector
Service
tier:db
tier:backend ver:0.15.9
tier:db
tier:backend ver:0.15.10
tier:backend ver:0.15.9
tier:backend ver:0.15.10
Backend
tier:backend
tier:db
tier:backend ver:0.15.9
tier:db
tier:backend ver:0.15.10
tier:backend ver:0.15.9
tier:backend ver:0.15.10
Backend
tier:backend
ver:0.15.10
Service
kind: Service
apiVersion: v1
metadata:
name: backend
spec:
selector:
tier: backend
ports:
- protocol: TCP
port: 80
targetPort: 8080
http://backend.svc.cluster.local
Service
kind: Service
apiVersion: v1
metadata:
name: backend
spec:
type: LoadBalancer
selector:
tier: backend
ports:
- protocol: TCP
port: 80
targetPort: 8080
http://backend.svc.cluster.local
AWS, DigitalOcean, ecc
Kubernetes building bricks
N
Deployment
Service
Job
Pod
Successful
completion
Job
Job
apiVersion: batch/v1
kind: Job
metadata:
name: migrate
spec:
template:
metadata:
name: migrate
spec:
containers:
- name: migrate
image: myregistry.local/backend:0.15.9
command: [python3, migrate]
restartPolicy: Never
Kubernetes building bricks
N
Deployment
Service
Job
Cron Job
ScheduleJob
Cron Job
Cron Job
apiVersion: batch/v2alpha1
kind: CronJob
metadata:
name: cron-foo
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: main
image: myregistry.local/backend:0.15.9
args: [python3, cron-foo]
restartPolicy: OnFailure
Kubernetes building bricks
N
Deployment
Service
Job Cron Job
Volume
Size
Access
Storage Class
Volume
Read Write ONCE
Read Only MANY
Read Write MANY
Slow
Fast Admin defined
● awsElasticBlockStore
● azureDisk
● azureFile
● cephfs
● cinder
● configMap
● csi
● downwardAPI
● emptyDir
● fc (fibre channel)
● flexVolume
● flocker
● gcePersistentDisk
● gitRepo (deprecated)
● glusterfs
● hostPath
● iscsi
● local
● nfs
● persistentVolumeClaim
● projected
● portworxVolume
● quobyte
● rbd
● scaleIO
● secret
● storageos
● vsphereVolume
Kubernetes building bricks
N
Deployment
N
Replica Set
Volume Volume
Kubernetes building bricks
N
Deployment
N
Replica Set
Volume Volume
ReadWrite ONCE
ReadWrite ONCE
StatefulSet
0 1 N...
N0
Deployment vs StatefulSet
foo
3
Deployment
foo-asq7
foo-toxr
foo-if7n
bar
30
StatefulSet
bar-0
bar-1
bar-2
Deployment vs StatefulSet
N
Deployment Stateful Set
Volume
N
0
Kubernetes building bricks
N
Deployment
Service
Job Cron Job
Stateful Set
N
0
Ingress
foo bar
foo
N
bar
N
Internet
foo bar
foo
N
bar
N
Ingress
Internet
Ingress
Hostname
Path
TLS
Service
Ingress
Ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: main
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /assets
backend:
serviceName: frontend
servicePort: 80
- path: /
backend:
serviceName: backend
servicePort: 80
Kubernetes building bricks
N
Deployment
Service
Job Cron Job
Stateful Set
N
0
Ingress
Thank you!
Any questions?

Kubernetes - from sketch to production