SlideShare a Scribd company logo
1 of 38
Download to read offline
www.luxoft.com
27.05.2019
Docker and Kubernetes
www.luxoft.com 2
Docker (Март 2013), Kubernetes (Июнь 2014), Docker Swarm (Июнь 2016)
но я познакомился с ними только недавно
Это обзор для тех кто еще об этом не слышал или не пользуется
Кому это нужно:
1. если есть уже серверные приложения под линукс
2. и нужно удобно их разворачивать,
сделать деплой с нуля и обновление максимально дешевым и стандартным
3. готовые healthcheck, restart, monitoring, запуск нескольких инстансов
4. build environements со специфическими версиями и без виртуалок
в Windows МС тоже что-то делает
www.luxoft.com 3
Google Play
Вы наверно использовали, чтобы установить приложение нужен один клик
На разных сборках андроида
Скачиваете - и сразу всё гарантированно работает
И также полностью сносится не оставляя следа в системе
Все приложения запускаются изолировано, в одной ОС, оверхед минимальный
www.luxoft.com 4
AspNetCore SDK 2.2 Node.js 6.0
Билд сервер VM
App 1.0
artifacts.zip
App 2.0
artifacts.zip
AspNetCore Runtime 2.2 Node.js 6.0
Production / Development / Test Env VM
Git
Latest src Build scripts
Storage VM
MySql 5.0 Redis 1.2
Redis DB
MySql DB
Website
Deployment
scripts
Worker
app
Nginx
Internet
Health checkconfig
VM setup
scripts
server setup
scripts
log collection
log viewer
health dashboard
shell, ansible/chef
/puppet/terraform
Доступный отовсюду
x N
x N
www.luxoft.com 5
My Web Application Environment deployment tool
- Возможность удалять оставляя чистую машину
- Возможность запуска много разного изолировано - на одной машине
- Обновление – одним кликом
- Предсобраные и сконфигурированные tool-приложения
www.luxoft.com 6
В реальности – много сложных скриптов на не лучших языках – setup env, deploy,… - писать и поддерживать
Нестандартные решения
На одной виртуалке – только одна версия Каждого приложения.
Как полностью очистить от всех старых версий всех приложений?
www.luxoft.com 7
Docker
Установка на чистую Ubuntu одной командой
> curl -fsSL https://get.docker.com -o get-docker.sh
> sudo sh get-docker.sh
www.luxoft.com 8
Docker
Установка на чистую Ubuntu одной командой
> curl -fsSL https://get.docker.com -o get-docker.sh
> sudo sh get-docker.sh
Стандартный image registry (Docker hub)
или свой docker registry одной командой
Малый размер images
www.luxoft.com 9
Docker
Установка на чистую Ubuntu одной командой
> curl -fsSL https://get.docker.com -o get-docker.sh
> sudo sh get-docker.sh
Стандартный image registry (Docker hub)
или свой docker registry одной командой
Малый размер images
поставить серверные приложения из image или обновить версию
- одной командой
> docker run docker.io/my-user/my-webapp:1.0
www.luxoft.com 10
Docker
Установка на чистую Ubuntu одной командой
> curl -fsSL https://get.docker.com -o get-docker.sh
> sudo sh get-docker.sh
Стандартный image registry (Docker hub)
или свой docker registry одной командой
Малый размер images
поставить серверные приложения из image или обновить версию
- одной командой
> docker run docker.io/my-user/my-webapp:1.0
работает на любом env (private servers, clouds – google, amazon, azure)
Ubuntu, Centos, RedHat…
www.luxoft.com 11
Docker
так же просто удалить, никакого влияния на хост
> docker stop container-id && docker rm container-id
www.luxoft.com 12
Docker
так же просто удалить, никакого влияния на хост
> docker stop container-id && docker rm container-id
изоляция контейнеров - можно ставить несколько разных версий
любого приложения на одной машине
- linux namespaces (2002) - Isolate Mount, Processes, Network, Hostname, Mem
- control-groups (2006) - Resource Limiting, Prioritization, Accounting, Checkpoint
www.luxoft.com 13
Docker
так же просто удалить, никакого влияния на хост
> docker stop container-id && docker rm container-id
изоляция контейнеров - можно ставить несколько разных версий
любого приложения на одной машине
- linux namespaces (2002) - Isolate Mount, Processes, Network, Hostname, Mem
- control-groups (2006) - Resource Limiting, Prioritization, Accounting, Checkpoint
огоромная экосистема – стандарт - хостинг во всех клаудах
Множество готовых images в registries, много документации и примеров
www.luxoft.com 14
Docker
Добавить артефакты вашего приложения в image
Dockerfile
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2.5
COPY ./bin/Release/Publish /TestApp
EXPOSE 5000
ENTRYPOINT ["dotnet", "/TestApp/TestApp.dll"]
> docker build -t test-app .
и выложить в registry – просто
> docker login --username A --password P
> docker tag test-app A/test-app
> docker push A/test-app
www.luxoft.com 15
Docker
Также просто запустить ваш image в container,
Полностью изолированно от всего остального на VM
> docker run -p 80:5000 --name my-app docker.io/A/test-app:1.0
www.luxoft.com 16
Docker
Также просто запустить ваш image в container,
Полностью изолированно от всего остального на VM
> docker run -p 80:5000 --name my-app docker.io/A/test-app:1.0
На любом environment
www.luxoft.com 17
Docker
Также просто запустить ваш image в container,
Полностью изолированно от всего остального на VM
> docker run -p 80:5000 --name my-app docker.io/A/test-app:1.0
На любом environment
Также просто удалить контейнер без следов на host
> docker stop my-app && docker rm my-app
www.luxoft.com 18
Docker
Cделать чтобы несколько containers имели между собой приватную сеть + DNS
> docker stack deploy --compose-file=docker-compose.yml my-stack
version: '3'
services:
web: - can call “redis:6379” like host
image: my-app:1.0
ports:
- “80:5000"
volumes:
- ./host/path:/data
redis:
image: "redis:alpine:1.0"
www.luxoft.com 19
Docker
Health check
> docker stack deploy --compose-file=docker-compose.yml my-stack
version: '3'
services:
web:
image: my-app:1.0
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
ports:
- “80:5000"
volumes:
- ./host/path:/data
redis:
image: "redis:alpine:1.0"
www.luxoft.com 20
Docker
Выложить новую версию
> docker stack deploy --compose-file=docker-compose.yml my-stack
version: '3'
services:
web:
image: my-app:2.0
replicas: 2
ports:
- “80:5000"
volumes:
- ./host/path:/data
redis:
image: "redis:alpine:1.0"
+ Множество других параметров
www.luxoft.com 21
Docker
Запустить приложение на нескольких машинах
> docker stack deploy --compose-file=docker-compose.yml my-stack
version: '3'
services:
web:
image: my-app:1.0
replicas: 2
ports:
- “80:5000"
volumes:
- ./host/path:/data
redis:
image: "redis:alpine:1.0"
www.luxoft.com
MASTER-IP > docker swarm init (-> TOKENVALUE)
WORKER-IP> docker swarm join --token TOKENVALUE MasterIP:2377
22
www.luxoft.com 23
Docker
Установить gitlab
> docker run -p 80:80 --restart always --name gitlab 
--volume /srv/gitlab/config:/etc/gitlab 
--volume /srv/gitlab/logs:/var/log/gitlab 
--volume /srv/gitlab/data:/var/opt/gitlab 
gitlab/gitlab-ce:latest
www.luxoft.com 24
www.luxoft.com 25
www.luxoft.com 26
разные способы запуска pods (containers)
- Deployments, StatefulSets (databases), Jobs, Daemons
- Все изолировано namespaces, names, labels (test, dev, prod,..)
- множество параметров настройки, healthcheck, restart, scaling
- Dns между services
- configs/secrets - настройки, connection strings передаваемые в containers
- persistent volumes
App 1.0
Docker image registry
App 2.0
Postgres 4.0
Ingress controller
Ingress controller
Pod Network
Pod Network
www.luxoft.com 27
Kubernetes
Всё гибко – работа с подсистемами через интерфейсы
- Разные container runtimes, не только docker (containerd, cri-o..)
- Разные Networks между pods (containers)
- Calico, Canal, Cilium, Flannel, Kube-router, Romana, Weave Net, JuniperContrail/TungstenFabric, Contiv-VPP
- Разные Ingress controllers
- NGINX, Ambassador, AppsCode, Contour, Citrix, F5 BIG-IP, Gloo, HAProxy, Istio, Kong, Traefik
- Разные volume drivers
- Множество готовых решений
интегрирующихся в kuber
(logs, monitoring,…)
и готовых конфигов для приложений
www.luxoft.com 28
Поддержка всеми клаудами / локальный кластер
www.luxoft.com 29
Kubernetes
Установка в google cloud
> gcloud components install kubectl
> gcloud auth configure-docker
www.luxoft.com 30
Kubernetes
Установка локального кластера
> apt-get install -y kubelet kubeadm kubectl
> kubeadm init --pod-network-cidr=10.244.0.0/16
> mkdir -p $HOME/.kube
> sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
> sudo chown $(id -u):$(id -g) $HOME/.kube/config
> kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
www.luxoft.com 31
Kubernetes
Установка default dashboard UI
> kubectl create -f
https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
Получить токен для логина в dashboard
> kubectl -n kube-system get secret
> kubectl -n kube-system describe secrets admin-user-token-cg5q7
Открыть доступ
> kubectl proxy --address=0.0.0.0
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
www.luxoft.com 32
Kubernetes – default dashboard UI
www.luxoft.com 33
Kubernetes
Запустить ваше приложение
> kubectl apply -f my-app.yml
apiVersion: v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: docker.io/A/my-app:1.0
ports:
- containerPort: 80
apiVersion: v1
kind: Service
metadata:
name: my-app
labels:
app: my-app
spec:
type: NodePort
ports:
- port: 80
selector:
app: my-app
kind: Ingress
metadata:
name: myapp-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-targe
spec:
tls:
hosts: [“my-app.com"]
secretName: wildcard-tls
rules:
- host: my-app.com
http:
paths:
- backend
serviceName: my-app
servicePort": 80
www.luxoft.com
kind: ConfigMap
apiVersion: v1
metadata:
name: postgres-config
labels:
app: postgres
data:
POSTGRES_DB: postgresdb
POSTGRES_USER: postgresadmin
POSTGRES_PASSWORD: admin123
---
kind: Service
apiVersion: v1
metadata:
name: postgres
labels:
app: postgres
spec:
type: NodePort
ports:
- port: 5432
selector:
app: postgres
34
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: postgres-pv-claim
labels:
app: postgres
spec:
storageClassName: manual
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: postgres-pv-volume
labels:
type: local
app: postgres
spec:
storageClassName: manual
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/mnt/data"
kind: StatefulSet
apiVersion: extensions/v1beta1
metadata:
name: postgres
spec:
replicas: 1
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:10.4
imagePullPolicy: "IfNotPresent"
ports:
- containerPort: 5432
envFrom:
- configMapRef:
name: postgres-config
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgredb
volumes:
- name: postgredb
persistentVolumeClaim:
claimName: postgres-pv-claim
https://severalnines.com/blog/using-kubernetes-deploy-postgresql
Запустить postgres
www.luxoft.com 35
Kubernetes
Запуск в google cloud
> gcloud container clusters create hello-cluster --num-nodes=2
> kubectl run test-app --image=docker.io/A/test-app:1.0 --port 8080 # pods
> kubectl expose deployment hello-web --type=LoadBalancer --port 80 --target-port 8080
Scale
> kubectl scale deployment hello-web --replicas=2
Update app version
> kubectl set image deployment/test-app test-app=docker.io/A/test-app:2.0
https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app
www.luxoft.com 36
Нужно ли заворачивать сервисы свого проекта в докер - да, это очень удобно
стандартные решения понятные всем, много готовых images,...
Нужен ли Kubernetes вместо докер compose/swarm
- если очевидно нужно одно из его преимуществ
- клауды где есть только Kubernetes
- фичи которые есть только в нём, гибкость, может лучше производительность
- множество примеров и конфигов установки стандартных приложений
www.luxoft.com 37
www.luxoft.com
Thank you
38

More Related Content

What's hot

Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)
Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)
Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)
Ontico
 
