1. Почему OpenStack
2. Как устроен OpenStack, батарейки
3. Как писать для OpenStack
4. Что мы пишем
3Подходы к расширению OpenStack
Оглавление
〉Масштабируемость
〉 Кастомизируемость
〉 Заменяемость
4Подходы к расширению OpenStack
Как мы выбирали облако
〉Он задуман как платформа для облаков любых типов и размеров
〉 Его компоненты взаимосвязаны на уровне API
〉 Построен на известных компонентах
5Подходы к расширению OpenStack
Почему OpenStack
〉 Приложения взаимодействуют между собой через разнообразные HTTP API
〉 Keystone предоставляет общее пространство имен и систему авторизации
8Как устроен OpenStack
Взаимодействие
〉 Приложения генерируют события, на которые можно реагировать
〉 Зависит от инсталляции
9Как устроен OpenStack
Взаимодействие
〉 Каталог проектов и пользователей и их ролей
〉 Концепция проектов
〉 Система аутентификации и авторизации
〉 Генерация и проверка токена
〉 Каталог сервисов
11Как устроен OpenStack
Keystone, the OpenStack Identity Service
Токен определяет пользователя
〉 авторизация и роли
〉 имперсонификация
12Как устроен OpenStack
Auth Token
Как устроен OpenStack
Сервис OpenStack — HTTP-API приложение на Python с авторизацией в Keystone и плагинами
def app(env, start_response): if env['REQUEST_METHOD'] == "POST": do(env['wsgi.input'].read()) ... start_response(status=200,...) return ...
15Как устроен OpenStack
WSGI, middleware и Paste Deploy
〉 PEP 0333, PEP 3333
〉WebOb, Flask, Python Paste
〉 Декларативный деплоймент
16Как устроен OpenStack
WSGI, middleware и Paste Deploy
from flask import Flaskapp = Flask()@app.route('/')def handler(): ... return ...
17Как устроен OpenStack
WSGI, middleware и Paste Deploy
from webob import Responsedef app(env, start_response): ... return Response( status=200, content_type="application/json", body=data)(env, start_response)
18Как устроен OpenStack
WSGI, middleware и Paste Deploy
class Middleware(object): def __init__(self, app, conf): self.app = app def __call__(self, env, start_response): return self.app(env, start_response)
19Как устроен OpenStack
WSGI, middleware и Paste Deploy
# your /usr/bin/appfrom yourapp import CacheMiddleware, AuthMiddlewareapp = App()app_with_cache = CacheMiddleware(app, conf)app_with_auth = AuthMiddleware(app, conf)WSGIServer(app_with_auth).serve()
20Как устроен OpenStack
WSGI, middleware и Paste Deploy
[app:app]paste.app_factory = yourapp:app_factory[filter:cache]paste.filter_factory = yourapp:cache_factory[filter:auth]paste.filter_factory = yourapp:auth_factory[pipeline:main]pipeline = auth cache app
21Как устроен OpenStack
WSGI, middleware и Paste Deploy
[composite:metaapp]use = egg:Paste#urlmap/:main [app:app]paste.app_factory = yourapp:app_factory[filter:cache]paste.filter_factory = yourapp:cache_factory[filter:auth]paste.filter_factory = yourapp:auth_factory[pipeline:main]pipeline = auth cache app
22Как устроен OpenStack
WSGI, middleware и Paste Deploy
[entry_points]nova.api.v3.extensions = yandexresponsibles = myext:MyMethod
23Как устроен OpenStack
Entry Points
from pkg_resources import iter_entry_pointsiter_entry_points( group='nova.api.v3.extensions', name=None)
24Как устроен OpenStack
Entry Points
〉 Использование API и событий
〉 Только поддержка токена
〉 Готовые библиотеки
〉 Полная свобода
27Как писать для OpenStack
Новое приложение
Вся реализация абстракций:
〉 методы аутентикации в Keystone
〉 драйверы виртуализации, образов, томов и т.д. в Nova
〉 драйверы сетевого оборудования в Neutron
28Как писать для OpenStack
Драйверы
〉 Тот же драйвер, но запускается отдельно
〉 Доступен только через RPC
31Как писать для OpenStack
Агенты
Позволяет изменять запрос или ответ:
〉 в Swift всё — middleware
〉 ограничения и аудит
〉 вне контекста приложения
32Как писать для OpenStack
Middleware
Позволяют работать с API:
〉 новые вызовы
〉 обработка существующих вызовов после роутинга и до сериализации
〉 контекст приложения
33Как писать для OpenStack
Расширения
Механизм хуков:
〉 наилучший вариант при изменении внутреннего поведения
〉 требует апстрима
34Как писать для OpenStack
Хуки
35
Как писать для OpenStack
Новое приложение Драйверы Middleware Расширения Хуки
Возможности Любые Определены API Мало Любые Минимальны
Интеграция Сильная Сильная Сильная Сильная Не для этого
Интерфейс Легкий Сложный Легкий Несложный Легкий
Поддержка Не требуется
Как написание
Легко Легко Сложно
Модификация апстрима Нет Нет Нет Нет Да
〉Фреймворк для построения интерфейсов
〉 Переопределение через monkey patch
〉 Подключение новых интерфейсов
36Как писать для OpenStack
Веб-интерфейс Horizon
〉 Расширения Keystone для хранения маппингов и синхронизации пользователей
〉 Расширения системы авторизации для приема Cookies
〉 Переопределение модуля проверки пароля
〉 Переписанный Horizon для передачи Cookies
〉 Приложения Horizon для управления
38Что мы пишем
Аутентификация и Single Sign-On
〉 Новый backend-драйвер для nsupdate
〉 Новый драйвер обработки событий
〉 Расширения здесь и в Nova для проверки и синхронизации
39Что мы пишем
Designate
〉 Агент для получения LLDP
〉 API extension для заведения сетей
〉 API extension для настройки VLAN
40Что мы пишем
Neutron
〉 Регистрация во всяких системах через обработку событий
〉 Выдача информации внешним системам через API extensions
〉 Свои команды в клиенте через entry points
〉 Визуализации и автоматизации в отдельных приложениях
41Что мы пишем
Интеграция
Владимир Еремин
OpenStack DevOps
Контакты
@yottatsa
yottatsa
+7 (495) 739 70 00
Recommended