Kubernetes
Indonesia PhilippinesMalaysia ThailandSingapore Vietnam
Роман Кранкус Алексей Борисов
Strictly Confidential
LAZADA Group
■ Крупнейший маркетплейс в ЮВА
■ Работаем в 6 странах
■ Три офиса разработки в разных странах, более
1000 разработчиков
■ Часть холдинга AliBaba Group
Strictly Confidential
Что такое Docker?
Docker - технология запуска и управления приложениями в контейнерах
Основные идеи Docker:
■ Cgroups & namespaces
■ Golang
■ Docker Images
■ Libcontainer (resources, filesystem, ...)
Strictly Confidential
Архитектура Docker
Docker Registry
push, pull, search, ...
Docker
Daemon
Host OS
Hardware
libcontainer
Client
App App
cgroups, namespaces
Strictly Confidential
Что такое Kubernetes?
Kubernetes - платформа для управления кластером приложений,
запущенных в контейнерах (docker или rkt) на нескольких хостах.
Kubernetes включает в себя:
■ Группировкa контейнеров
■ Load balancing
■ Auto-healing
■ Scaling
■ Deployment
Strictly Confidential
Kubernetes: основные идеи
Организован по принципу master-slave, рассмотрим основные идеи:
■ Pods: группировка контейнеров
■ Labels: группировка подов
■ Kubelet: агенты
■ Replication Controller: управление репликами
■ Scheduler: планировщик
■ API Server: Kubernetes API Server
Strictly Confidential
Kubernetes: окружения
 Development: окружение разработчика
 Showrooms: тестовое окружение
 Staging/Live: «боевое» окружение
Strictly Confidential
Окружения для разработки
 Изолированные kvm (180 машин)
 Полная инсталляция Kubernetes внутри
VM
API Server, Replication
Controller, Scheduler
Kubelet, Kube-Proxy
Nginx
Strictly Confidential
Окружения для тестирования
 3 DC (VN, TH, MSK)
 Slaves (150 nodes)
 ~ 160 showrooms
API Server, Replication
Controller, Scheduler,
quagga, etcd
Kubelet,
Kube-Proxy
Kubelet,
Kube-Proxy
Kubelet,
Kube-Proxy
Kubelet,
Kube-Proxy
Nginx
 API Server Kubernetes
 Skydns
 Kube-Proxy
Strictly Confidential
DevOps-портал
Strictly Confidential
Staging и Live
 Более легкая инсталляция
 API Server Kubernetes
 Без skydns и kube-proxy
