Вы находитесь на странице: 1из 54

УПРАВЛЕНИЕ КОНТЕЙНЕРАМИ В

РАСПРЕДЕЛЕННОЙ СРЕДЕ
Место Kubernetes в экосистеме Red Hat

Дмитрий Севостьянов <dmitry.sevostyanov@redhat.com>


Senior Solution Architect, Red Hat
Программа
● Что такое контейнеры, назначение
● Kubernetes - средство распределенного управления контейнерами
● Архитектура
● Базовый функционал
● Аспекты разграничения доступа и безопасность
● Экосистема Red Hat для работы с контейнеризированными приложениями
● Жизненный цикл приложения
● Анонс семинара по OpenShift

2 Управление контейнерами в распределенной среде


ЧТО ТАКОЕ КОНТЕЙНЕРЫ
Подход к выполнению приложений
Традиционный режим работы с приложениями Использование контейнеров для работы с
в виртуальных машинах приложениями
Контейнеры
APP-1 APP-2 APP-n

MW-1 MW-2 MW-n


APP-1 APP-n
LIB-1 LIB-2 LIB-n
MW-1 MW-n
OS-1 OS-2 OS-n
LIB-1 LIB-n
VM-1 VM-2 VM-n

Virtualization OS

Hardware Hardware

4 Управление контейнерами в распределенной среде


Архитектура контейнеров Linux

● Пространства имен (Namespaces) Container Container Container


● Используется для бесконфликтного
существования одноименных Management Interface

ресурсов (FS, PID, NET)


● Контроль ресурсов (CGroups) Namespaces CGroups SELinux

● Ограничения по использованию CPU, Drivers Linux Kernel


RAM, I/O
● Мандатный контроль доступа (SELinux) Hardware
● Препятствует получению контейнером
доступа к другим контейнерам (sVirt)

Цикл статей про CGroups - https://www.google.com/?q=redhat+world+domination+with+cgroups+part

5 Управление контейнерами в распределенной среде


Docker
Это формат и API

● Использует возможности ядра Linux


● Предлагает удобный формат упаковки приложений
● Повторное использование
● Унифицированный API для работы с контейнерами

6 Управление контейнерами в распределенной среде


Использование контейнеров
Слои в образе Docker на Red Hat Enterprise Linux 7

Контейнер с приложением
● Используется device-mapper и снимки LVM(*) (Выполнение Приложения-А,
● Контейнер - активный компонент файловая система в режиме чтение-запись)

● Выполняющий приложение
● Основан на образе со всеми Слой пользователя (только чтение) (N)
зависимостями
Слой пользователя (только чтение) (1)
● После старта добавляется слой R/W
● Слой - часть зависимостей
● Основан на родительских слоях Образ платформы,
файловая система в режиме только для чтения
● Только чтение (OS Runtime, RO)
● Образ платформы - родительский слой
● Содержит базовый образ ОС
(*) - начиная с RHEL 7.4 доступен механизм OverlayFS v2

7 Управление контейнерами в распределенной среде


Atomic Host
Среда выполнения контейнеров

● Родился из проекта “Project Atomic”, задуманного компанией Red Hat


● “Project Atomic” - это проекты сообщества (OSS), для работы с контейнерами
● Red Hat и сообщество Fedora вносят основной вклад в этот проект
● Возможности и характеристики
● Быстрый и надежный запуск небольших контейнеров
● Легкая настройка (cloud-init) и обновление (OSTree)
● Управление через Web-консоль Cockpit
● RHEL - дает образ ОС класса Enterprise
● RH SCL - Ruby, Python, NodeJS, .Net Core, MySQL, PostgreSQL, MongoDB,..
● JBoss Middleware - EAP, Fuse, BPM Suite, Data Grid
● Входит в экосистему Red Hat для контейнеров

8 Управление контейнерами в распределенной среде


Что такое контейнеры
Зависит с какой стороны посмотреть

Инфраструктура Приложение

● Изолированные процессы в ядре ОС ● Упаковка приложения и всех его


● Легче и проще чем традиционные ВМ зависимостей
● Переносимые из окружения в ● Развертывание в любом окружении
окружение за секунды
● Управляемые унифицированным ● Участие в CI/CD
образом ● Распространение и повторное
использование
контейнеризированных компонент

9 Управление контейнерами в распределенной среде


О безопасности публичных контейнеров

docker pull mongodb

● Кто собрал образ?


● С какой целью
● Демо?
● Он безопасен для
скачивания?
● Кто осуществляет
поддержку образа?
● Как часто
обновляется образ?

10 Управление контейнерами в распределенной среде