Управление облачной инфраструктурой
Управление облачной инфраструктуройУправление облачной инфраструктурой
Управление облачной инфраструктурой
dddpaul
 
Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)
Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)
Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)
Ontico
 

What's hot (20)

Docker - быстро, просто, наглядно
Docker - быстро, просто, наглядноDocker - быстро, просто, наглядно
Docker - быстро, просто, наглядно
 
TК°Conf. Микросервисы и Docker. Глеб Паньшин.
TК°Conf. Микросервисы и Docker. Глеб Паньшин.TК°Conf. Микросервисы и Docker. Глеб Паньшин.
TК°Conf. Микросервисы и Docker. Глеб Паньшин.
 
Jenkins в docker in mesos in ...
Jenkins в docker in mesos in ...Jenkins в docker in mesos in ...
Jenkins в docker in mesos in ...
 
Менеджер пакетов NuGet
Менеджер пакетов NuGetМенеджер пакетов NuGet
Менеджер пакетов NuGet
 
SPb Jenkins Meetup #5. Jenkins in da Cloud. Внутренности
SPb Jenkins Meetup #5. Jenkins in da Cloud. ВнутренностиSPb Jenkins Meetup #5. Jenkins in da Cloud. Внутренности
SPb Jenkins Meetup #5. Jenkins in da Cloud. Внутренности
 
