Блог Amazon Web Services

AWS Fargate для Amazon EKS теперь поддерживает Amazon EFS

Оригинал статьи: ссылка (Harunobu Kameda, Sr. Developer Advocate)

AWS Fargate – это сервис, предоставляющий бессерверные (serverless) вычислительные ресурсы для контейнеров, доступный как для Amazon Elastic Kubernetes Service (EKS), так и для Amazon Elastic Container Service (ECS). С помощью Fargate разработчики могут сосредоточиться на разработке приложений, вместо того чтобы тратить время и усилия на управление инфраструктурой.

Разработчики определяют ресурсы для каждого пода (pod) Kubernetes и оплачивают только предоставленные вычислительные ресурсы. При использовании Fargate каждый под EKS работает в своей собственной среде выполнения, а процессор, память, дисковые и сетевые ресурсы никогда не используются совместно с другими подами, что обеспечивает изоляцию и повышенную безопасность рабочей нагрузки.

Контейнеры эфемерны по своей природе. Они динамически запускаются и удаляются, а их состояние и данные удаляются в момент завершения работы. С момента запуска поддержки Fargate для EKS в 2019 году наши клиенты неоднократно обращались к нам с просьбами о поддержке сохранения состояния и возможности совместного хранения данных для приложений, запускаемых в контейнерах, и в апреле 2020 года мы объявили о поддержке Amazon Elastic File System (EFS) в Fargate для ECS. В настоящее время, многие клиенты запускают в нём рабочие нагрузки с сохранением состояния (stateful workloads), при этом мы также получали просьбы о поддержке EFS в Fargate для EKS. Поэтому, мы рады объявить о выпуске такой функциональности.

Amazon EFS – это простая, масштабируемая и полностью управляемая совместно используемая файловая система для использования с облачными сервисами AWS. Она позволяет обеспечивать высокую доступность приложений Kubernetes, так как все данные, сохраненные в EFS, реплицируются в несколько зон доступности AWS (Availability Zones или AZs). EFS разработана для хранения петабайтов данных, и она автоматически масштабируется по мере добавления и удаления файлов без необходимости прерывания работы приложений. Благодаря этому, не нужно создавать инфраструктуру хранения данных, а также расширять и управлять ею при росте их объемов. EFS также отлично подходит для критических с точки зрения безопасности рабочих нагрузок, так как поддерживает шифрование данных, сохранённых на файловой системе, а также данных при передаче.

Kubernetes поддерживает «Container Storage Interface (CSI)«, который является стандартом для подключения блочных и файловых систем хранения к контейнерным рабочим нагрузкам. Драйвер EFS CSI упрощает настройку эластичного файлового хранилища для кластеров Kubernetes, и до этого обновления пользователи могли использовать EFS через рабочие узлы кластеров Kubernetes на базе Amazon EC2. Теперь клиенты могут настроить свои поды, запущенные на Fargate, для доступа к файловой системе EFS, используя стандартные API Kubernetes. Благодаря этому обновлению, пользователи могут запускать рабочие нагрузки с сохраненным состоянием, требующие высокодоступных файловых систем, а также рабочие нагрузки, требующие доступа к общему хранилищу. При использовании драйвера EFS CSI все передаваемые данные шифруются по умолчанию.

В июле 2020 года мы выпустили общедоступную версию драйвера Amazon EFS CSI для EKS. Драйвер Amazon EFS CSI облегчает настройку эластичного файлового хранилища как для EKS, так и для самостоятельно развёрнутых кластеров Kubernetes, работающих на AWS, с использованием стандартных интерфейсов Kubernetes. Если под Kubernetes останавливается и перезапускается, CSI драйвер снова подключает файловую систему EFS, даже если под перезапустился в другой зоне доступности AWS. При использовании рабочих узлов на базе EC2, драйвер EFS CSI должен быть развернут в виде набора подов и DaemonSet. С этим обновлением, для Fargate такой шаг больше не требуется, и вам не нужно устанавливать EFS CSI драйвер, так как он уже включён в стек Fargate, и поддержка EFS предоставляется из коробки. Теперь пользователи могут использовать EFS в Fargate для EKS, не тратя время и ресурсы на установку и обновление драйвера CSI.

Как настроить интеграцию Fargate/EKS и EFS?