Что надо учесть при работе в
распределенной среде
Контейнеры абстрагируют приложение от инфраструктуры, но не инфраструктуру

● Сетевая инфраструктура
● Масштабируемая, распределенная, автоматизированная
● Безопасность
● Внутри контейнеров, взаимодействия между контейнерами, среды
выполнения
● Аутентификация и авторизация
● RBAC, каталоги пользователей, интеграция через OAuth
● Система хранения данных
● Сохранение состояния приложения (разные протоколы, автоматизация)
● Реестр контейнеров
● Интегрированный реестр для корпоративных образов

11 Управление контейнерами в распределенной среде


АРХИТЕКТУРА KUBERNETES
Что такое Kubernetes
Концепции

● Платформа, описывающая уровни абстракции для доступа к ресурсам


● Логическим
● Pod, Service, Storage
● Физическим
● Ограничение CPU, Memory
● Платформа, управляющая жизненным циклом контейнеров (микросервисов)
● Проект с открытым исходным кодом
● Нет дополнительных сервисов, характерных для PaaS

13 Управление контейнерами в распределенной среде


Что такое Kubernetes
Архитектура

Master Node

API/Management Kubelet Proxy

Scheduler
Container
POD POD Engine
Replication Controller

Kubelet Container
Container Container
Container

ETCD ETCD ETCD

14 Управление контейнерами в распределенной среде


Что такое Kubernetes
Описание

● Docker определяет формат образа, собирает образ, управляет образом в


пределах одного хоста
● Kubernetes управляет контейнерами в формате Docker в пределах IP сети
● Kubernetes обеспечивает взаимодействие между контейнерами с помощью
сервисов
● Kubernetes запускает собранный разработчиком контейнер, находящийся в
реестре, используя планировщик
● Kubernetes-master выдает команду Kubernetes-node загрузить образ(ы) из
реестра, согласно метаописанию (pod)

15 Управление контейнерами в распределенной среде


Абстракции Kubernetes

● Namespace
● Проекты, изолирующие описание ресурсов
● Pod
● Label
● Service
● Replication Controller
● Quote

● Deployment
● Persistent Volume и Persistent Volume Claim

16 Управление контейнерами в распределенной среде


Абстракции Kubernetes
Pod

● Основная базовая абстракция платформы Kubernetes


● Функциональная часть приложения или микросервиса
● Минимальный неделимый элемент развертывания
● Описывает запуск одного или более контейнеров
● Определяет для контейнеров разделяемые ресусы (сеть, хранение данных)
● Контейнеры работают в одних и тех же областях видимости
● Переопределяет (при необходимости) команды запуска и аргументы для
контейнера
● Определяет тесты жизнеспособности
● Имеет жизненный цикл
● Используется в абстракциях Replication Controller, Deployment

17 Управление контейнерами в распределенной среде


Абстракции Kubernetes
Pod API Spec - https://kubernetes.io/docs/api-reference/v1.7/#pod-v1-core

apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- image: nginx:1.10
command: ["/usr/bin/nginx"]
args: ["-g 'daemon off;'"]

18 Управление контейнерами в распределенной среде


Абстракции Kubernetes
Label и Selector

● Пользовательское метаописание любого ресурса (абстракции) Kubernetes, также


известно как “теги”
● Представлены в виде пар ключ-значение
● Служит для группировки ресурсов

● Используются механизмом селекторов для поиска ресурсов


● Реплики создают приложения
● Сервисы обеспечивают доступ к приложениям
● ...

19 Управление контейнерами в распределенной среде


Абстракции Kubernetes
Service

● Базовый функционал, абстрагирует доступ к приложениям (Pod)


● Характеризуется уникальной постоянной парой IP:PORT (tcp/udp)
● Балансирует нагрузку между экземплярами приложений
● Обеспечивает механизм обнаружения
● Через переменные окружения
● Через представление во внутреннем DNS
● Устанавливает переменные окружения для обнаружения других сервисов
● Выбирает приложение, используя механизм меток (Label)

20 Управление контейнерами в распределенной среде


Абстракции Kubernetes
Service API Spec - https://kubernetes.io/docs/api-reference/v1.7/#service-v1-core

kind: Service
apiVersion: v1
metadata:
name: nginx-svc
spec:
ports:
- name: http
port: 80
targetPort: 80
selector:
app: nginx
type: LoadBalancer

21 Управление контейнерами в распределенной среде


Абстракции Kubernetes
Replication Controller

● Базовая абстракция для управления жизненным циклом приложения (pod)