Самоорганизующаяся сервисная инфраструктура на базе Docker / Данила Штань (То...
Самоорганизующаяся сервисная инфраструктура на базе Docker / Данила Штань (То...Самоорганизующаяся сервисная инфраструктура на базе Docker / Данила Штань (То...
Самоорганизующаяся сервисная инфраструктура на базе Docker / Данила Штань (То...
 
Docker: from understanding to production
Docker: from understanding to productionDocker: from understanding to production
Docker: from understanding to production
 
Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...
Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...
Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...
 
Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)
Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)
Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)
 
Управление облачной инфраструктурой
Управление облачной инфраструктуройУправление облачной инфраструктурой
Управление облачной инфраструктурой
 
Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)
Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)
Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)
 
Docker в виртуальной среде VMware
Docker в виртуальной среде VMwareDocker в виртуальной среде VMware
Docker в виртуальной среде VMware
 
Kubernetes and docker
Kubernetes and dockerKubernetes and docker
Kubernetes and docker
 
Кратчайшее введение в docker по-русски
Кратчайшее введение в docker по-русскиКратчайшее введение в docker по-русски
Кратчайшее введение в docker по-русски
 
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps MeetupДоклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
 
Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»
 
My talk on Docker from Moscow Django Meetup #25
My talk on Docker from Moscow Django Meetup #25My talk on Docker from Moscow Django Meetup #25
My talk on Docker from Moscow Django Meetup #25
 
