Освойте AWS за считанные минуты с помощью молниеносного практического экспресс-курса, где вы учитесь на практике.
Это часть 3 серии ускоренных курсов по Docker, Kubernetes, Terraform и AWS. Во второй части вы узнали, как запускать Kubernetes локально, что отлично подходит для обучения и тестирования. В этой статье вы узнаете основы AWS, в том числе как запустить Kubernetes в AWS для производственных задач, пройдя молниеносный экспресс-курс на практике. Этот курс предназначен для новичков, начиная с нуля, и выстраивает вашу ментальную модель шаг за шагом на простых примерах, которые вы запускаете на своем компьютере, чтобы сделать что-то полезное с помощью AWS — за считанные минуты. Если вы хотите углубить свои знания, в конце статьи также есть ссылки на более продвинутые материалы.
- Что такое AWS (версия за 60 секунд)
- Создание учетной записи AWS
- Развертывание виртуального сервера
- Развертывание кластера Kubernetes
- Развертывание приложений в кластере Kubernetes
- Рекомендуемая литература
- Заключение
Что такое AWS (версия за 60 секунд)
Amazon Web Services (AWS) — это облачная вычислительная платформа по требованию. Вместо того чтобы строить собственный центр обработки данных, что требует огромных затрат времени и средств (как первоначальных, так и текущих) на настройку серверов, сети, охлаждения и т. д., вы можете запустить свое программное обеспечение в облаке: то есть в одном из сотен центров обработки данных по всему миру, управляемых таким поставщиком публичного облака, как AWS.
Самый базовый способ использования AWS — аренда виртуальных серверов: всего в несколько кликов в консоли AWS вы можете запустить сервер Linux или Windows в Elastic Compute Cloud (EC2), подключиться к нему по сети (например, через SSH или RDP) и использовать этот сервер для запуска любого нужного вам программного обеспечения. Тем не менее, AWS выходит далеко за рамки простой замены серверов, предлагая также десятки сервисов более высокого уровня: например, вместо запуска собственного балансировщика нагрузки вы можете использовать Elastic Load Balancer; вместо создания собственных хранилищ данных вы можете использовать RDS, Redshift или ElastiCache; вместо создания собственных файловых хранилищ вы можете использовать S3, EBS или EFS; вместо написания собственных алгоритмов машинного обучения вы можете использовать Rekognition, Textract или Transcribe; вместо создания собственного кластера Kubernetes вы можете использовать EKS и так далее.
Все эти сервисы предлагают оплату по факту использования (pay-as-you-go). Например, EC2 позволяет арендовать виртуальные серверы всего за 0,0059 долл. в час; также существует щедрый бесплатный уровень (free tier). Более того, большинство сервисов являются эластичными, что означает возможность быстрого масштабирования вверх или вниз: например, при скачке трафика вы можете запустить сотни экземпляров EC2 всего за несколько минут; когда трафик спадает, вы можете уменьшить масштаб до горстки экземпляров, чтобы сэкономить деньги. Таким образом, AWS не только дешевле создания собственного дата-центра, но и мощные сервисы высокого уровня и эластичность позволяют вам выйти далеко за рамки того, что большинство компаний могут сделать в собственных дата-центрах.
AWS по праву считается лидером в облачных вычислениях: у них самая большая доля рынка, самое зрелое предложение (AWS был первым современным облачным провайдером), самое полное предложение (больше сервисов с большим количеством функций, чем у любого другого провайдера), самое безопасное предложение и самое большое сообщество. Так что ваше время, потраченное на изучение того, как этим пользоваться, окупится сполна. Давайте начнем!
Создание учетной записи AWS
Если у вас еще нет аккаунта AWS, перейдите на сайт https://aws.amazon.com и зарегистрируйтесь. При первой регистрации в AWS вы изначально входите в систему как корневой пользователь (root user). Эта учетная запись имеет права доступа абсолютно ко всему в аккаунте, поэтому с точки зрения безопасности использовать корневой пользователь для повседневных задач не рекомендуется. Фактически, единственное, для чего следует использовать корневой пользователь — это создание других учетных записей пользователей с более ограниченными правами, после чего нужно сразу же переключиться на одну из них.
Для создания учетной записи с более ограниченными правами вам потребуется использовать службу Identity and Access Management (IAM). IAM — это место, где вы управляете учетными записями пользователей, а также правами доступа для каждого пользователя. Чтобы создать нового пользователя IAM, перейдите в консоль IAM, нажмите «Users» (Пользователи), а затем кнопку «Add Users» (Добавить пользователей). Введите имя пользователя и убедитесь, что выбраны оба пункта: «Access key — Programmatic access» (Ключ доступа — Программный доступ) и «Password — AWS Management Console access» (Пароль — Доступ к консоли управления AWS) (обратите внимание, что AWS периодически вносит изменения в свою веб-консоль, поэтому то, что вы видите, может немного отличаться от скриншотов в этом блоге).
Нажмите кнопку «Next» (Далее). AWS попросит вас добавить разрешения для пользователя. По умолчанию новые пользователи IAM не имеют никаких разрешений и ничего не могут делать в аккаунте AWS. Чтобы дать вашему пользователю IAM возможность выполнять какие-либо действия, необходимо связать одну или несколько политик IAM (IAM Policies) с учетной записью этого пользователя. Политика IAM — это документ в формате JSON, определяющий, что пользователю разрешено или не разрешено делать. Вы можете создавать собственные политики IAM или использовать встроенные в ваш аккаунт предопределенные политики IAM, известные как управляемые политики (Managed Policies).
Чтобы запустить примеры из этой статьи блога, проще всего добавить управляемую политику AdministratorAccess вашему пользователю IAM (найдите ее и установите флажок рядом с ней):
Нажмите кнопку «Next» еще пару раз, а затем кнопку «Create user» (Создать пользователя). AWS покажет вам учетные данные безопасности для этого пользователя, которые включают в себя:
- Учетные данные веб-консоли: URL консоли, имя пользователя и пароль.
- Учетные данные командной строки: Идентификатор ключа доступа (Access Key ID), Секретный ключ доступа (Secret Access Key).
Вы должны сохранить их немедленно, так как они больше никогда не будут показаны, а оба набора учетных данных понадобятся вам позже в этом учебнике. Помните, что эти учетные данные предоставляют доступ к вашему аккаунту AWS, поэтому храните их в безопасном месте (например, в менеджере паролей, таком как 1Password, LastPass или macOS Keychain) и никогда никому их не передавайте.
Сохранив учетные данные, нажмите кнопку «Close» (Закрыть). Выйдите из своей учетной записи AWS в качестве корневого пользователя и войдите снова в качестве пользователя IAM, используя только что сохраненные URL-адрес консоли, имя пользователя и пароль.
Развертывание виртуального сервера
Чтобы познакомиться с AWS, давайте начнем с одного из самых популярных сервисов — EC2 — и используем его для запуска виртуального сервера.
Примечание о стоимости: Примеры в этой части учебника используют бесплатный уровень AWS (free tier), поэтому, если вы не исчерпали все свои кредиты и выполните очистку в соответствии с инструкциями, это не должно стоить вам ни цента.
Сначала перейдите в консоль EC2 и в правом верхнем углу выберите регион AWS Ohio (us-east-2) (это относительно новый регион, который удобен для этого учебника):
Затем создайте пару ключей (Key Pair), которая позволит вам подключаться по SSH к вашему виртуальному серверу. Перейдите на страницу Key Pairs в консоли EC2 и нажмите кнопку Create Key Pair:
Придумайте уникальное имя для пары ключей и нажмите Create Key Pair:
AWS сохранит открытый ключ (public key) и предложит вам сохранить закрытый ключ (private key): обязательно сохраните закрытый ключ в надежном месте на своем компьютере.
Затем перейдите на страницу экземпляров (instances) в консоли EC2 и нажмите кнопку Launch Instances:
На следующей странице настройте ваш экземпляр EC2 следующим образом (примечание: интерфейс консоли AWS недавно объединил весь этот контент на одной странице; если вы все еще используете старый интерфейс консоли, он может быть распределен по нескольким страницам):
Добавьте тег Name. Это полезно для того, чтобы с первого взгляда понимать, для чего используется данный сервер.
Выберите Ubuntu в качестве AMI. AMI (Amazon Machine Image) определяет операционную систему и другое программное обеспечение, которое будет установлено на вашем виртуальном сервере. Для этого руководства я рекомендую выбрать AMI Ubuntu от Canonical, которая бесплатна в использовании и предоставляет отличную операционную систему Linux для экспериментов:
Выберите t3.micro в качестве типа инстанса. Тип инстанса определяет процессор, объем памяти, сетевые возможности и другое (виртуализированное) аппаратное обеспечение, которое будет доступно на вашем сервере, а также стоимость использования этого сервера (подробнее см. на этой странице). Для этого руководства я рекомендую выбрать t2.micro, который входит в бесплатный уровень AWS (возможно, он уже выбран по умолчанию):
Выберите созданную ранее пару ключей (Key Pair). AWS добавит публичный ключ выбранной пары в файл known_hosts на вашем сервере, чтобы вы могли подключаться к нему по протоколу SSH с помощью своего приватного ключа:
Создайте группу безопасности, которая разрешает SSH-трафик. По умолчанию инстансы EC2 не разрешают никакой входящий или исходящий сетевой трафик. Группа безопасности — это брандмауэр, который управляет сетевым трафиком, проходящим в ваш сервер и из него. Для этого руководства я рекомендую создать новую группу безопасности для вашего сервера, которая разрешает входящий трафик на порт 22 (порт SSH по умолчанию) со всех IP-адресов (0.0.0.0/0 в нотации CIDR). Обратите внимание, что для производственных сценариев вам потребуется гораздо строже ограничить SSH-доступ, но для этого простого и недолгого учебного упражнения этого будет достаточно, и это позволит вам легко подключаться по SSH к вашему серверу со своего компьютера:
Оставьте все остальные настройки по умолчанию и нажмите Launch Instance. На следующей странице нажмите View All Instances, и вы увидите загрузку вашего нового сервера:
Дайте ему минуту или около того на загрузку, затем нажмите на галочку слева от сервера и нажмите кнопку Connect. Вы увидите инструкции по SSH:
Скопируйте пример команды, откройте терминал, перейдите в папку, где вы сохранили приватный ключ из вашей пары ключей, и выполните команду (обратите внимание, что если вы используете Windows, вам может потребоваться SSH-клиент, такой как PuTTY):
Ваш SSH-клиент сообщит вам, что не может установить подлинность хоста, и спросит, хотите ли вы продолжить. Введите yes, и вы увидите примерно следующее:
Итак, теперь вы подключены к виртуальному серверу, работающему в AWS! Попробуйте выполнить такие команды, как ls или tree, либо используйте apt-get install для установки и запуска любого нужного вам программного обеспечения (у вас есть права root под пользователем ubuntu).
Когда вы закончите экспериментировать с сервером, для очистки (и во избежание случайного выставления счета от AWS) вернитесь на страницу инстансов в консоли EC2, установите флажок слева от вашего инстанса, нажмите кнопку Instance State и выберите Terminate Instance:
Вот и все, теперь вы можете запустить и выключить виртуальный сервер в облаке за считанные минуты!
Развертывание кластера Kubernetes
Теперь вы увидели, как можно запустить базовые службы AWS всего несколькими кликами. Давайте теперь попробуем что-то более сложное и запустим кластер Kubernetes. Если вы не знакомы с Kubernetes, обязательно ознакомьтесь с частью 2 этой серии для получения базовых знаний. Самый простой способ запустить Kubernetes в AWS — использовать управляемый сервис Elastic Kubernetes Service (EKS) от Amazon. Давайте попробуем.
Примечание о стоимости: EKS не входит в бесплатный уровень AWS. Более того, рабочие узлы (worker nodes), которые вы развернете в этом руководстве, также не входят в бесплатный уровень AWS. Поэтому эта часть руководства может потребовать затрат, хотя и небольших: по состоянию на июль 2022 года EKS стоит 0,10 доллара в час, а два запускаемых в этом руководстве рабочих узла стоят около 0,01 доллара в час каждый, так что даже если вы запустите этот код на 4 часа, это обойдется вам менее чем в 50 центов.
Первый шаг — создание двух ролей IAM: одна для предоставления плоскости управления кластера Kubernetes разрешений на выполнение определенных вызовов API в вашей учетной записи AWS, а другая — для предоставления рабочим узлам кластера разрешений на выполнение другого набора вызовов API. Чтобы создать роль IAM для плоскости управления, перейдите на страницу ролей IAM и нажмите Create Role:
Выберите «Служба AWS» (AWS service) в качестве типа доверенной сущности, выберите «EKS» в качестве варианта использования в выпадающем списке, а затем выберите переключатель «EKS — Cluster»:
Пару раз нажмите кнопку Next, введите имя для этой роли IAM, например aws-learning-eks-cluster-role, и затем нажмите Create Role:
Теперь пройдите тот же процесс во второй раз, чтобы создать роль IAM для рабочих узлов. На этот раз выберите «Служба AWS» в качестве типа сущности и «EC2» в качестве варианта использования и нажмите Next:
На странице добавления разрешений (Add Permissions) вам потребуется добавить три политики:
- AmazonEKSWorkerNodePolicy
- AmazonEC2ContainerRegistryReadOnly
- AmazonEKS_CNI_Policy
Работа с этой страницей немного неудобна: вам нужно ввести каждое из этих имен политик в поле фильтра, нажать Enter, установить галочку слева от политики, затем нажать Clear Filters и повторить процесс для следующего имени политики. В итоге у вас должно быть выбрано 3 политики:
Нажмите Next, введите имя для этой роли IAM, например aws-learning-eks-nodes-role, и нажмите Create Role:
После создания этих двух ролей IAM вы можете перейти к использованию EKS для запуска полностью управляемой плоскости управления Kubernetes. Перейдите в консоль EKS, нажмите Add Cluster, а затем нажмите Create:
Введите имя кластера, например aws-learning, выберите созданную ранее роль IAM для плоскости управления (aws-learning-eks-cluster-role) в выпадающем списке Cluster Service Role и нажмите Next:
Оставьте настройки сети и логирования по умолчанию, нажав Next еще несколько раз, а затем нажмите кнопку Create для создания плоскости управления:
AWS может потребоваться от 5 до 10 минут на запуск плоскости управления, поэтому наберитесь терпения и дождитесь изменения статуса с Creating на Active.
Как только статус плоскости управления изменится на Active, следующим шагом будет развертывание рабочих узлов. EKS поддерживает несколько различных типов рабочих узлов: в этом руководстве вы будете использовать управляемую группу узлов (Managed Node Group), в которой AWS развертывает и управляет набором инстансов EC2 за вас. Перейдите на вкладку Compute и нажмите кнопку Add Node Group:
Введите имя группы узлов, например aws-learning, выберите роль IAM, созданную для рабочих узлов (aws-learning-eks-nodes-role), и нажмите Next:
На следующей странице выберите Amazon Linux 2 в качестве AMI, выберите t3.small в качестве типа инстанса и установите минимальный/максимальный/желаемый размер кластера равным двум (в идеале мы бы использовали t2.micro в качестве типа инстанса, так как он входит в бесплатный уровень AWS, но инстансы типа micro ограничены 4 сетевыми интерфейсами (ENI), все из которых будут заняты системными службами Kubernetes (например, kube-proxy), не оставляя ресурсов для фактического развертывания каких-либо подов, поэтому наименьшим типом инстанса, который работает с EKS, является t3.small):
Оставьте все остальные настройки (включая настройки сети) по умолчанию, нажмите Next несколько раз, а затем нажмите Create для создания группы узлов:
AWS может потребоваться 2–3 минуты на запуск рабочих узлов, поэтому наберитесь терпения и дождитесь изменения статуса с Creating на Active.
Когда статус изменится на Active, вы можете начать развертывание приложений в вашем кластере Kubernetes, как описано ниже.
Развертывание приложений в кластере Kubernetes
Давайте теперь развернем то же приложение «Hello, World» из части 2 этой серии в кластере EKS. Первый шаг — аутентифицировать kubectl для кластера EKS, а не для вашего локального кластера Kubernetes, запущенного в Docker Desktop.
Для этого сначала установите aws CLI. Затем вам нужно пройти аутентификацию в AWS из командной строки, используя сохраненные ранее учетные данные командной строки (Access Key ID, Secret Access Key). Один из самых простых способов сделать это — настроить эти учетные данные с помощью переменных окружения AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY (другие способы аутентификации в AWS из CLI см. здесь). Например, вот как это сделать в терминале Unix/Linux/macOS:
А вот как это сделать в командной строке Windows:
Примечание об аутентификации: Изначально EKS предоставляет доступ к кластеру EKS исключительно той IAM-сущности, которая его создала, и никому другому. Поэтому, когда вы только начинаете работать с кластером, вы должны пройти аутентификацию в командной строке от имени той же самой IAM-сущности*, которую вы использовали в консоли AWS Web Console (после аутентификации вы можете предоставить доступ другим пользователям): например, если при создании кластера EKS в консоли вы выполняли аутентификацию как IAM-пользователь, вы должны аутентифицироваться как тот же IAM-пользователь в командной строке; если вы использовали MFA в консоли, вы должны использовать MFA в командной строке; если вы использовали SSO в консоли, вы должны использовать SSO в командной строке и т. д. Если в способе аутентификации есть какие-либо отличия, приведенные ниже команды kubectl работать не будут, выдавая примерно такую ошибку:* error: You must be logged in to the server (Unauthorized).
Теперь вы можете использовать команду aws eks update-kubeconfig для автоматического обновления файла $HOME/.kube/config для аутентификации в вашем кластере EKS. Базовая форма команды выглядит следующим образом:
Где REGION — это регион AWS, в который вы выполняли развертывание, а EKS_CLUSTER_NAME — имя вашего кластера EKS. В начале руководства вы выбрали Огайо в качестве региона, который использует идентификатор us-east-2. Следовательно, для аутентификации в кластере EKS с именем aws-learning вы должны запустить:
Чтобы проверить, работает ли все, используйте команду get nodes для изучения вашего кластера EKS:
Если все работает, вы должны увидеть два рабочих узла (worker nodes), которые вы развернули в группе узлов.
Теперь вы можете использовать deployment.yml и service.yml из части 2 этой серии для развертывания приложения «Hello, World» в вашем кластере EKS:
Через несколько секунд используйте команду get deployments для проверки статуса развертывания:
Затем выполните get pods, чтобы посмотреть поды (Pods):
Как и ожидалось, запущены два пода. Запустите get services, чтобы посмотреть службу (Service):
Скопируйте значение EXTERNAL-IP для simple-webapp и протестируйте его с помощью curl или веб-браузера:
Вот и все! Ваше приложение в контейнере Docker работает в полностью управляемом кластере Kubernetes в AWS, а балансировщик нагрузки распределяет трафик между двумя репликами приложения.
Завершив эксперименты, обязательно очистите ресурсы, чтобы AWS не продолжала взимать плату за кластер EKS и рабочие узлы. Сначала удалите рабочие узлы: перейдите на вкладку Compute в кластере EKS, установите переключатель слева от группы узлов и нажмите кнопку Delete. После завершения этого процесса нажмите кнопку Delete Cluster в верхней части страницы:
Рекомендуемая литература
Этот интенсив дает лишь общее представление об AWS. Есть множество других вещей, которые стоит изучить: десятки других сервисов AWS (например, VPC, S3, ELB, RDS и т. д.), передовые практики AWS (например, Well Architected, CIS AWS Foundations Benchmark и т. д.), функции EKS, которые вам понадобятся для использования в producción (например, контроллеры ingress, шифрование секретов, группы безопасности, аутентификация OIDC, сопоставление RBAC, VPC CNI, kube-proxy, CoreDNS и т. д.) и многое другое. Если вы хотите углубить свои знания, вот несколько рекомендуемых ресурсов:
- Библиотека基础设施 как код Gruntwork (Infrastructure as Code Library): Готовые, коммерчески поддерживаемые и обслуживаемые модули для настройки сервисов AWS для production, включая модули промышленного уровня для EKS, EC2, ELB, RDS, VPC и многое другое.
- Продкшн-фреймворк Gruntwork (Production Framework): Четкий пошаговый фреймворк для успешного выхода в production в публичном облаке.
- Как построить сквозную архитектуру production-уровня в AWS (How to Build an End to End Production-Grade Architecture on AWS): Экскурсия по современной архитектуре production-уровня для AWS, включающей Kubernetes, AWS VPC, хранилища данных, CI/CD, управление секретами и многое другое.
- Обучение AWS (AWS Training): Учебные программы и сертификаты, созданные AWS.
- Курсы AWS на edX (AWS edX courses): Бесплатные онлайн-курсы от самой AWS.
- Открытое руководство по Amazon Web Services (The Open Guide to Amazon Web Services): Бесплатное руководство по AWS с открытым исходным кодом, созданное инженерами, которые используют AWS, и для них.
- Terraform: Up & Running. Большая часть материалов из этой серии публикаций взята из 3-го издания этой книги.
Заключение
Теперь вы увидели, как использовать AWS для развертывания экземпляров EC2 и даже кластера Kubernetes. Но все эти развертывания вы выполняли вручную, щелкая мышью по консоли AWS (ClickOps), что отлично подходит для обучения и тестирования, но имеет множество недостатков для production: это медленно, подвержено ошибкам и сложно воспроизводить, проверять или тестировать. Давайте перейдем к части 4 этой серии, где вы узнаете, как решить эти проблемы с помощью Terraform для развертывания и управления всей вашей инфраструктурой как кодом.