● Реализует проверки жизнеспособности
● Запускает и поддерживает необходимое количество экземпляров приложения
● Определяет шаблон описания приложения (pod)
● Присваивает метки и дает имена приложениям (pod)
● Обеспечивает механизм масштабирования и обновления

● Используется в высокоуровневых абстракциях ReplicaSet и Deployment

22 Управление контейнерами в распределенной среде


Абстракции Kubernetes
RC API Spec - https://kubernetes.io/docs/api-reference/v1.7/#replicationcontroller-v1-core

kind: ReplicationController
apiVersion: v1
metadata:
name: nginx-rc
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.10

23 Управление контейнерами в распределенной среде


Абстракции Kubernetes
Квотирование ресурсов (quote)

● Используется для ограничений по ресурсам


● Физические: cpu, memory, storage
● Логическим: количество создаваемых Pod, RC, Service

24 Управление контейнерами в распределенной среде


Абстракции Kubernetes
Quote/Limits API Spec -
https://kubernetes.io/docs/tasks/administer-cluster/memory-default-namespace

kind: Quote
apiVersion: v1
metadata:
name: nginx-quote
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi

25 Управление контейнерами в распределенной среде


Абстракции Kubernetes
Deployment

● Абстракция пришла из OpenShift


● Используется для высокоуровневого описания процесса развертывания
приложений
● Описание использует Replication Controller
● Определяет политику для обновлений приложений
● Управляет масштабированием

26 Управление контейнерами в распределенной среде


Абстракции Kubernetes
Deployment API Spec -
https://kubernetes.io/docs/api-reference/v1.7/#deployment-v1beta1-apps

apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: deployment-example
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.10

27 Управление контейнерами в распределенной среде


Абстракции Kubernetes
Хранение данных приложения (PV/PVC)

● Том (volume) определяет подключение внешней системы хранения в контейнер


● Persistent Volume Claim описывает запрос со стороны приложения на получение
доступа к соответствующему тому (размер, тип, доступ)
● Persistent Volume представляет систему хранения в кластере Kubernetes
● Тип подключения, возможные варианты доступа, размер
● В момент запроса на получения увязываются сущности Volume и Persistent
Volume
● https://kubernetes.io/docs/concepts/storage/volumes/

28 Управление контейнерами в распределенной среде


Дополнительные сервисы
Kubernetes предоставляет механизмы для организации дополнительных сервисов

● Kubernetes не реализует, но предоставляет возможности для реализации


● Внутреннего DNS
● Реестра образов (Docker-registry)
● Сетевого обеспечения (SDN)
● Аутентификации и авторизации
● Пользовательских сервисов
● Мониторинг, логирование,..
● Версия 1.7 обеспечивает механизм ролевого доступа

29 Управление контейнерами в распределенной среде


Распределенное выполнение

CONTAINER CONTAINER CONTAINER CONTAINER CONTAINER

CONTAINER ORCHESTRATION & CLUSTER MANAGEMENT


(KUBERNETES)
LOGS &
NETWORKING STORAGE REGISTRY SECURITY
METRICS

CONTAINER INFRASTRUCTURE
CONTAINER AUTOMATION
CONTAINER and COCKPIT
CONTAINER CONTAINER

CONTAINER RUNTIME and PACKAGING


(DOCKER)
ATOMIC HOST
RED HAT ENTERPRISE LINUX

30 Управление контейнерами в распределенной среде


Замечания по безопасности
Аутентификация и авторизация

● Базовый функционал
● Идентификация осуществляется по сертификатам
● Авторизация проводится по принципу ABAC (Attribute Based Access Control)
● Дополнительные возможности
● htpasswd формат
● Возможность подключения провайдеров через OpenID Connect Token (с
версии 1.7)
● Авторизация RBAC

31 Управление контейнерами в распределенной среде


Замечания по безопасности
Безопасность в контейнерах

● Декларативный запрет запуска привилегированных контейнеров на уровне


kubelet
● Разрешение запуска привилегированных контейнеров на уровне
администрирования кластера
● Механизм ServiceAccount

32 Управление контейнерами в распределенной среде


СОЗДАНИЕ СРЕДЫ
Простая конфигурация для разработчика
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_atomic_host/7/html-single/getting_started_with_kuberne
tes/#setting_up_to_deploy_docker_containers_with_kubernetes

Установка на Atomic Host


● Загрузить образы Kubernetes (kubernetes-{apiserver,controller-mgr,scheduler})
● Создать конфигурацию запуска (три манифеста и один конфиг)
● Запустить сервисы: docker, etcd, kube-proxy, kubelet
● Проверить работоспособность
● ss -putanl |grep -E '(etcd)|(kube)'
● curl http://localhost:8080/
● kubectl get nodes
● kubectl get pods --all-namespaces

