O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python Conf++ 2019)

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Carregando em…3
×

Confira estes a seguir

1 de 47 Anúncio

OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python Conf++ 2019)

Baixar para ler offline

The report tells about one of the largest open-source projects written in the python language - OpenStack, what it consists of, how development is carried out. I also tell you how to become a member of the community and start contributing to the project. The report is very useful for novice developers who are just starting their steps in the world of OpenStack.

Abstract: https://conf.python.ru/2019/abstracts/4607
Video: https://www.youtube.com/watch?v=coD5f4ALGug

The report tells about one of the largest open-source projects written in the python language - OpenStack, what it consists of, how development is carried out. I also tell you how to become a member of the community and start contributing to the project. The report is very useful for novice developers who are just starting their steps in the world of OpenStack.

Abstract: https://conf.python.ru/2019/abstracts/4607
Video: https://www.youtube.com/watch?v=coD5f4ALGug

Anúncio
Anúncio

Mais Conteúdo rRelacionado

Semelhante a OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python Conf++ 2019) (20)

Mais recentes (19)

Anúncio

OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python Conf++ 2019)

  1. 1. OpenStack - Python-проект в 12 миллионов строк. История проекта, комьюнити, библиотеки и интересные решения Пономарев Вадим
  2. 2. 2 Кто я?
  3. 3. 3 Что такое Openstack
  4. 4. ● совместная разработка Rackspace и NASA ● первый релиз 21 октября 2010 ● написан на Python ● лицензия Apache License 2.0 ● в настоящее время управляется Openstack Foundation История 4
  5. 5. Миссия 5 "to produce the ubiquitous Open Source Cloud Computing platform that will meet the needs of public and private clouds regardless of size, by being simple to implement and massively scalable"
  6. 6. Архитектура 6
  7. 7. Микросервисы 7
  8. 8. https://www.openstack.org/project-mascots/ Маскоты 8
  9. 9. https://www.openstack.org/software/ Что делает OpenStack 9
  10. 10. ● China Mobile ● eBay ● CERN ● Volkswagen AG ● AT&T ● VEXXHOST ● Adobe ● American Airlines ● Walmart ● Nike ● Oath/Yahoo! ● ... https://www.openstack.org/user-stories Кто использует? 10
  11. 11. ● > 12 млн. строк кода ● > 1 млн. коммитов ● > 15 000 контрибьюторов ● > 1500 проектов в целом ● 975 проектов Python Размер в цифрах 11
  12. 12. Вклад комьюнити – Stackalytics 12 https://www.stackalytics.com/ Red Hat Other companies VMware Independent developers AT&T Huawei Canonical Rackspace SUSE IBM
  13. 13. Вклад комьюнити – Stackalytics 13 https://www.stackalytics.com/
  14. 14. Разработка 14 https://docs.openstack.org/infra/manual/developers.html
  15. 15. Релизы https://docs.openstack.org/project-team-guide/stable-branches.html#maintenance-phases 15
  16. 16. Управление версиями на примере релиза "Rocky" https://docs.openstack.org/project-team-guide/stable-branches.html#maintenance-phases https://github.com/openstack/requirements/blob/stable/rocky/upper-constraints.txt https://specs.openstack.org/openstack/openstack-specs/specs/requirements-management.html 16
  17. 17. Ревью кода https://docs.openstack.org/infra/manual/core.html 17
  18. 18. Devstack – маленький OpenStack для разработчиков https://docs.openstack.org/devstack/latest/ $ sudo useradd -s /bin/bash -d /opt/stack -m stack $ echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack $ sudo su - stack $ git clone https://git.openstack.org/openstack-dev/devstack $ cd devstack $ vim local.conf [[local|localrc]] ADMIN_PASSWORD=secret DATABASE_PASSWORD=$ADMIN_PASSWORD RABBIT_PASSWORD=$ADMIN_PASSWORD SERVICE_PASSWORD=$ADMIN_PASSWORD $ ./stack.sh 18
  19. 19. Библиотеки OpenStack – Oslo https://wiki.openstack.org/wiki/Oslo#Libraries 19 Mission Statement: To produce a set of python libraries containing code shared by OpenStack projects. The APIs provided by these libraries should be high quality, stable, consistent, documented and generally applicable.
  20. 20. Oslo.concurrency https://docs.openstack.org/oslo.concurrency/latest/user/index.html ● Утилиты для синхронизации ● WatchDog для контроля внешних вызовов ● Синхронизация cross-service по namespace 20
  21. 21. Oslo.concurrency https://docs.openstack.org/oslo.concurrency/latest/user/index.html from oslo_concurrency import lockutils from oslo_concurrency import watchdog @lockutils.synchronized('not_thread_safe') def not_thread_safe(): pass with watchdog.watch(LOG, "subprocess call", logging.ERROR): subprocess.call("sleep 10", shell=True) print("done") 21
  22. 22. Oslo.log ● Свои formatter ● Свои handlers ● Логирует context ● Поддерживает oslo_config https://docs.openstack.org/oslo.log/latest/ 22
  23. 23. Oslo.log [handler_stdout] class = oslo_log.handlers.ColorHandler args = (sys.stdout,) formatter = context [formatter_context] class = oslo_log.formatters.ContextFormatter https://docs.openstack.org/oslo.log/latest/ 23
  24. 24. Oslo.log from oslo_context import context from oslo_log import log as logging LOG = logging.getLogger(__name__) context.RequestContext( user='6ce90b4d', tenant='d6134462', domain='a6b9360e') LOG.debug("Oslo Logging") LOG.info("Oslo Logging") LOG.warning("Oslo Logging") LOG.error("Oslo Logging") LOG.critical("Oslo Logging") https://docs.openstack.org/oslo.log/latest/ 24
  25. 25. Oslo.log 2019-01-15 14:59:07,787.787 324 DEBUG __main__ [req-e356c9f4-cf3a-4739-a78d-5cae23aceb01 6ce90b4d d6134462 a6b9360e - -] Oslo Logging <module> ./check_oslo_log.py:24 2019-01-15 14:59:07,788.788 324 INFO __main__ [req-e356c9f4-cf3a-4739-a78d-5cae23aceb01 6ce90b4d d6134462 a6b9360e - -] Oslo Logging 2019-01-15 14:59:07,789.789 324 WARNING __main__ [req-e356c9f4-cf3a-4739-a78d-5cae23aceb01 6ce90b4d d6134462 a6b9360e - -] Oslo Logging 2019-01-15 14:59:07,790.790 324 ERROR __main__ [req-e356c9f4-cf3a-4739-a78d-5cae23aceb01 6ce90b4d d6134462 a6b9360e - -] Oslo Logging 2019-01-15 14:59:07,790.790 324 CRITICAL __main__ [req-e356c9f4-cf3a-4739-a78d-5cae23aceb01 6ce90b4d d6134462 a6b9360e - -] Oslo Logging https://docs.openstack.org/oslo.log/latest/ 25
  26. 26. Oslo.messaging ● RabbitDriver ● ProtonDriver ● KafkaDriver class TestClient(object): def __init__(self, transport): target = oslo_messaging.Target( topic='test-topic', version='2.0') self._client = oslo_messaging.RPCClient( transport, target) def do_something(self, ctxt, arg): return self._client.call( ctxt, 'do_something', arg=arg) https://docs.openstack.org/oslo.messaging/latest/ 26
  27. 27. Oslo.messaging class TestEndpoint(object): def do_something(self, ctx, arg): return arg transport = oslo_messaging.get_rpc_transport(cfg.CONF) target = oslo_messaging.Target( topic='test-topic', server='server1', version='2.0') endpoints = [TestEndpoint()] server = oslo_messaging.get_rpc_server( transport, target, endpoints, executor='eventlet') https://docs.openstack.org/oslo.messaging/latest/ 27
  28. 28. Oslo.policy from oslo_policy import policy from oslo_config import cfg enforcer = policy.Enforcer( cfg.CONF, policy_file="policy.json") base_rules = [ policy.RuleDefault('admin_required', 'role:admin'), policy.RuleDefault('service_role', 'role:service'), ] enforcer.register_defaults(base_rules) https://docs.openstack.org/oslo.policy/latest/ ● учитывает context ● учитывает тело запроса ● учитывает тело ответа ● policy хранятся в файле ● поддерживается reload файла с policy 28
  29. 29. Oslo.policy # Add policy enforcer.register_default( policy.DocumentedRuleDefault( name='service:create_foo', check_str='role:admin', scope_types=['project'], operations=[ { 'path': '/v1/foo/', 'method': 'POST' } ] ) ) https://docs.openstack.org/oslo.policy/latest/ 29
  30. 30. Oslo.service и Cotyledon https://docs.openstack.org/oslo.service/latest/ https://github.com/sileht/cotyledon ● Запуск нескольких процессов/потоков ● Обработчики сигналов ● API для child- и parent-процессов ● Запуск периодических задач 30
  31. 31. Oslo.service и Cotyledon from oslo.service import service class MyService(service.Service): def __init__(self, conf): self.master_pid = os.getpid() self.queue = multiprocessing.Queue() def start(self): pass def stop(self): pass def restart(self): pass https://docs.openstack.org/oslo.service/latest/ https://github.com/sileht/cotyledon 31
  32. 32. Oslo.service и Cotyledon https://docs.openstack.org/oslo.service/latest/ https://github.com/sileht/cotyledon service = MyService(conf) launcher = service.launch( conf, service, workers=2, restart_method='reload') launcher.launch_service( MyOtherService(), worker=conf.other_workers) launcher.wait() 32
  33. 33. Oslo.report (Guru Meditation report) https://docs.openstack.org/oslo.reports/latest/user/usage.html from oslo_reports import guru_meditation_report as gmr gmr.TextGuruMeditation.setup_autorun(version='13.0.0') # kill -SIGUSR2 <process_id> ● показывает текущую конфигурацию (oslo_config) ● показывает threads и текущую точку выполнения ● показывает green threads (eventlet) и текущую точку выполнения ● Показывает процессы и их статусы 33
  34. 34. OsProfiler https://docs.openstack.org/osprofiler/latest/user/api.html ● кросс-сервисное профилирование ● минимальное изменение исходного кода ● возможность полностью выключить ● возможность включить в продакшне без потери производительности 34
  35. 35. OsProfiler https://docs.openstack.org/osprofiler/latest/user/api.html from osprofiler import profiler def some_func(): profiler.start("point_name", {"any_key": "with_any_value"}) # your code profiler.stop({"any_info_about_point": "in_this_dict"}) # OR @profiler.trace("point_name", info={"any_info_about_point": "in_this_dict"}, hide_args=False) def some_func2(*args, **kwargs): pass 35
  36. 36. OsProfiler https://docs.openstack.org/osprofiler/latest/user/api.html $ openstack --os-profile SECRET_KEY baremetal node list Trace ID: c900bc0-8355-4602-9128-26bba5c5774f $ osprofiler trace show --html c900bc0-8355-4602-9128- 26bba5c5774f --out trace.html 36
  37. 37. OsProfiler https://docs.openstack.org/osprofiler/latest/user/api.html 37
  38. 38. OsProfiler https://docs.openstack.org/osprofiler/latest/user/api.html 38
  39. 39. Аналоги OsProfiler ● Zipkin (http://zipkin.io/) ● Dapper (https://ai.google/research/pubs/pub36356) ● Jaeger (https://www.jaegertracing.io/) ● OpenTracing (https://opentracing.io/) 39
  40. 40. Stevedore https://docs.openstack.org/stevedore/latest/user/patterns_loading.html Driver Hook Extensions 40
  41. 41. Stevedore – API драйвера https://docs.openstack.org/stevedore/latest/user/tutorial/loading.html # my_app/drivers/base_api.py import abc import six @six.add_metaclass(abc.ABCMeta) class DriverBase(object): @abc.abstractmethod def format(self, data): pass 41
  42. 42. Stevedore – Код драйвера и алиас https://docs.openstack.org/stevedore/latest/user/tutorial/loading.html from my_app.drivers import base_api class TestDriver(base_api.DriverBase): def format(self, data): pass setup( entry_points={'my_app.drivers': [ 'test_driver = my_app.drivers.test_driver:TestDriver']} Drive r setup.py 42
  43. 43. Stevedore – Использование драйвера https://docs.openstack.org/stevedore/latest/user/tutorial/loading.html # use_driver.py from stevedore import driver mgr = driver.DriverManager( namespace='my_app.drivers', name='test_driver', invoke_on_load=True, ) print(mgr.driver.format({})) 43 # my_app.egg-info/entry_points.txt [my_app.drivers] test_driver = my_app.drivers.test_driver:TestDriver
  44. 44. Taskflow – Flow-Based programming 44 ● описывает декларативные процессы ● ведет контроль состояния выполнения (контрольные точки) ● переносит данные между несколькими workflow / task ● горизонтально масштабируется ● поддерживает удаленное выполнение ● поддерживает версионирование flow и task https://docs.openstack.org/taskflow/latest/user/index.html
  45. 45. Taskflow – Flow-Based programming 45 https://docs.openstack.org/taskflow/latest/user/index.html
  46. 46. Taskflow – Flow-Based programming 46 https://docs.openstack.org/taskflow/latest/user/index.html
  47. 47. Q&A 47 ● velizarx@gmail.com ● https://t.me/velizarx ● https://www.linkedin.com/in/vadim-ponomarev-53671538/

Notas do Editor

  • Это система для построения облачной инфраструктуры и управления пулами различных ресурсов: compute (виртуальные машины, контейнеры, bare-metal), storage, сетевыми ресурсами. Система позволяет управлять тысячами серверов как единым облаком, даже если эти сервера находятся в разных дата-центрах.
  • Openstack - это совместный проект начатый компаниями Rackspace и NASA в 2006 году. Первый релиз состоялся в 2010. В 2012 году была создана некоммерческая организация Openstack Foundation для развития проекта и его комьюнити. В настоящий момент более 600 компаний занимаются его разработкой, комьюнити насчитывает более 15000 разработчиков.
  • Основная миссия проекта: Создать облачную Open Source платформу которая будет соответствовать всем требованиям публичных и частных облаков вне зависимости от их размера.
  • Проект состоит из множества компонент. Каждый компонент - это отдельный репозиторий на github, со своей командой, со своей roadmap, core разработчиками, со своими правилами разработки, митингами и прочим. Каждый компонент выполняет определенную задачу. Например базовый-компонент Nova занимается всем что связано с compute ресурсами, то есть запускает виртуальные машины, управляет их настройками, миграциями и т.д. Другой базовый компонент Neutron занимается всем что связано с сетью: создает сети, адреса и управляет ими. В настоящий момент таких отдельных компонент-проектов больше 70.
  • Каждый компонент в свою очередь состоит из нескольких микросервисов и демонов запускаемых на разных серверах облака. Одни микросервисы выполняют роль REST API серверов, другие - worker-ы выполняют задания, третьи занимаются мониторингом, четвертые сбором мусора и освобождением ресурсов. В каждом отдельном компоненте количество таких микросервисов может достигать 20ти штук.
  • Также в сообществе Openstack принято давать каждому компоненту маскот - какое нибудь животное. Полный список можно найти по ссылке.
  • Микросервисная архитектура и четкое разделение функциональности на компоненты позволяет на базе OpenStack строить различные сервисы собирая их как конструктор. На базе OpenStack можно построить инфраструктуру для целой компании-провайдера причем услуги предоставляемые провайдером могут сильно отличаться друг от друга.
  • Среди таких компаний - пользователей OpenStack множество крупных знаменитых компаний из различных областей.
  • Сейчас опенстек это почти 1000 репозиториев с кодом на Python и множество дополнительных инструментов, от средств аркистрации в готовом репозитории ansible до собственного CI “Zuul” заточенного под тестирование OpenStack.
  • Для сбора статистики по вкладу в разработку такого большого проекта OpenStack комьюнити написало отдельный проект в котором ведется подсчет всего связанного с разработкой, от ревью кода одного человека до вклада каждой компании в целом в проект. На слайде диаграмма с этого сайта со статистикой вклада в проект по компаниям. Обратите внимание что 27 с небольшим процентов - это разработчики не привязанные к компании, то есть свободные разработчики.
  • Это статистика по количеству строк кода от отдельных разработчиков. В топе очень преданные делу разработчики :)
  • OpenStack с первых дней разрабатывался как Open Source проект и процесс разработки в комьюнити отлажен как часы. Есть документации которая сможет ответить на все вопросы разработчика. В документации можно найти информацию обо всем, как ревьюить код, как его писать, как работает CI и т.д.
    В проекте предъявляются высокие требования к качеству кода и его стабильности, поэтому все изменения проходят через систему ревью и массу тестов от запуска unit тестов до интеграционного тестирования в реальных дата-центрах.

  • Раз в пол года комьюнити формирует релиз (каждая команда каждого компонента формирует релиз с кодовым названием у себя). В дальнейшем до 18 месяцев ведется поддержка этого релиза с правками багов.
  • В каждом релизе замораживаются определенные версии не только самих компонент OpenStack но и версии библиотек с указанием максимальной версии каждой библиотеки которая может быть в этом релизе. Делается это с помощью файла upper-constraints.txt который также формируется под каждый релиз. Таким образом все компоненты работают на заранее обговоренных версиях библиотек, что гарантирует стабильность и дает возможность запустить все компоненты в одном пространстве на используя контейнеризацию или virutalenv.
    Кстати поддержка constraints file в pip была добавлена сообществом OpenStack.
    Два раза в год все core команды всех компонент собираются вместе на PTG (Project Team Getherings) для обсуждения целей на следующий релиз.
  • При ревью кода в комьюнити тоже свои стандарты. После пуша кода в gerrit происходит запуск тестов. Тесты могут занять несколько дней, так как иногда полностью разворачивается маленький OpenStack. После того как тесты пройдены в ченж добавляются ревьюеры. Core-reviewer может поставить +2 тем самым разрешив мержить, обычные же разработчики комьюнити могут поставить только +1 либо написать комментарии и поставить -1.
  • Для разработки такой сложной микросервисной системы как OpenStack нужно хорошо понимать как компоненты связаны между собой и уметь тестировать эти связи. Но для этого надо установить весь OpenStack. Для упрощения жизни разработчикам комьюнити создало проект devstack который позволяет запуститься OpenStack у себя локально на компьютере и начать разработку.
  • Комьюнити поддерживает 35 собственных библиотек которые объединены общим названием oslo. ОСновная цель создания библиотеки как всегда: избежать копи-паста в проектах и вынести все в отдельные модули.
  • Библиотека предоставляет несколько инструментов для написания безопасных многопоточных и многопроцессорных приложений. Например декораторы для синхронизации или вотчдог для контроля вызова подпроцессов или выполнения длительных операций.
  • Библиотека реализована так что необходимую функциональность можно получить в одну строку.
  • Библиотека предоставляет обертку над стандартной библиотекой логирования с теми же интерфейсами, а также несколько дополнительных хендлеров, нативную поддержку контекста openstack и авторизационных данных при логировании.
  • В примере на слайде показано как двумя строками можно включить логирование с подсветкой, для этого используются хендлер и формартер из библиотеки.
  • Так как библиотека имеет нативную поддержку контекста OpenStack что очень помогает для поиска проблем на проде.
  • В результате в логе будет что-то такое.
  • Библиотека предоставляет два API: первое клиент-сервер RPC (oslo.messaging.rpc), второе API для генерации и получения нотификаций (oslo.messaging.notify). В обоих случаях библиотека предоставляет простой интерфейс, обработчик ошибок, поддержку версий, поддержку нескольких backend шин для передачи сообщений. На слайде пример RPC клиента
  • А так будет выглядеть сервер, то есть исполнитель RPC запросов для этих сообщений. Несколько строк которые позволяют получить сообщение из RabbitMQ например и запустить исполнение.
  • Библиотека предоставляет инструмент для управления политиками доступа на уровне API или определенных методов в коде. Обладает очень большой гибкостью, можно настраивать политики по ролям, по параметрам контекста, по отдельным полям данных и т.д. Позволяет хранить политики в виде JSON файла и обновлять их на лету.
  • Это пример инициализации дефолтных политик для одного эндпоинта API.
  • Библиотеки для создания сервисов работающих длительное время в системе. Позволяет запускать многопоточные и многопроцессорные сервисы, обрабатывать системные сигналы, делать graceful restart, запускать периодические задачи. Библиотека Cotyledon была написана также сообществом openstack но менее заточена под работу только с Openstack.
  • На слайде шаблон для создания сервиса, который имеет очередь обработчиков.
  • Так выглядит запуск этого сервиса.
  • Библиотека для отладки многопоточных сервисов которые запущены длительное время. Позволяет без перезагрузки сервиса получить отчет в котором будет информация о текущем конфиге, запущенных потоках и процессах с указанием их точки выполнения. Эта библиотека помогает проводить отладку основных сервисов OpenStack в которых как правило больше 10 запущенных процессов.
  • Библиотека позволяет выполнять кросс-сервисное профилирование, что очень важно когда в проекте несколько сотен отдельно работающих микросервисов. Во всех базовых сервисах OpenStack точки профилирования уже есть, но также их можно добавить в любой место добавлением нескольких строк.
  • Апи библиотеки позволяет строить точку получения информации для профайлера в любое место парой строк.
  • После чего профилирование можно запускать как часть CLI команды OpenStack.
  • В итоге будет сформирована такая карта вызовов, в которой видно какой сервис участвовал в выполнении задачи, сколько это заняло времени.
  • Также можно посмотреть детали каждой отдельной части. Эта детальная информация как раз может содержать любую вашу информацию из точки профилирования.
  • Существуют аналоги OsProfiler но не заточенные под OpenStack. Все они позволяет производить подобное профилирование в микросервисной системе,
  • Эта библиотека была разработана комьюнити OpenStack но не заточена под него и может быть использована в любом проекте. Библиотека позволяет создавать модульные приложения с различными типами расширений. Библиотека предоставляет три типа расширений:
    Driver - представляет из себя основную функциональность которая может быть включена. Основной момент: только один драйвер может быть включен в один момент в одном неймспейсе.
    Extension - или по другому плагины - функциональность которая работает параллельно в одном приложении в одном месте, но выполняет разные задачи
    Hook - функциональность которая выполняется при получении определенного события
  • Пример создания драйвера для приложения. По шагам: описываем API драйвера обозначая основные методы и что должны передать туда.
  • пишем сам драйвер который соответсвует созданному ранее интерфейсу и создаем alias для драйвера в entry_points
  • После установки пакета этот драйвер будет доступен для любого приложения на Python нужно только знать namespace и alias драйвера. Таким образом приложения и сервисы написанные с использованием stevedore могут быть расширены сторонними программистами без изменения основного кода. Библиотека Stevedore используется практически во всех сервисах OpenStack.
  • Библиотека требует в зависимостях oslo_utils и oslo_serialization, но не привязана к OpenStack и активно используется в других проектах. Библиотека позволяет создавать декларативные workflow с контролем состояния выполнения каждого отдельного таска а также возможностью отката изменений если один из тасков сфейлился. Также есть поддержка удаленного запуска отдельных задач.
  • Библиотека используется при выполнении длительных и сложных операций, как правило с взаимодействием между различными сервисами. Один такой flow может выполняться несколько десятков минут и важно достигнуть необходимого результата, при этом если что-то пошло не так, все выполненные ранее шаги будут откатываться к первоначальному состоянию, что обеспечивает консистентность данных.
  • Также средствами самой библиотеки можно генерировать график flow. Это не график предыдущей схемы, а пример флоу из документации но думаю суть ясна.
  • Подключайтесь к разработке OpenStack и станьте частью большого комьюнити. Если возникнут проблемы со стартом, всегда можете написать мне, я расскажу с чего начать и как. Вопросы.

×