Info
Content

8. Работа с контейнерами

Наименьшим развертываемым объектом в кластере Kubernetes являются pod-оболочки, а не контейнеры. Это означает, что все контейнеры в pod- оболочке всегда оказываются на одном компьютере

В качестве интересного упражнения можете сами создать контейнер, не используя такие среды выполнения, как Docker. В отличном докладе Лиз Райс под названием «Что же такое контейнер на самом деле?» (youtu.be/HPuvDm8IC-4) показано, как это делается с нуля в программе на Go.

У.контейнера.также.есть.точка входа.—.команда,.которая.запускается.при.старте.. Обычно. она. приводит. к. созданию. единого. процесса. для. выполнения. команды,. хотя. какие-то. приложения. запускают. несколько. вспомогательных. или. рабочих. подпроцессов..Для.запуска.больше.одного.отдельного.процесса.в.контейнере.нужно. написать.оберточный.скрипт,.который.будет.играть.роль.входной.точки,.запуская. нужные.вам.процессы.

В целом при проектировании pod-оболочек следует задаться вопросом: «Будут ли эти контейнеры работать корректно, если окажутся на разных компьютерах?» Если ответ отрицательный, контейнеры сгруппированы верно. Если ответ положительный, пра- вильным решением, скорее всего, будет разделить их на несколько pod-оболочек.

идентификатор.образа.состоит.из.четырех.разных.частей:.сетевого имени реестра, пространства имен репозитория, репозитория образа.и.тега.. Обязательным.является.лишь.имя.образа..Идентификатор.с.использованием.всех. этих.элементов.выглядит.так: docker.io/cloudnatived/demo:hello

Выбор. тегов. для. контейнера. зависит. лишь. от. вас.. Есть. несколько. популярных. вариантов: ‰‰теги.с.семантическими.версиями,.такие.как.v1.3.0..Обычно.указывают.на.вер- сию.приложения; ‰‰тег.на.основе.Git.SHA.вида.5ba6bfd.....Указывает.на.определенную.фиксацию. в.репозитории.исходного.кода,.которая.использовалась.при.сборке.контейнера. (см..подраздел.«Теги.на.основе.Git.SHA».на.с..320); ‰‰тег,.представляющий.среду,.такую.как.staging.или.production.

https://vsupalov.com/docker-latest-tag/

При развертывании контейнеров в промышленной среде следует избегать тега latest, поскольку это затрудняет отслеживание версий текущих образов и их откат

Если.мейнтейнер.решит. загрузить.в.репозиторий.другой.образ.с.тем.же.тегом,.при.вашем.следующем.раз- вертывании. вы. получите. его. обновленную. версию.. Говоря. техническим. языком,. теги.являются.недетерминистическими.

Иногда.желательно.иметь.детерминистические.развертывания,.то.есть.гарантиро- вать,.что.развертывание.всегда.ссылается.именно.на.тот.образ.контейнера,.который. вы.указали..Этого.можно.добиться.с.помощью.контрольной суммы.контейнера:. криптографического.хеша,.который.неизменно.идентифицирует.данный.образ.

Образы.могут.иметь.много.тегов,.но.только.одну.контрольную.сумму..Это.означает,. что.при.задании.в.манифесте.контейнера.контрольной.суммы.образа.вы.гаранти- руете.детерминистические.развертывания

этот хеш называют digest

Каждый. контейнер. может. предоставить. один. или. несколько. параметров. в. своей. спецификации: ‰‰resources.requests.cpu; ‰‰resources.requests.memory; ‰‰resources.limits.cpu; . ‰‰resources.limits.memory. Запросы.и.лимиты.указываются.для.отдельных.контейнеров,.но.обычно.мы.гово- рим.о.них.в.контексте.ресурсов.pod-оболочки..В.таком.случае.запрос.ресурсов.будет. суммой.всех.запросов.для.всех.контейнеров.этой.pod-оболочки.и.т..д

