Привет, Хаброжители! Положитесь на опыт профессионалов, успешно применяющих и развивающих проект Kubernetes. Инженеры Microsoft предлагают лучшие приёмы оркестрации контейнеров. Их практики сложились в процессе разработки распределённых систем, на ответственных и нагруженных проектах. Вам останется лишь слегка адаптировать код. Книга идеально подойдет тем, кто уже знаком с Kubernetes, но ещё не умеет использовать его максимально эффективно. Вы узнаете всё, что необходимо для создания классного Kubernetes-приложения, в том числе: — Подготовка окружения и разработка приложений в Kubernetes. — Паттерны мониторинга и защиты ваших систем, управления обновлениями. — Сетевые политики Kubernetes и роли сервисных сетей в экосистеме. — Использование Kubernetes в задачах машинного обучения.
При работе в крупных, распределенных средах очень часто требуется некий механизм безопасности, предотвращающий несанкционированный доступ к ключевым системам. Существует множество стратегий по ограничению доступа к ресурсам в вычислительных системах, но большинство из них состоят из одних и тех же этапов. Чтобы объяснить более наглядно процесс, происходящий в таких системах, как Kubernetes, воспользуемся жизненной аналогией: полетом за рубеж. Мы будем применять знакомые любому путешественнику понятия например паспорт, туристическая виза и таможенный или пограничный контроль.
1. Паспорт (аутентификация субъекта). Обычно для подтверждения личности пассажиру нужен паспорт, выданный неким правительственным органом. Это эквивалент учетной записи пользователя в Kubernetes. Для аутентификации пользователей Kubernetes применяет внешние системы сертификации, хотя управление служебными учетными записями происходит напрямую.
2. Виза, или режим пересечения границы (авторизация). Краткосрочное пребывание в стране гражданина с иностранным паспортом регламентируется официальным соглашением между странами (визой). Визы бывают разных типов и определяют, что приезжему гражданину позволено делать и как долго он может находиться в этой стране. Это эквивалент авторизации в Kubernetes. Платформа поддерживает разные методы авторизации, но самый распространенный из них — RBAC. Он позволяет гибко управлять доступом к разным возможностям API.
3. Таможенный или пограничный контроль (контроль доступа). При въезде в чужую страну обычно приходится иметь дело с неким органом власти, представители которого проверяют документы, включая паспорт и визу. Кроме того, ввозимый багаж очень часто проверяется на соответствие законам данной страны. Это эквивалент контроллеров доступа в Kubernetes. Они могут принимать, отклонять и изменять запросы к API в зависимости от заданных правил и политик. Kubernetes предоставляет много встроенных контроллеров доступа, включая PodSecurity, ResourceQuota и ServiceAccount, и поддерживает динамический контроль доступа с помощью проверяющих (validating) и изменяющих (mutating) контроллеров (admission controllers).
Этот раздел посвящен наименее понятной и наиболее игнорируемой из перечисленных выше областей: RBAC. Прежде чем переходить к рекомендациям, следует познакомиться с основными понятиями данной системы.
Основные концепции RBAC
Процесс RBAC в Kubernetes состоит из трех главных компонентов, которые необходимо определить: субъекта, правила и привязки ролей.
Субъекты
Первый компонент — субъект — это то, что проверяется на возможность доступа. В качестве субъекта обычно выступает пользователь, служебная учетная запись или группа. Как уже упоминалось ранее, работа с пользователями, равно как и с группами, происходит за пределами Kubernetes, в одном из модулей авторизации. Эти модули поддерживают базовую HTTP-аутентификацию, клиентские сертификаты x.509 и токены (bearer tokens). Чаще всего применяются либо клиентские сертификаты x.509, либо некая разновидность токенов с использованием какой-нибудь системы OpenID Connect наподобие Azure Active Directory (Azure AD), Salesforce или Google.
Правила
Говоря простым языком, это фактический список действий, которые можно выполнять с определенным объектом (ресурсом) или группой объектов в API. Действия соответствуют стандартным операциям CRUD (Create, Read, Update, Delete — «создать, прочитать, обновить, удалить»), но с некоторыми дополнительными возможностями, характерными для Kubernetes: watch, list и exec. Объекты соответствуют разным API-компонентам и группируются по категориям. Pod-объекты, к примеру, являются частью основного API, и на них можно ссылаться с помощью поля apiGroup:""; в то же время объекты Deployment принадлежат к API-группам apps. Это самая сильная сторона процесса RBAC, которая, вероятно, отпугивает и запутывает пользователей, пытающихся налаживать контроль доступа.
Роли
Роли позволяют определить область действия заданных правил. Kubernetes поддерживает два вида ролей: role и clusterRole; разница в том, что role относится к отдельному пространству имен, тогда как clusterRole действует на уровне целого кластера, во всех пространствах сразу. Ниже показан пример определения роли, ограниченной одним пространством имен:
RoleBinding
RoleBinding позволяет привязывать субъекты, такие как пользователи или группы, к ролям. Привязка имеет два режима: roleBinding, который относится к отдельному пространству имен, и clusterRoleBinding, действующий на уровне всего кластера. Ниже представлен пример RoleBinding для пространства имен:
Рекомендации по работе с RBAC
RBAC — ключевой компонент в обеспечении безопасности, надежности и стабильности среды Kubernetes. Концепции, на которых основана эта система, могут показаться сложными, но часть основных трудностей можно преодолеть с помощью нескольких рекомендуемых методик.
— Приложения, разрабатываемые для работы в Kubernetes, редко нуждаются в ролях и привязках RBAC. Исключение составляют случаи, когда код приложения взаимодействует непосредственно с API Kubernetes.
— Если приложению в самом деле необходим прямой доступ к API Kubernetes (например, чтобы изменять конфигурацию в зависимости от того, какие конечные точки (endpoints) добавляются в сервис (Service)) или список всех pod в заданном пространстве имен, то лучше всего создать еще одну служебную учетную запись и указать ее в спецификации pod. Затем следует создать роль с минимальным набором привилегий, достаточным для выполнения поставленных перед ней задач.
— Используйте сервис OpenID Connect, поддерживающий идентификацию и при необходимости двухфакторную аутентификацию. Привязывайте группы пользователей к ролям с минимальным набором привилегий, достаточным для выполнения работы.
— Помимо упомянутых выше методик, следует также использовать системы доступа JIT (just in time — «со строгим ограничением по времени»), чтобы в систему могли войти инженеры по мониторингу (site reliability engineers, SRE), операторы и те, кому может понадобиться краткосрочное повышение привилегий в целях выполнения определенных задач. В качестве альтернативы для них можно выделять отдельные учетные записи с более строгим контролем и повышенными привилегиями, которые выдаются в виде роли, назначаемой пользователям или группе пользователей.
— Определенные служебные учетные записи должны использоваться для инструментов CI/CD, которые развертывают ваши кластеры Kubernetes. Это обеспечивает аудитоспособность в рамках кластера и позволяет понять, кто ответственен за развертывание или удаление каких-либо объектов.
— Если вы развертываете приложения с помощью Helm, то стандартная служебная учетная запись, Tiller, развертывается в kube-system. Вместо этого Tiller лучше развернуть в каждом пространстве имен, используя специально созданную служебную учетную запись, ограниченную этим конкретным пространством. В инструменте CI/CD, который на подготовительном этапе вызывает команду Helm install/upgrade, инициализируйте клиент Helm с помощью служебной учетной записи и пространства имен, предназначенного для развертывания. Имя данной записи может быть одним и тем же для каждого пространства, но пространство для развертывания следует указать отдельно. Необходимо упомянуть, что на момент выхода этой книги Helm версии 3 находится в состоянии alpha и одной из его ключевых особенностей является то, что присутствие Tiller в кластере больше не требуется. Ниже показан пример процедуры инициализации Helm с помощью служебной учетной записи (ServiceAccount) и пространства имен:
— Ограничивайте доступ для любых приложений, которым нужно выполнять действия watch и list с API Secrets. Эти действия, в сущности, позволяют приложению или человеку, развернувшему pod, просматривать секретные данные в соответствующем пространстве имен. Если приложение использует этот API для доступа к конкретным объектам Secret, то позвольте ему выполнять действие get только для этих объектов (в дополнение к секретным данным, которые назначены ему напрямую).
Об авторах
Брендан Бернс — известный инженер Microsoft Azure и соучредитель открытого проекта Kubernetes. Занимается созданием облачных приложений уже больше десяти лет.
Эдди Вильяльба работает программистом в отделе разработки коммерческого ПО компании Microsoft, занимаясь развитием открытых облачных технологий и Kubernetes. Многие пользователи могут быть благодарны за его помощь с внедрением Kubernetes в их приложения.
Дейв Штребель работает архитектором глобальных облачных систем в Microsoft Azure и занимается открытыми облачными технологиями и Kubernetes. Он принимает активное участие в открытом проекте Kubernetes, помогая с релизами новых версий и возглавляя группу SIG-Azure.
Лахлан Эвенсон — руководитель команды контейнерных вычислений в Microsoft Azure. Его практические уроки и выступления на конференциях помогли огромному количеству людей перейти на Kubernetes.
Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок
Для Хаброжителей скидка 25% по купону — Kubernetes
По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
Кому стоит прочесть эту книгу
Kubernetes — фактический стандарт для облачно-ориентированной разработки. Это эффективный инструмент, который может упростить создание ваших приложений, ускорить развертывание и сделать его более надежным. Но для раскрытия всего потенциала этой платформы нужно научиться ее корректно использовать. Книга предназначена для всех, кто развертывает реальные приложения в Kubernetes и заинтересован в изучении паттернов проектирования и методик, применимых к этим приложениям.
Важно понимать: это не введение в Kubernetes. Мы исходим из того, что вы уже имеете общее представление об API и инструментарии данной платформы и знаете, как создавать и администрировать кластеры на ее основе. Познакомиться с Kubernetes можно, в частности, прочитав книгу Kubernetes: Up and Running (O’Reilly) (https://oreil.ly/ziNRK).
Эта книга предназначена для читателей, желающих подробно изучить процесс развертывания конкретных приложений в Kubernetes. Она будет полезной как тем, кто собирается развернуть в Kubernetes свое первое приложение, так и специалистам с многолетним опытом использования данной платформы.
Важно понимать: это не введение в Kubernetes. Мы исходим из того, что вы уже имеете общее представление об API и инструментарии данной платформы и знаете, как создавать и администрировать кластеры на ее основе. Познакомиться с Kubernetes можно, в частности, прочитав книгу Kubernetes: Up and Running (O’Reilly) (https://oreil.ly/ziNRK).
Эта книга предназначена для читателей, желающих подробно изучить процесс развертывания конкретных приложений в Kubernetes. Она будет полезной как тем, кто собирается развернуть в Kubernetes свое первое приложение, так и специалистам с многолетним опытом использования данной платформы.
Структура книги
Эту книгу можно читать последовательно, от первой до последней страницы, однако на самом деле мы задумывали ее как набор независимых глав. В каждой главе дается полноценный обзор определенной задачи, выполнимой с помощью Kubernetes. Мы ожидаем, что вы углубитесь в материал, чтобы узнать о конкретной проблеме или интересующем вас вопросе, а затем будете периодически обращаться к книге при возникновении новых запросов.
Несмотря на столь четкое разделение, некоторые темы будут встречаться вам на протяжении всей книги. Разработке приложений в Kubernetes посвящено сразу несколько глав. Глава 2 описывает рабочий процесс. В главе 5 обсуждаются непрерывная интеграция и тестирование. В главе 15 речь идет о построении на основе Kubernetes высокоуровневых платформ, а в главе 16 рассматривается управление stateless- и stateful-приложениями. Управлению сервисами в Kubernetes также отводится несколько глав. Глава 1 посвящена подготовке простого сервиса, а глава 3 — мониторингу и метрикам. В главе 4 вы научитесь управлять конфигурацией, а в главе 6 — версиями и релизами. В главе 7 описывается процесс глобального развертывания приложения.
Другая обширная тема — работа с кластерами. Сюда относятся управление ресурсами (глава 8), сетевые возможности (глава 9), безопасность pod (глава 10), политики и управляемость (глава 11), управление несколькими кластерами (глава 12), а также контроль доступа и авторизацию (глава 17). Кроме того, есть полностью самостоятельные главы, посвященные машинному обучению (глава 14) и интеграции с внешними сервисами (глава 13).
Прежде чем браться за выполнение реальной задачи, не помешает прочесть соответствующие главы, хотя мы надеемся, что вы будете использовать эту книгу как справочник.
Несмотря на столь четкое разделение, некоторые темы будут встречаться вам на протяжении всей книги. Разработке приложений в Kubernetes посвящено сразу несколько глав. Глава 2 описывает рабочий процесс. В главе 5 обсуждаются непрерывная интеграция и тестирование. В главе 15 речь идет о построении на основе Kubernetes высокоуровневых платформ, а в главе 16 рассматривается управление stateless- и stateful-приложениями. Управлению сервисами в Kubernetes также отводится несколько глав. Глава 1 посвящена подготовке простого сервиса, а глава 3 — мониторингу и метрикам. В главе 4 вы научитесь управлять конфигурацией, а в главе 6 — версиями и релизами. В главе 7 описывается процесс глобального развертывания приложения.
Другая обширная тема — работа с кластерами. Сюда относятся управление ресурсами (глава 8), сетевые возможности (глава 9), безопасность pod (глава 10), политики и управляемость (глава 11), управление несколькими кластерами (глава 12), а также контроль доступа и авторизацию (глава 17). Кроме того, есть полностью самостоятельные главы, посвященные машинному обучению (глава 14) и интеграции с внешними сервисами (глава 13).
Прежде чем браться за выполнение реальной задачи, не помешает прочесть соответствующие главы, хотя мы надеемся, что вы будете использовать эту книгу как справочник.
RBAC
При работе в крупных, распределенных средах очень часто требуется некий механизм безопасности, предотвращающий несанкционированный доступ к ключевым системам. Существует множество стратегий по ограничению доступа к ресурсам в вычислительных системах, но большинство из них состоят из одних и тех же этапов. Чтобы объяснить более наглядно процесс, происходящий в таких системах, как Kubernetes, воспользуемся жизненной аналогией: полетом за рубеж. Мы будем применять знакомые любому путешественнику понятия например паспорт, туристическая виза и таможенный или пограничный контроль.
1. Паспорт (аутентификация субъекта). Обычно для подтверждения личности пассажиру нужен паспорт, выданный неким правительственным органом. Это эквивалент учетной записи пользователя в Kubernetes. Для аутентификации пользователей Kubernetes применяет внешние системы сертификации, хотя управление служебными учетными записями происходит напрямую.
2. Виза, или режим пересечения границы (авторизация). Краткосрочное пребывание в стране гражданина с иностранным паспортом регламентируется официальным соглашением между странами (визой). Визы бывают разных типов и определяют, что приезжему гражданину позволено делать и как долго он может находиться в этой стране. Это эквивалент авторизации в Kubernetes. Платформа поддерживает разные методы авторизации, но самый распространенный из них — RBAC. Он позволяет гибко управлять доступом к разным возможностям API.
3. Таможенный или пограничный контроль (контроль доступа). При въезде в чужую страну обычно приходится иметь дело с неким органом власти, представители которого проверяют документы, включая паспорт и визу. Кроме того, ввозимый багаж очень часто проверяется на соответствие законам данной страны. Это эквивалент контроллеров доступа в Kubernetes. Они могут принимать, отклонять и изменять запросы к API в зависимости от заданных правил и политик. Kubernetes предоставляет много встроенных контроллеров доступа, включая PodSecurity, ResourceQuota и ServiceAccount, и поддерживает динамический контроль доступа с помощью проверяющих (validating) и изменяющих (mutating) контроллеров (admission controllers).
Этот раздел посвящен наименее понятной и наиболее игнорируемой из перечисленных выше областей: RBAC. Прежде чем переходить к рекомендациям, следует познакомиться с основными понятиями данной системы.
Основные концепции RBAC
Процесс RBAC в Kubernetes состоит из трех главных компонентов, которые необходимо определить: субъекта, правила и привязки ролей.
Субъекты
Первый компонент — субъект — это то, что проверяется на возможность доступа. В качестве субъекта обычно выступает пользователь, служебная учетная запись или группа. Как уже упоминалось ранее, работа с пользователями, равно как и с группами, происходит за пределами Kubernetes, в одном из модулей авторизации. Эти модули поддерживают базовую HTTP-аутентификацию, клиентские сертификаты x.509 и токены (bearer tokens). Чаще всего применяются либо клиентские сертификаты x.509, либо некая разновидность токенов с использованием какой-нибудь системы OpenID Connect наподобие Azure Active Directory (Azure AD), Salesforce или Google.
Служебные учетные записи отличаются от пользовательских тем, что привязываются к пространствам имен, хранятся внутри Kubernetes и управляются стандартными контроллерами; они предназначены для доступа процессам, а не людям.
Правила
Говоря простым языком, это фактический список действий, которые можно выполнять с определенным объектом (ресурсом) или группой объектов в API. Действия соответствуют стандартным операциям CRUD (Create, Read, Update, Delete — «создать, прочитать, обновить, удалить»), но с некоторыми дополнительными возможностями, характерными для Kubernetes: watch, list и exec. Объекты соответствуют разным API-компонентам и группируются по категориям. Pod-объекты, к примеру, являются частью основного API, и на них можно ссылаться с помощью поля apiGroup:""; в то же время объекты Deployment принадлежат к API-группам apps. Это самая сильная сторона процесса RBAC, которая, вероятно, отпугивает и запутывает пользователей, пытающихся налаживать контроль доступа.
Роли
Роли позволяют определить область действия заданных правил. Kubernetes поддерживает два вида ролей: role и clusterRole; разница в том, что role относится к отдельному пространству имен, тогда как clusterRole действует на уровне целого кластера, во всех пространствах сразу. Ниже показан пример определения роли, ограниченной одним пространством имен:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: pod-viewer
rules:
- apiGroups: [""] # "" указывает на основную API-группу
resources: ["pods"]
verbs: ["get", "watch", "list"]
RoleBinding
RoleBinding позволяет привязывать субъекты, такие как пользователи или группы, к ролям. Привязка имеет два режима: roleBinding, который относится к отдельному пространству имен, и clusterRoleBinding, действующий на уровне всего кластера. Ниже представлен пример RoleBinding для пространства имен:
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: noc-helpdesk-view
namespace: default
subjects:
- kind: User
name: helpdeskuser@example.com
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role # здесь может быть только Role или ClusterRole
name: pod-viewer # должно совпадать с именем роли (Role или ClusterRole),
# к которой мы привязываемся
apiGroup: rbac.authorization.k8s.io
Рекомендации по работе с RBAC
RBAC — ключевой компонент в обеспечении безопасности, надежности и стабильности среды Kubernetes. Концепции, на которых основана эта система, могут показаться сложными, но часть основных трудностей можно преодолеть с помощью нескольких рекомендуемых методик.
— Приложения, разрабатываемые для работы в Kubernetes, редко нуждаются в ролях и привязках RBAC. Исключение составляют случаи, когда код приложения взаимодействует непосредственно с API Kubernetes.
— Если приложению в самом деле необходим прямой доступ к API Kubernetes (например, чтобы изменять конфигурацию в зависимости от того, какие конечные точки (endpoints) добавляются в сервис (Service)) или список всех pod в заданном пространстве имен, то лучше всего создать еще одну служебную учетную запись и указать ее в спецификации pod. Затем следует создать роль с минимальным набором привилегий, достаточным для выполнения поставленных перед ней задач.
— Используйте сервис OpenID Connect, поддерживающий идентификацию и при необходимости двухфакторную аутентификацию. Привязывайте группы пользователей к ролям с минимальным набором привилегий, достаточным для выполнения работы.
— Помимо упомянутых выше методик, следует также использовать системы доступа JIT (just in time — «со строгим ограничением по времени»), чтобы в систему могли войти инженеры по мониторингу (site reliability engineers, SRE), операторы и те, кому может понадобиться краткосрочное повышение привилегий в целях выполнения определенных задач. В качестве альтернативы для них можно выделять отдельные учетные записи с более строгим контролем и повышенными привилегиями, которые выдаются в виде роли, назначаемой пользователям или группе пользователей.
— Определенные служебные учетные записи должны использоваться для инструментов CI/CD, которые развертывают ваши кластеры Kubernetes. Это обеспечивает аудитоспособность в рамках кластера и позволяет понять, кто ответственен за развертывание или удаление каких-либо объектов.
— Если вы развертываете приложения с помощью Helm, то стандартная служебная учетная запись, Tiller, развертывается в kube-system. Вместо этого Tiller лучше развернуть в каждом пространстве имен, используя специально созданную служебную учетную запись, ограниченную этим конкретным пространством. В инструменте CI/CD, который на подготовительном этапе вызывает команду Helm install/upgrade, инициализируйте клиент Helm с помощью служебной учетной записи и пространства имен, предназначенного для развертывания. Имя данной записи может быть одним и тем же для каждого пространства, но пространство для развертывания следует указать отдельно. Необходимо упомянуть, что на момент выхода этой книги Helm версии 3 находится в состоянии alpha и одной из его ключевых особенностей является то, что присутствие Tiller в кластере больше не требуется. Ниже показан пример процедуры инициализации Helm с помощью служебной учетной записи (ServiceAccount) и пространства имен:
kubectl create namespace myapp-prod
kubectl create serviceaccount tiller --namespace myapp-prod
cat <<EOF | kubectl apply -f -
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: tiller
namespace: myapp-prod
rules:
- apiGroups: ["", "batch", "extensions", "apps"]
resources: ["*"]
verbs: ["*"]
EOF
cat <<EOF | kubectl apply -f -
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: tiller-binding
namespace: myapp-prod
subjects:
- kind: ServiceAccount
name: tiller
namespace: myapp-prod
roleRef:
kind: Role
name: tiller
apiGroup: rbac.authorization.k8s.io
EOF
helm init --service-account=tiller --tiller-namespace=myapp-prod
helm install ./myChart --name myApp --namespace myapp-prod
--set global.namespace=myapp-prod
Отдельные публичные Helm-чарты не содержат поля для выбора пространства имен, в котором следует развертывать компонент приложения. Вследствие этого может потребоваться ручное редактирование чарта или использование учетной записи Tiller с повышенными привилегиями, чтобы получить права на развертывание в любом пространстве имен, а также на создание новых пространств.
— Ограничивайте доступ для любых приложений, которым нужно выполнять действия watch и list с API Secrets. Эти действия, в сущности, позволяют приложению или человеку, развернувшему pod, просматривать секретные данные в соответствующем пространстве имен. Если приложение использует этот API для доступа к конкретным объектам Secret, то позвольте ему выполнять действие get только для этих объектов (в дополнение к секретным данным, которые назначены ему напрямую).
Об авторах
Брендан Бернс — известный инженер Microsoft Azure и соучредитель открытого проекта Kubernetes. Занимается созданием облачных приложений уже больше десяти лет.
Эдди Вильяльба работает программистом в отделе разработки коммерческого ПО компании Microsoft, занимаясь развитием открытых облачных технологий и Kubernetes. Многие пользователи могут быть благодарны за его помощь с внедрением Kubernetes в их приложения.
Дейв Штребель работает архитектором глобальных облачных систем в Microsoft Azure и занимается открытыми облачными технологиями и Kubernetes. Он принимает активное участие в открытом проекте Kubernetes, помогая с релизами новых версий и возглавляя группу SIG-Azure.
Лахлан Эвенсон — руководитель команды контейнерных вычислений в Microsoft Azure. Его практические уроки и выступления на конференциях помогли огромному количеству людей перейти на Kubernetes.
Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок
Для Хаброжителей скидка 25% по купону — Kubernetes
По факту оплаты бумажной версии книги на e-mail высылается электронная книга.