34 Управление контейнерами в распределенной среде


Простая конфигурация для разработчика
Проверка работоспособности [1/4]

[root@ds-kube02 ~]# ss -putanl |grep -E '(etcd)|(kube)'


tcp LISTEN 0 128 127.0.0.1:10248 *:* users:(("kubelet",pid=23213,fd=8))
tcp LISTEN 0 128 127.0.0.1:10249 *:* users:(("kube-proxy",pid=22445,fd=9))
tcp LISTEN 0 128 192.168.61.123:2379 *:* users:(("etcd",pid=22536,fd=8))
tcp LISTEN 0 128 127.0.0.1:2379 *:* users:(("etcd",pid=22536,fd=7))
tcp LISTEN 0 128 192.168.61.123:2380 *:* users:(("etcd",pid=22536,fd=5))
tcp LISTEN 0 128 192.168.61.123:7001 *:* users:(("etcd",pid=22536,fd=6))
tcp LISTEN 0 128 192.168.61.123:4001 *:* users:(("etcd",pid=22536,fd=9))

35 Управление контейнерами в распределенной среде


Простая конфигурация для разработчика
Проверка работоспособности [2/4]

[root@ds-kube02 ~]# curl http://localhost:8080/


{
"paths": [
"/api",
"/api/v1",
[...]
"/swaggerapi/",
"/ui/",
"/version"
]
}

36 Управление контейнерами в распределенной среде


Простая конфигурация для разработчика
Проверка работоспособности [3/4]

[root@ds-kube02 ~]# kubectl get nodes

NAME STATUS AGE

ds-kube02.client.local Ready 27d

37 Управление контейнерами в распределенной среде


Простая конфигурация для разработчика
Проверка работоспособности [4/4]

[root@ds-kube02 ~]# kubectl get pods --all-namespaces |grep kube


kube-system kube-apiserver-ds-kube02.client.local 1/1 Running 1 27d
kube-system kube-controller-manager-ds-kube02.client.local 1/1 Running 19 27d
kube-system kube-scheduler-ds-kube02.client.local 1/1 Running 14 27d

38 Управление контейнерами в распределенной среде


Создание кластера
https://blog.openshift.com/kubernetes-little-guide-install-options

● Kubernetes The Hard Way


● Создать кластер ETCD
● Создать сеть для SDN
● Загрузить описание сети в ETCD
● Настроить overlay-сеть (flanneld)
● Запустить сервисы Kubernetes
● Проверить работоспособность
● Пример скриптов
● https://github.com/dsevost/events-workshop-kubernetes-20170814

39 Управление контейнерами в распределенной среде


Кластер Kubernetes
Схема развертывания

Red Hat Satellite Red Hat Virtualization

RH Atomic Host RH Atomic Host RH Atomic Host

cwp2-kube01 cwp2-kube02 cwp2-kube03

Kubernetes Kubernetes Kubernetes


Registry
/kube-api
/kube-mgr
/kube-scheduler...

40 Управление контейнерами в распределенной среде


РАБОТА СО СРЕДОЙ
Создание приложения
Создание деплоймента из готового образа

[root@ds-kube01 ~]# kubectl run hello-world --image=tutum/hello-world --port=80


deployment "hello-world" created
[root@ds-kube01 ~]# kubectl get all -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deploy/hello-world 1 1 1 1 1m
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
svc/kubernetes 10.254.0.1 <none> 443/TCP 59s <none>
NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR
rs/hello-world-2571485955 1 1 1 53s hello-world tutum/hello-world
pod-template-hash=2571485955,run=hello-world
NAME READY STATUS RESTARTS AGE IP NODE
po/hello-world-2571485955-2zfhq 1/1 Running 0 53s 10.253.230.2
ds-kube02.client.local

42 Управление контейнерами в распределенной среде


Создание приложения
Создание сервиса для деплоймента

[root@ds-kube01 ~]# kubectl expose deploy hello-world --port=80 --target-port=80 --name hello-svc
[root@ds-kube02 ~]# kubectl describe svc/hello-svc
Name: hello-svc
Namespace: default
Labels: run=hello-world
Selector: run=hello-world
Type: ClusterIP
IP: 10.254.117.156
Port: <unset> 80/TCP
Endpoints: 10.253.230.2:80
Session Affinity: None

43 Управление контейнерами в распределенной среде


Создание приложения
Масштабирование деплоймента

[root@ds-kube01 ~]# kubectl scale deploy hello-world --replicas=3