Поле.imagePullPolicy.в.специ- фикации. контейнера. определяет,. насколько. часто. Kubernetes. будет. это. делать.. Возможно.одно.из.трех.значений:.Always,.IfNotPresent.или.Never

Использование.переменных.среды.—.это.распространенный,.хотя.и.ограниченный. способ.передачи.информации.контейнеру.на.этапе.выполнения..Он.распространен. ввиду.того,.что.доступ.к.этим.переменным.имеют.все.исполняемые.файлы.в.Linux,. и.даже.программы,.написанные.задолго.до.появления.контейнеров,.могут.исполь- зовать.их.для.конфигурации..Ограниченность.способа.связана.с.тем,.что.перемен- ные. среды. могут. иметь. лишь. строковые. значения:. никаких. массивов,. словарей. или.любых.других.структурированных.данных..Кроме.того,.общий.размер.среды. процесса.не.может.превышать.32.КиБ,.поэтому.невозможно.передавать.через.него. большие.файлы.

Если.образ.контейнера.сам.указывает.переменные.среды.(например,.в.Dockerfile),. параметр.env,.принадлежащий.Kubernetes,.их.перезапишет..Это.может.пригодиться. для.изменения.конфигурации.контейнера.по.умолчанию.

На своем сервере вы ничего не запускаете от имени администратора (по крайней мере, это нежелательно). Точно так же ничто в вашем контейнере не должно ра- ботать с администраторскими привилегиями. Запуск двоичных файлов, созданных в других местах, требует значительного доверия. Это относится и к двоичным файлам внутри контейнеров.

Кроме. того,. взломщики. могут. воспользоваться. ошибкой. в. среде. выполнения. контейнера,.чтобы.выйти.за.его.пределы.и.получить.те.же.права.и.привилегии.на. основном.компьютере.

Для. максимальной. безопасности. каждый. контейнер. должен. иметь. отд.ельный. UID..Например,.если.он.каким-то.образом.будет.скомпрометирован.или.случайно. попытается.перезаписать.данные,.он.не.навредит.другим.контейнерам,.потому.что. имеет.доступ.только.к.своим.собственным.данным. Но.если.нужно,.чтобы.два.контейнера.или.более.могли.работать.с.одними.и.теми.же. данными.(например,.через.подключенный.том),.вы.должны.назначить.им.одина- ковые.UID.

Kubernetes.позволяет.блокировать.запуск. контейнеров,.которые.собираются.работать.от.имени.администратора. Для.этого.предусмотрен.параметр.runAsNonRoot:.true

Еще.одна.настройка,.полезная.с.точки.зрения.безопасности,.—.readOnlyRo.otFi- lesystem,. не. позволяющая. контейнеру. записывать. в. его. собственную. файловую. систему.. Вполне. возможно. представить. ситуацию,. когда. контейнер. пользуется. уязвимостью.в.Docker.или.Kubernetes,.вследствие.которой.могут.измениться.файлы. на.родительском.узле.через.запись.в.локальную.файловую.систему..Если.файловая. система.находится.в.режиме.«только.для.чтения»,.этого.не.произойдет,.потому.что. контейнер.получит.ошибку.ввода/вывода: containers:

  • name: demo image: cloudnatived/demo:hello securityContext: readOnlyRootFilesystem: true Многим. контейнерам. не. нужно. ничего. записывать. в. собственную. файловую. систему,. поэтому. подобная. конфигурация. не. помешает. их. работе.. Параметр. readOnlyRootFilesystem.рекомендуется.(kubernetes.io/blog/2016/08/security-best-practices- kubernetes-deployment).устанавливать.всегда,.если.только.контейнеру.действительно. не.нужно.производить.запись.в.файлы.