Проникновение в Docker с примерами
Проникновение в Docker с примерамиПроникновение в Docker с примерами
Проникновение в Docker с примерами
 
CD with Jenkins. Lessons Learned
CD with Jenkins. Lessons LearnedCD with Jenkins. Lessons Learned
CD with Jenkins. Lessons Learned
 
Docker
DockerDocker
Docker
 

Similar to Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps"

Docker : что это, зачем, и как им пользоваться
Docker : что это, зачем, и как им пользоватьсяDocker : что это, зачем, и как им пользоваться
Docker : что это, зачем, и как им пользоваться
Сергей Ладыгин
 
Депрокрастинируем Docker: контейнеры здесь и сейчас
Депрокрастинируем Docker: контейнеры здесь и сейчасДепрокрастинируем Docker: контейнеры здесь и сейчас
Депрокрастинируем Docker: контейнеры здесь и сейчас
Ruslan Sharipov
 
Docker + Selenium Webdriver в рамках Continuous Integration
Docker + Selenium Webdriver в рамках Continuous IntegrationDocker + Selenium Webdriver в рамках Continuous Integration
Docker + Selenium Webdriver в рамках Continuous Integration
COMAQA.BY
 
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
Ontico
 

Similar to Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps" (20)

Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ci
 
Как не стать рабом облака. PaaS 2.0 с Docker
Как не стать рабом облака. PaaS 2.0 с DockerКак не стать рабом облака. PaaS 2.0 с Docker
Как не стать рабом облака. PaaS 2.0 с Docker
 
Docker в development окружение
Docker в development окружениеDocker в development окружение
Docker в development окружение
 
Docker : что это, зачем, и как им пользоваться
Docker : что это, зачем, и как им пользоватьсяDocker : что это, зачем, и как им пользоваться
Docker : что это, зачем, и как им пользоваться
 
Депрокрастинируем Docker: контейнеры здесь и сейчас
Депрокрастинируем Docker: контейнеры здесь и сейчасДепрокрастинируем Docker: контейнеры здесь и сейчас
Депрокрастинируем Docker: контейнеры здесь и сейчас
 
OpenStack и Docker: вместе и по отдельности
OpenStack и Docker: вместе и по отдельностиOpenStack и Docker: вместе и по отдельности
OpenStack и Docker: вместе и по отдельности
 
Instalarea DSpace
Instalarea DSpaceInstalarea DSpace
Instalarea DSpace
 
OpenStack и Docker: вместе и по отдельности
OpenStack и Docker: вместе и по отдельностиOpenStack и Docker: вместе и по отдельности
OpenStack и Docker: вместе и по отдельности
 
GitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с KubernetesGitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с Kubernetes
 