deployment "hello-world" scaled
[root@ds-kube02 ~]# kubectl describe deploy/hello-world
Name: hello-world
Namespace: default
CreationTimestamp: Sat, 12 Aug 2017 12:50:04 +0300
Labels: run=hello-world
Selector: run=hello-world
Replicas: 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 1 max unavailable, 1 max surge
[...]

44 Управление контейнерами в распределенной среде


Создание приложения
Не штатный останов приложения

[root@ds-kube01 ~]# kubectl delete pod -l run=hello-world


pod "hello-world-2571485955-2zfhq" deleted
pod "hello-world-2571485955-hcntd" deleted
pod "hello-world-2571485955-p0xfz" deleted
[root@ds-kube01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE IP NODE
hello-world-2571485955-0dbgx 1/1 Running 0 1m 10.253.202.2 ds-kube01.client.local
hello-world-2571485955-dmjnr 1/1 Running 0 1m 10.253.230.2 ds-kube02.client.local
hello-world-2571485955-sm5rp 1/1 Running 0 1m 10.253.244.2 ds-kube03.client.local

45 Управление контейнерами в распределенной среде


Создание приложения
Удаление приложения и его артефактов

[root@ds-kube01 ~]kubectl delete all -l run=hello-world


deployment "hello-world" deleted
service "hello-svc" deleted

46 Управление контейнерами в распределенной среде


ЖИЗНЕННЫЙ ЦИКЛ ПРИЛОЖЕНИЙ
Качественный скачек
Переход от инфраструктуры к приложению

● Классический подход PaaS


● Платформа разработки как сервис
● Экономия ресурсов
● Встроенные сервисы
● Организация DevOps
● Автоматическое управление ресурсами (CaaS)
● Декларативные и динамические правила
● Разделение сред и трафика
● Автоматическая проверка работоспособности и исправление сбоев
● Интеграция в IT ландшафт предприятия
● Безопасность, внешние сервисы

48 Управление контейнерами в распределенной среде


Автоматизация жизненного цикла ПО
CONTAINER CONTAINER CONTAINER CONTAINER CONTAINER

SELF-SERVICE
SERVICE CATALOG
(LANGUAGE RUNTIMES, MIDDLEWARE, DATABASES, …)
BUILD AUTOMATION DEPLOYMENT AUTOMATION
APPLICATION LIFECYCLE MANAGEMENT
CONTAINER CONTAINER (CI/CD)
CONTAINER CONTAINER CONTAINER

CONTAINER ORCHESTRATION & CLUSTER MANAGEMENT


(KUBERNETES)
LOGS &
NETWORKING STORAGE REGISTRY SECURITY
METRICS

CONTAINER INFRASTRUCTURE
CONTAINER AUTOMATION
CONTAINER and COCKPIT
CONTAINER CONTAINER

CONTAINER RUNTIME and PACKAGING


(DOCKER)
ATOMIC HOST
RED HAT ENTERPRISE LINUX

49 Управление контейнерами в распределенной среде


ЗАКЛЮЧЕНИЕ
Экосистема Red Hat и контейнеры

● Что такое контейнеры, назначение


● Kubernetes - средство распределенного управления контейнерами
● Архитектура
● Базовый функционал и безопасность
● Создание среды и пример выполнения контейнера
● Экосистема Red Hat для работы с контейнеризированными приложениями
● Что необходимо учитывать для организации жизненного цикла приложений

51 Управление контейнерами в распределенной среде


Семинары из цикла “Контейнеры”

● Экосистема Red Hat для Docker-контейнеров


● Что такое контейнеры, Docker и Atomic Host
● Упаковка приложений в контейнеры
● Контейнеры в распределенной среде
● Архитектура и возможности Kubernetes
● Вспомогательные сервисы (SDN, Storage, Registry)
● Применение Red Hat OpenShift для поддержки жизненного цикла приложений
● Архитектура и возможности OpenShift Container Platform
● Безопасное выполнение приложений
● Управление приложениями, технологическими средами и контурами
безопасности

52 Управление контейнерами в распределенной среде


Полезные ссылки

● Red Hat Getting Started with Kubernetes

● "Kubernetes The Hard Way" - Setup Kubernetes Step-by-Step

● https://blog.openshift.com/red-hat-chose-kubernetes-openshift/

● https://github.com/dsevost/events-workshop-kubernetes-20170814

● Container Orchestration Tools Supported by Red Hat

53 Управление контейнерами в распределенной среде


СПАСИБО ЗА ВНИМАНИЕ
plus.google.com/+RedHat facebook.com/redhatinc

linkedin.com/company/red-hat twitter.com/RedHatNews

youtube.com/user/RedHatVideos