даже.если.он.работает.от. имени.обычного.пользователя.(с.UID.1000,.например),.но.в.нем.есть.исполняемый. файл.с.setuid,.этот.файл.может.по.умолчанию.получить.администраторские.при- вилегии. Чтобы.подобного.не.случилось,.присвойте.полю.allowPrivilegeEscalation.в.по- литике.безопасности.контейнера.значение.false: containers:

  • name: demo image: cloudnatived/demo:hello securityContext: allowPrivilegeEscalation: false Вы.можете.управлять.этой.настройкой.на.уровне.всего.кластера,.а.не.отдельного. контейнера.(см..подраздел.«Политики.безопасности.pod-оболочек».на.с..198). Современным.программам.в.Linux.не.нужен.бит.setuid,.они.могут.достичь.того.же.ре- зультата.с.помощью.более.гибкого.механизма.привилегий.под.названием.«мандаты»

Например,. веб-сервер,. который. прослушивает. порт. 80,. должен. выполняться. от. имени.администратора:.номера.портов.ниже.1024.считаются.системными.и.привиле- гированными..Вместо.этого.программе.может.быть.выдан.мандат.NET_BIND_SERVICE,. который.позволит.привязать.ее.к.любому.порту,.но.не.даст.никаких.других.особых. привилегий.

Контекст.безопасности.Kubernetes позволяет. убрать. любой. мандат. из. стандартного. набора. или. добавить. его. туда. в.случае.необходимости..Например: containers:

  • name: demo image: cloudnatived/demo:hello securityContext: capabilities: drop: ["CHOWN", "NET_RAW", "SETPCAP"] add: ["NET_ADMIN"] Контейнер.будет.лишен.мандатов.CHOWN,.NET_RAW.и.SETPCAP,.но.получит.мандат. NET_ADMIN.

Для.максимальной.безопасности.следует.убрать.любые.мандаты.для.контейнеров. и.затем.по.мере.необходимости.отдельно.их.выдавать: . containers:

  • name: demo image: cloudnatived/demo:hello securityContext: capabilities: drop: ["all"] add: ["NET_BIND_SERVICE"]

Вместо.того.чтобы.указывать.параметры.безопасности.для.каждой.отдельной.pod- оболочки. или. контейнера,. вы. можете. описать. их. на. уровне. кластера. с. помощью. ресурса.PodSecurityPolicy

PodSecurityPolicie.использовать.не.так.и.просто,.поскольку.вам.придется.самим. создавать.политики,.выдавать.им.доступ.к.нужным.служебным.учетным.записям. через.RBAC.и.включать.контроллер.доступа.PodSecurityPolicy.в.своем.кластере.. Но. если. у. вас. большая. инфраструктура. или. вы. не. контролируете. напрямую.конфигурацию.безопасности.отдельных.pod-оболочек,.PodSecurityPolicy.будет. хорошим.выбором

Если.по.каким-то. причинам. нужно. будет. выдать. дополнительные. права. (например,. доступ. к. pod- оболочкам.из.других.пространств.имен),.можно.создать.для.приложения.отдель- ную.служебную.учетную.запись,.привязать.ее.к.необходимым.ролям.и.прописать. в.конфигурации.pod-оболочки. Для.этого.укажите.в.поле.serviceAccountName.спецификации.pod-оболочк.и.имя. служебной.учетной.записи: apiVersion: v1 kind: Pod ... spec: serviceAccountName: deploy-tool

Некоторые примеры использования тома emptyDir:

область временных файлов;
контрольные точки во время длительных задач;
хранение данных, полученных сопроводительным контейнером и обслуживаемых контейнером приложения.

В случае сбоев контейнеров данные в томе emptyDir сохраняются. Но при перезапуске контейнеров сохранность данных в томе emptyDir не гарантируется. Если группа контейнеров останавливается, том emptyDir не сохраняется.

Максимальный размер тома emptyDir для Linux составляет 50 ГБ.

Чтобы.использовать.новое.хранилище,.контейнеру.не.нужно.делать.ничего.особен- ного:.все,.что.он.записывает.в.каталог./cache,.будет.попадать.в.том.и.становиться. доступным.для.других.контейнеров,.к.которым.этот.том.также.подключен..Все.кон- тейнеры,.подключившие.том,.могут.производить.с.ним.операции.чтения.и.записи.

No Comments
Back to top