Продуктовые проблемы при создании очередной Docker PaaS / Владимир Ярцев (Cas...
Продуктовые проблемы при создании очередной Docker PaaS / Владимир Ярцев (Cas...Продуктовые проблемы при создании очередной Docker PaaS / Владимир Ярцев (Cas...
Продуктовые проблемы при создании очередной Docker PaaS / Владимир Ярцев (Cas...
 
Codeception + Docker + Robo и что из этого вышло
Codeception + Docker + Robo и что из этого вышлоCodeception + Docker + Robo и что из этого вышло
Codeception + Docker + Robo и что из этого вышло
 
Локальное окружение на Docker
Локальное окружение на DockerЛокальное окружение на Docker
Локальное окружение на Docker
 
Docker&Azure
Docker&AzureDocker&Azure
Docker&Azure
 
Docker + Selenium Webdriver в рамках Continuous Integration
Docker + Selenium Webdriver в рамках Continuous IntegrationDocker + Selenium Webdriver в рамках Continuous Integration
Docker + Selenium Webdriver в рамках Continuous Integration
 
Docker + Selenium Webdriver в рамках Continuous Integration
Docker + Selenium Webdriver в рамках Continuous IntegrationDocker + Selenium Webdriver в рамках Continuous Integration
Docker + Selenium Webdriver в рамках Continuous Integration
 
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
 
Dev ops.events.v tymoshyk-20-oct-2016
Dev ops.events.v tymoshyk-20-oct-2016Dev ops.events.v tymoshyk-20-oct-2016
Dev ops.events.v tymoshyk-20-oct-2016
 
Введение в Docker
Введение в DockerВведение в Docker
Введение в Docker
 
Docker + DockStation
Docker + DockStationDocker + DockStation
Docker + DockStation
 
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
 

More from LogeekNightUkraine

More from LogeekNightUkraine (20)

Face recognition with c++
Face recognition with c++ Face recognition with c++
Face recognition with c++
 
C++20 features
C++20 features C++20 features
C++20 features
 
Autonomous driving on your developer pc. technologies, approaches, future
Autonomous driving on your developer pc. technologies, approaches, futureAutonomous driving on your developer pc. technologies, approaches, future
Autonomous driving on your developer pc. technologies, approaches, future
 
Orkhan Gasimov "High Performance System Design"
Orkhan Gasimov "High Performance System Design" Orkhan Gasimov "High Performance System Design"
Orkhan Gasimov "High Performance System Design"
 
Vitalii Korzh "Managed Workflows or How to Master Data"
Vitalii Korzh "Managed Workflows or How to Master Data" Vitalii Korzh "Managed Workflows or How to Master Data"
Vitalii Korzh "Managed Workflows or How to Master Data"
 
Yevhen Tatarynov "From POC to High-Performance .NET applications"
Yevhen Tatarynov "From POC to High-Performance .NET applications"Yevhen Tatarynov "From POC to High-Performance .NET applications"
Yevhen Tatarynov "From POC to High-Performance .NET applications"
 
Oleksii Kuchuk "Reading gauge values with open cv imgproc"
Oleksii Kuchuk "Reading gauge values with open cv imgproc"Oleksii Kuchuk "Reading gauge values with open cv imgproc"
Oleksii Kuchuk "Reading gauge values with open cv imgproc"
 
Oleksandr Kutsan "Using katai struct to describe the process of working with ...
Oleksandr Kutsan "Using katai struct to describe the process of working with ...Oleksandr Kutsan "Using katai struct to describe the process of working with ...
Oleksandr Kutsan "Using katai struct to describe the process of working with ...
 
Pavlo Zhdanov "Mastering solid and base principles for software design"
Pavlo Zhdanov "Mastering solid and base principles for software design"Pavlo Zhdanov "Mastering solid and base principles for software design"
Pavlo Zhdanov "Mastering solid and base principles for software design"
 
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"
 
Iurii Antykhovych "Java and performance tools and toys"
Iurii Antykhovych "Java and performance tools and toys"Iurii Antykhovych "Java and performance tools and toys"
Iurii Antykhovych "Java and performance tools and toys"
 
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...
 
Aleksandr Kutsan "Managing Dependencies in C++"
Aleksandr Kutsan "Managing Dependencies in C++"Aleksandr Kutsan "Managing Dependencies in C++"
Aleksandr Kutsan "Managing Dependencies in C++"
 
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"
 
Alexandr Golyak, Nikolay Chertkov "Automotive Testing vs Test Automatio"
Alexandr Golyak, Nikolay Chertkov  "Automotive Testing vs Test Automatio"Alexandr Golyak, Nikolay Chertkov  "Automotive Testing vs Test Automatio"
Alexandr Golyak, Nikolay Chertkov "Automotive Testing vs Test Automatio"
 
Michal Kordas "Docker: Good, Bad or Both"
Michal Kordas "Docker: Good, Bad or Both"Michal Kordas "Docker: Good, Bad or Both"
Michal Kordas "Docker: Good, Bad or Both"
 
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"
 
Shestakov Illia "The Sandbox Theory"
Shestakov Illia "The Sandbox Theory"Shestakov Illia "The Sandbox Theory"
Shestakov Illia "The Sandbox Theory"
 
Dmytro Kochergin “Autotest with CYPRESS”
Dmytro Kochergin “Autotest with CYPRESS”Dmytro Kochergin “Autotest with CYPRESS”
Dmytro Kochergin “Autotest with CYPRESS”
 
Ivan Dryzhyruk “Ducks Don’t Like Bugs”
Ivan Dryzhyruk “Ducks Don’t Like Bugs”Ivan Dryzhyruk “Ducks Don’t Like Bugs”
Ivan Dryzhyruk “Ducks Don’t Like Bugs”
 

Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps"

  • 2. www.luxoft.com 2 Docker (Март 2013), Kubernetes (Июнь 2014), Docker Swarm (Июнь 2016) но я познакомился с ними только недавно Это обзор для тех кто еще об этом не слышал или не пользуется Кому это нужно: 1. если есть уже серверные приложения под линукс 2. и нужно удобно их разворачивать, сделать деплой с нуля и обновление максимально дешевым и стандартным 3. готовые healthcheck, restart, monitoring, запуск нескольких инстансов 4. build environements со специфическими версиями и без виртуалок в Windows МС тоже что-то делает
  • 3. www.luxoft.com 3 Google Play Вы наверно использовали, чтобы установить приложение нужен один клик На разных сборках андроида Скачиваете - и сразу всё гарантированно работает И также полностью сносится не оставляя следа в системе Все приложения запускаются изолировано, в одной ОС, оверхед минимальный
  • 4. www.luxoft.com 4 AspNetCore SDK 2.2 Node.js 6.0 Билд сервер VM App 1.0 artifacts.zip App 2.0 artifacts.zip AspNetCore Runtime 2.2 Node.js 6.0 Production / Development / Test Env VM Git Latest src Build scripts Storage VM MySql 5.0 Redis 1.2 Redis DB MySql DB Website Deployment scripts Worker app Nginx Internet Health checkconfig VM setup scripts server setup scripts log collection log viewer health dashboard shell, ansible/chef /puppet/terraform Доступный отовсюду x N x N
  • 5. www.luxoft.com 5 My Web Application Environment deployment tool - Возможность удалять оставляя чистую машину - Возможность запуска много разного изолировано - на одной машине - Обновление – одним кликом - Предсобраные и сконфигурированные tool-приложения
  • 6. www.luxoft.com 6 В реальности – много сложных скриптов на не лучших языках – setup env, deploy,… - писать и поддерживать Нестандартные решения На одной виртуалке – только одна версия Каждого приложения. Как полностью очистить от всех старых версий всех приложений?
  • 7. www.luxoft.com 7 Docker Установка на чистую Ubuntu одной командой > curl -fsSL https://get.docker.com -o get-docker.sh > sudo sh get-docker.sh
  • 8. www.luxoft.com 8 Docker Установка на чистую Ubuntu одной командой > curl -fsSL https://get.docker.com -o get-docker.sh > sudo sh get-docker.sh Стандартный image registry (Docker hub) или свой docker registry одной командой Малый размер images
  • 9. www.luxoft.com 9 Docker Установка на чистую Ubuntu одной командой > curl -fsSL https://get.docker.com -o get-docker.sh > sudo sh get-docker.sh Стандартный image registry (Docker hub) или свой docker registry одной командой Малый размер images поставить серверные приложения из image или обновить версию - одной командой > docker run docker.io/my-user/my-webapp:1.0
  • 10. www.luxoft.com 10 Docker Установка на чистую Ubuntu одной командой > curl -fsSL https://get.docker.com -o get-docker.sh > sudo sh get-docker.sh Стандартный image registry (Docker hub) или свой docker registry одной командой Малый размер images поставить серверные приложения из image или обновить версию - одной командой > docker run docker.io/my-user/my-webapp:1.0 работает на любом env (private servers, clouds – google, amazon, azure) Ubuntu, Centos, RedHat…
  • 11. www.luxoft.com 11 Docker так же просто удалить, никакого влияния на хост > docker stop container-id && docker rm container-id
  • 12. www.luxoft.com 12 Docker так же просто удалить, никакого влияния на хост > docker stop container-id && docker rm container-id изоляция контейнеров - можно ставить несколько разных версий любого приложения на одной машине - linux namespaces (2002) - Isolate Mount, Processes, Network, Hostname, Mem - control-groups (2006) - Resource Limiting, Prioritization, Accounting, Checkpoint
  • 13. www.luxoft.com 13 Docker так же просто удалить, никакого влияния на хост > docker stop container-id && docker rm container-id изоляция контейнеров - можно ставить несколько разных версий любого приложения на одной машине - linux namespaces (2002) - Isolate Mount, Processes, Network, Hostname, Mem - control-groups (2006) - Resource Limiting, Prioritization, Accounting, Checkpoint огоромная экосистема – стандарт - хостинг во всех клаудах Множество готовых images в registries, много документации и примеров
  • 14. www.luxoft.com 14 Docker Добавить артефакты вашего приложения в image Dockerfile FROM mcr.microsoft.com/dotnet/core/aspnet:2.2.5 COPY ./bin/Release/Publish /TestApp EXPOSE 5000 ENTRYPOINT ["dotnet", "/TestApp/TestApp.dll"] > docker build -t test-app . и выложить в registry – просто > docker login --username A --password P > docker tag test-app A/test-app > docker push A/test-app
  • 15. www.luxoft.com 15 Docker Также просто запустить ваш image в container, Полностью изолированно от всего остального на VM > docker run -p 80:5000 --name my-app docker.io/A/test-app:1.0
  • 16. www.luxoft.com 16 Docker Также просто запустить ваш image в container, Полностью изолированно от всего остального на VM > docker run -p 80:5000 --name my-app docker.io/A/test-app:1.0 На любом environment
  • 17. www.luxoft.com 17 Docker Также просто запустить ваш image в container, Полностью изолированно от всего остального на VM > docker run -p 80:5000 --name my-app docker.io/A/test-app:1.0 На любом environment Также просто удалить контейнер без следов на host > docker stop my-app && docker rm my-app
  • 18. www.luxoft.com 18 Docker Cделать чтобы несколько containers имели между собой приватную сеть + DNS > docker stack deploy --compose-file=docker-compose.yml my-stack version: '3' services: web: - can call “redis:6379” like host image: my-app:1.0 ports: - “80:5000" volumes: - ./host/path:/data redis: image: "redis:alpine:1.0"
  • 19. www.luxoft.com 19 Docker Health check > docker stack deploy --compose-file=docker-compose.yml my-stack version: '3' services: web: image: my-app:1.0 healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s ports: - “80:5000" volumes: - ./host/path:/data redis: image: "redis:alpine:1.0"
  • 20. www.luxoft.com 20 Docker Выложить новую версию > docker stack deploy --compose-file=docker-compose.yml my-stack version: '3' services: web: image: my-app:2.0 replicas: 2 ports: - “80:5000" volumes: - ./host/path:/data redis: image: "redis:alpine:1.0" + Множество других параметров
  • 21. www.luxoft.com 21 Docker Запустить приложение на нескольких машинах > docker stack deploy --compose-file=docker-compose.yml my-stack version: '3' services: web: image: my-app:1.0 replicas: 2 ports: - “80:5000" volumes: - ./host/path:/data redis: image: "redis:alpine:1.0"
  • 22. www.luxoft.com MASTER-IP > docker swarm init (-> TOKENVALUE) WORKER-IP> docker swarm join --token TOKENVALUE MasterIP:2377 22
  • 23. www.luxoft.com 23 Docker Установить gitlab > docker run -p 80:80 --restart always --name gitlab --volume /srv/gitlab/config:/etc/gitlab --volume /srv/gitlab/logs:/var/log/gitlab --volume /srv/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest
  • 26. www.luxoft.com 26 разные способы запуска pods (containers) - Deployments, StatefulSets (databases), Jobs, Daemons - Все изолировано namespaces, names, labels (test, dev, prod,..) - множество параметров настройки, healthcheck, restart, scaling - Dns между services - configs/secrets - настройки, connection strings передаваемые в containers - persistent volumes App 1.0 Docker image registry App 2.0 Postgres 4.0 Ingress controller Ingress controller Pod Network Pod Network
  • 27. www.luxoft.com 27 Kubernetes Всё гибко – работа с подсистемами через интерфейсы - Разные container runtimes, не только docker (containerd, cri-o..) - Разные Networks между pods (containers) - Calico, Canal, Cilium, Flannel, Kube-router, Romana, Weave Net, JuniperContrail/TungstenFabric, Contiv-VPP - Разные Ingress controllers - NGINX, Ambassador, AppsCode, Contour, Citrix, F5 BIG-IP, Gloo, HAProxy, Istio, Kong, Traefik - Разные volume drivers - Множество готовых решений интегрирующихся в kuber (logs, monitoring,…) и готовых конфигов для приложений
  • 28. www.luxoft.com 28 Поддержка всеми клаудами / локальный кластер
  • 29. www.luxoft.com 29 Kubernetes Установка в google cloud > gcloud components install kubectl > gcloud auth configure-docker
  • 30. www.luxoft.com 30 Kubernetes Установка локального кластера > apt-get install -y kubelet kubeadm kubectl > kubeadm init --pod-network-cidr=10.244.0.0/16 > mkdir -p $HOME/.kube > sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config > sudo chown $(id -u):$(id -g) $HOME/.kube/config > kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • 31. www.luxoft.com 31 Kubernetes Установка default dashboard UI > kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml Получить токен для логина в dashboard > kubectl -n kube-system get secret > kubectl -n kube-system describe secrets admin-user-token-cg5q7 Открыть доступ > kubectl proxy --address=0.0.0.0 http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
  • 32. www.luxoft.com 32 Kubernetes – default dashboard UI
  • 33. www.luxoft.com 33 Kubernetes Запустить ваше приложение > kubectl apply -f my-app.yml apiVersion: v1 kind: Deployment metadata: name: my-app labels: app: my-app spec: replicas: 2 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: docker.io/A/my-app:1.0 ports: - containerPort: 80 apiVersion: v1 kind: Service metadata: name: my-app labels: app: my-app spec: type: NodePort ports: - port: 80 selector: app: my-app kind: Ingress metadata: name: myapp-ingress annotations: nginx.ingress.kubernetes.io/rewrite-targe spec: tls: hosts: [“my-app.com"] secretName: wildcard-tls rules: - host: my-app.com http: paths: - backend serviceName: my-app servicePort": 80
  • 34. www.luxoft.com kind: ConfigMap apiVersion: v1 metadata: name: postgres-config labels: app: postgres data: POSTGRES_DB: postgresdb POSTGRES_USER: postgresadmin POSTGRES_PASSWORD: admin123 --- kind: Service apiVersion: v1 metadata: name: postgres labels: app: postgres spec: type: NodePort ports: - port: 5432 selector: app: postgres 34 kind: PersistentVolumeClaim apiVersion: v1 metadata: name: postgres-pv-claim labels: app: postgres spec: storageClassName: manual accessModes: - ReadWriteMany resources: requests: storage: 5Gi --- kind: PersistentVolume apiVersion: v1 metadata: name: postgres-pv-volume labels: type: local app: postgres spec: storageClassName: manual capacity: storage: 5Gi accessModes: - ReadWriteMany hostPath: path: "/mnt/data" kind: StatefulSet apiVersion: extensions/v1beta1 metadata: name: postgres spec: replicas: 1 template: metadata: labels: app: postgres spec: containers: - name: postgres image: postgres:10.4 imagePullPolicy: "IfNotPresent" ports: - containerPort: 5432 envFrom: - configMapRef: name: postgres-config volumeMounts: - mountPath: /var/lib/postgresql/data name: postgredb volumes: - name: postgredb persistentVolumeClaim: claimName: postgres-pv-claim https://severalnines.com/blog/using-kubernetes-deploy-postgresql Запустить postgres
  • 35. www.luxoft.com 35 Kubernetes Запуск в google cloud > gcloud container clusters create hello-cluster --num-nodes=2 > kubectl run test-app --image=docker.io/A/test-app:1.0 --port 8080 # pods > kubectl expose deployment hello-web --type=LoadBalancer --port 80 --target-port 8080 Scale > kubectl scale deployment hello-web --replicas=2 Update app version > kubectl set image deployment/test-app test-app=docker.io/A/test-app:2.0 https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app
  • 36. www.luxoft.com 36 Нужно ли заворачивать сервисы свого проекта в докер - да, это очень удобно стандартные решения понятные всем, много готовых images,... Нужен ли Kubernetes вместо докер compose/swarm - если очевидно нужно одно из его преимуществ - клауды где есть только Kubernetes - фичи которые есть только в нём, гибкость, может лучше производительность - множество примеров и конфигов установки стандартных приложений