Вам необходимо использовать три вида ресурсов Kubernetes, чтобы подключить EFS к Fargate для EKS. Это StorageClass, PersistentVolume (PV) и PersistentVolumeClaim (PVC). Настройка StorageClass и PVs – это шаги, которые должен сделать администратор (или кто-то другой с аналогичными правами доступа), чтобы предоставить доступ разработчикам приложений к файловым системам EFS. PVC используются для выделения PVs из пула существующих PVs по мере необходимости при развертывании приложений.

Объект StorageClass предоставляет администратору Kubernetes возможность зарегистрировать определенный тип системы хранения данных (например, EFS или EBS) и конфигурацию (например, пропускную способность, политику резервного копирования). После определения StorageClass, объект PV используется для создания реальных томов системы хранения данных этого класса. StorageClass и PV – это механизмы Kubernetes, которые позволяют абстрагироваться и отделять фактические системы хранения данных от того, как они используются пользователями Kubernetes. Например, в то время как администратор Kubernetes должен знать, как именно сконфигурировать конкретную систему хранения данных определённого типа, пользователи Kubernetes этого не делают, потому что работают со своими томами только в виде абстрактных типов систем хранения данных.

Последний шаг – binding: пользователи Kubernetes запрашивают доступ к определённым томам через объект PVC и связанное с ним API. Эти тома могут быть созданы динамически, когда пользователь запрашивает их через PVC, либо они должны быть предварительно созданы администратором для последующего использования пользователями Kubernetes. Текущая реализация драйвера EFS CSI требует предварительного создания томов для того, чтобы PVC bindings работали.

Если вы не знакомы с сохраняемыми томами Kubernetes и хотите узнать больше о том, как они работают, пожалуйста, ознакомьтесь с этой страницей в документации Kubernetes, которая содержит все подробности.

Давайте рассмотрим это в действии. Во-первых, вам необходимо создать собственную файловую систему EFS в том же регионе AWS, где развёрнут ваш кластер EKS. Если вы не знакомы с EFS, то это руководство по началу работы с EFS является подходящим ресурсом, с которого вы можете начать.

После создания файловой системы EFS вы получаете идентификатор файловой системы. Вы можете настроить параметры подключения с помощью Kubernetes StorageClass и PersistentVolume. Вот пример YAML-файлов:

Объект CSIDriver

apiVersion: storage.k8s.io/v1beta1
kind: CSIDriver
metadata:
  name: efs.csi.aws.com
spec:
  attachRequired: false

Сейчас вам нужно добавить объект EFS CSIDriver, показанный выше, в ваш кластер, чтобы Kubernetes мог обнаружить драйвер, который Fargate устанавливает автоматически. В будущем, этот манифест будет добавлен по умолчанию на кластеры EKS.

StorageClass

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com

PersistentVolume (PV)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: efs-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: efs-sc
  csi:
    driver: efs.csi.aws.com
    volumeHandle: <EFS filesystem ID>

Идентификатор файловой системы возвращается сервисом EFS, когда вы создаете файловую систему, и вам нужно использовать его для конфигурации параметра volumeHandle, чтобы настроить CSI драйвер для создания PV. Идентификатор файловой системы EFS можно получить из консоли управления AWS или с помощью следующей команды AWS CLI:

aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text

Теперь, когда вы создали PV, применив вышеупомянутый манифест, вы настраиваете поды Kurbenetes для доступа к файловой системе EFS, включив PersistentVolumeClaim в манифест пода. Ниже приведены два примера манифеста, которые позволяют это сделать:

PersistentVolumeClaim (PVC)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: efs-claim
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: efs-sc
  resources:
    requests:
      storage: 5Gi

Манифест пода

apiVersion: v1
kind: Pod
metadata:
  name: app1
spec:
  containers:
  - name: app1
    image: busybox
    command: ["/bin/sh"] args: ["-c", "while true; do echo $(date -u) >> /data/out1.txt; sleep 5; done"]
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: efs-claim

Обновление уже доступно

В настоящий момент, это обновление доступно для вновь созданных кластеров EKS с версией Kubernetes 1.17, и в ближайшие недели мы планируем развернуть поддержку этой функциональности с другими версиями Kubernetes на EKS. Это обновление доступно во всех регионах AWS, где доступен Fargate для EKS. Вы можете ознакомиться с нашей документацией для получения более подробной информации.