Nginx
pod
etcd
Confd
pod
Strictly Confidential
Проблемы внедрения
■ Не более 250 контейнеров на ноде
■ Не более 80 подов на ноде
■ Iptables нагружает CPU
■ Kubernetes в случае падения контейнера поднимает новый контейнер
из образа (потеря данных в memcached, elasticseach etc)
■ Задержки в репортах от kubelet к replication-controller
■ Зависание docker
■ Нестабильная работа flanneld
Deployment
Indonesia PhilippinesMalaysia ThailandSingapore Vietnam
Strictly Confidential
Схема деплоймента
1.New code
2.SCM poll
trigger build
3.push
image
4.BAD tool
runs
deployment
5. containers
started
Strictly Confidential
Деплоймент Docker
1. Code pushed to the bitbucket
2. Jenkins build image job
3. Building BAD tool on deploy node
4. Pulling image
5. Running BAD tool with params which starts new containers
6. Health checking
7. Stopping old containers if healthy or rollback
Strictly Confidential
Деплоймент Docker
BAD tool
Pull images
Checking current docker port
Starting new container on next port
Health checking
Rollback
PIU-PIU
Strictly Confidential
Деплоймент Kubernetes
Deployment Rolling updates Canary deployment
Strictly Confidential
Деплоймент Kubernetes
Deployments
Описание конфигурации приложения.
■ Imagetag
■ Env variables
■ Data volumes
■ Number of replicas
■ Labels
Strictly Confidential
Деплоймент Kubernetes
Deployments
Описание желаемого состояния
$ kubectl create -f myapp-deployment.yaml
deployment "myapp-deployment" created
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
myapp-deployment 3 3 3 3 35s
Strictly Confidential
Деплоймент Kubernetes
Liveness probes
■ HTTP
■ TCP
■ Command
livenessProbe:
httpGet:
path: /health_check
port: 8080
initialDelaySeconds: 15
timeoutSeconds: 1
periodSeconds: 15
Strictly Confidential
Деплоймент Kubernetes
Readiness probes
■ HTTP
■ TCP
■ Command
readinessProbe:
httpGet:
path: /health_check
port: 8080
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 15
Strictly Confidential
Деплоймент Kubernetes
ReadinessLiveness example
■ Readiness probe fails
■ Kubernetes stops routing traffic to the pod
■ Liveness probe fails
■ Kubernetes restarts the pod
■ Readiness probe succeeds
■ Kubernetes starts routing traffic to the pod again
Strictly Confidential
Деплоймент Kubernetes
Rolling updates
Service
+ +
v1 v1v1 v2
Replication controller
-replicas 3
-selector:
- app: my-app-v1
-version: v1
Replication controller
-replicas 1
-selector:
- app: my-app-v2
-version: v2
Strictly Confidential
Деплоймент Kubernetes
Rolling updates
Rollout
$ kubectl rolling-update my-app -f app.yaml
Scaling up my-app-v2 from 0 to 3, scaling down my-app from 3 to 0
Check status
$ kubectl rollout status deployment/my-app
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment "myapp-deployment" successfully rolled out
Rollback to previous version
$ kubectl rolling-update my-app –rollback
Strictly Confidential
Деплоймент Kubernetes
История изменений
$ kubectl rollout history deployment/my-app
deployments "my-app":
REVISION CHANGE-CAUSE
1 kubectl create -f my-app-deployment.yaml --record
2 kubectl set image deployment/my-app app=myapp:1.9
3 kubectl set image deployment/my-app app=myapp:2.0
Strictly Confidential
Деплоймент Kubernetes
Rolling updates
История изменений - подробная информация
$ kubectl rollout history deployment/myapp-deployment --revision=2
deployments "myapp-deployment" revision 2
Labels: app=myapp
pod-template-hash=1159050644
Annotations: kubernetes.io/change-cause=kubectl set image deployment/myapp-
deployment myapp=myapp:1.9
Containers:
myapp:
Image: myapp:1.9
Port: 80/TCP
Strictly Confidential
Деплоймент Kubernetes
Rolling updates
История изменений - откат на конкретную ревизию
$ kubectl rollout undo deployment/myapp-deployment --to-revision=2
deployment "myapp-deployment" rolled back
Откат на предыдущую ревизию
$ kubectl rollout undo deployment/maypp-deployment
deployment "myapp-deployment" rolled back
Strictly Confidential
Управление процессом Rolling update
■ maxSurge, maxUnavailable
■ maxSurge - максимальное количество подов поверх ожидаемых.
■ MaxUnavailable - максимальное количество недоступных подов в
процессе обновления.
strategy:
rollingUpdate:
maxSurge: 10
maxUnavailable: 5
type: RollingUpdate
Strictly Confidential
Управление процессом Rolling update
■ MaxSurge: 2
MaxUnavailable: 1
Strictly Confidential
Управление процессом Rolling update
■ MaxSurge: 2
MaxUnavailable: 1
Strictly Confidential
Управление процессом Rolling update
■ MaxSurge: 2
MaxUnavailable: 1
Strictly Confidential
Управление процессом Rolling update
■ MaxSurge: 2
MaxUnavailable: 1
Strictly Confidential
Канареечный деплой
Strictly Confidential
Канареечный деплой
Плюсы:
■ Деплой без даунтайма.
■ Возможность перенаправлять часть трафика на другую версию приложения.
■ Возможность быстро откатиться на предыдущую версию.
Load balancer
stable
stable
unstable
stable
Strictly Confidential
Канареечный деплой
■ STABLE
■ name: frontend
replicas: 3
...
labels:
app: guestbook
tier: frontend
track: stable
...
image: gb-frontend:v3
■ UNSTABLE
■ name: frontend-unstable
replicas: 1
...
labels:
app: guestbook
tier: frontend
track: unstable
...
image: gb-frontend:v4
Load balancer
stable
stable
stable
unstable
Strictly Confidential
Бонусы
■ Отсутствие даунтайма при деплое
■ Быстрое масштабирование
■ Динамическая конфигурация кластера - легко добавлятьудалять
нодыподы
■ Тонко конфигурируемый деплой
■ Быстрый ролаут и ролбек
Strictly Confidential
Вопросы?

Kubernetes