2. Strictly Confidential
LAZADA Group
■ Крупнейший маркетплейс в ЮВА
■ Работаем в 6 странах
■ Три офиса разработки в разных странах, более
1000 разработчиков
■ Часть холдинга AliBaba Group
3. Strictly Confidential
Что такое Docker?
Docker - технология запуска и управления приложениями в контейнерах
Основные идеи Docker:
■ Cgroups & namespaces
■ Golang
■ Docker Images
■ Libcontainer (resources, filesystem, ...)
5. Strictly Confidential
Что такое Kubernetes?
Kubernetes - платформа для управления кластером приложений,
запущенных в контейнерах (docker или rkt) на нескольких хостах.
Kubernetes включает в себя:
■ Группировкa контейнеров
■ Load balancing
■ Auto-healing
■ Scaling
■ Deployment
6. Strictly Confidential
Kubernetes: основные идеи
Организован по принципу master-slave, рассмотрим основные идеи:
■ Pods: группировка контейнеров
■ Labels: группировка подов
■ Kubelet: агенты
■ Replication Controller: управление репликами
■ Scheduler: планировщик
■ API Server: Kubernetes API Server
8. Strictly Confidential
Окружения для разработки
Изолированные kvm (180 машин)
Полная инсталляция Kubernetes внутри
VM
API Server, Replication
Controller, Scheduler
Kubelet, Kube-Proxy
Nginx
9. 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
11. Strictly Confidential
Staging и Live
Более легкая инсталляция
API Server Kubernetes
Без skydns и kube-proxy
Nginx
pod
etcd
Confd
pod
12. Strictly Confidential
Проблемы внедрения
■ Не более 250 контейнеров на ноде
■ Не более 80 подов на ноде
■ Iptables нагружает CPU
■ Kubernetes в случае падения контейнера поднимает новый контейнер
из образа (потеря данных в memcached, elasticseach etc)
■ Задержки в репортах от kubelet к replication-controller
■ Зависание docker
■ Нестабильная работа flanneld
15. 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
19. 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
22. 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
24. 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
25. 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
26. 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
27. 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
28. Strictly Confidential
Управление процессом Rolling update
■ maxSurge, maxUnavailable
■ maxSurge - максимальное количество подов поверх ожидаемых.
■ MaxUnavailable - максимальное количество недоступных подов в
процессе обновления.
strategy:
rollingUpdate:
maxSurge: 10
maxUnavailable: 5
type: RollingUpdate
34. Strictly Confidential
Канареечный деплой
Плюсы:
■ Деплой без даунтайма.
■ Возможность перенаправлять часть трафика на другую версию приложения.
■ Возможность быстро откатиться на предыдущую версию.
Load balancer
stable
stable
unstable
stable