Блог

  • Принципы Open Policy Agent. Практическое использование в Kubernetes

    Принципы Open Policy Agent. Практическое использование в Kubernetes

    Open Policy Agent (OPA) – что это такое и как использовать, знает достаточно мало специалистов, хотя это классный инструмент, чтобы иметь лучшую защиту и контроль за создаваемыми ресурсами. Поэтому в статье хотели бы поделиться как теорией, так и рассказать, как настраивать Open Policy Agent.

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

    Что такое Open Policy Agent

    Хотелось бы начать с объяснения, а что же за зверь такой – этот Open Policy Agent (OPA). Его задача достаточно утилитарна и проста – заставить пользователя выполнять политики, заложенные администратором. Политики могут быть любыми — бизнес, техническими, административными или какими вы их придумаете. Сам инструмент не ограничивает его использование никоим образом.

    Пример, который используют сами разработчики OPA: есть служащий банка, имеющий доступ к базе данных всех банковских аккаунтов, и мы хотим ограничить его возможность открывать детали аккаунтов. Так, чтобы он имел доступ только если есть открытый запрос от клиента, выполняемого этим сотрудником банка. Это не позволит неконтролируемо открывать аккаунты пользователей, даже учитывая, что у сотрудника есть доступ к базе всех аккаунтов. Соответственно это улучшает безопасность и снижает риски.

    То есть OPA регламентирует, как и когда тот или иной ресурс может запрашиваться. Как же это касается Kubernetes и вообще DevOps? Оказывается, можно так же регламентировать и развертывание в Kubernetes. Например, не позволяя создавать Deployment’ы, в image-поле в Pod’е которых указан репозиторий не из разрешенного списка. Схема работы самого сервиса достаточно проста: запрос через поступающий webhook перехватывается OPA запрос (должен быть обязательно в JSON), обрабатывается в соответствии с политикой и выдается решение — разрешить такой запрос или отклонить. Можно также указать причину отклонения запроса, чтобы дать больше информации о причине отказа.

    Схема работы OPA

    Есть три версии OPA, однако две из них уже устарели, и одна – текущая. В старых версиях OPA в качестве основного хранилища для политик использовались ConfigMap, в которой прописывались как сами политики, так и данные, из которых формируется ответ на запрос. Это было удобно использовать, но прогресс не стоит на месте. Поэтому в новой, третьей версии, от этой практики отошли в пользу более прогрессивной модели – Custom Resource Definition. В ней как тип ресурса выступает шаблон политики, а как сам ресурс — конкретные данные о политике, формирующих саму политику.

    Опыт реального использования

    OPA на практике я использовал для стартапа из blockchain NFT. Задача была внедрить стандарты по использованию общих ресурсов, в частности, Kubernetes кластера. Да, с ОРА у нас появилось больше контроля за ними.

    В целом, такие нововведения спокойно восприняли и другие команды по проекту. Но как раз во время внедрения ОРА вылезли проблемы, которые как раз не доходили руки починить из-за нехватки времени. Однако здесь уже не было другого выбора, кроме как фиксировать, потому что не смогли бы внедрить ОРА.

    Как установить и настроить OPA

    Установить OPA можно как с помощью helm chart’а, так и через манифесты. Лично я рекомендую использовать helm. Официальный chart доступен по  ссылке .

    Устанавливаем как обычный chart и не выделяем отдельный namespace под менеджер:

    kubectl create namespace gatekeeper-system

    После этого ставим сам chart:

    helm repo add opa https://open-policy-agent.github.io/gatekeeper/charts

    helm install gatekeeper opa/gatekeeper -n gatekeeper-system

    Самое главное в работе с OPA – это тонкая настройка политик. Они пишутся на специальном языке — rego. Сама речь – это набор правил и функций (для упрощения и пере использования) для определения запретов и разрешений. Вы можете сделать как разрешительные правила, так и запретительные. Проще всего использовать один тип правил по умолчанию (если не запрещено — разрешено или наоборот). К счастью, существует достаточно большая библиотека правил , написанных самими разработчиками OPA. Там достаточно исчерпывающий список политик, которые можно применить в том или ином случае. Если же вам необходимо создать какую-нибудь политику с нуля, а такой политики в библиотеке не нашлось, то вам придется узнать все прелести rego. И тут я советую сразу себе добавить закладку play.openpolicyagent.org для rego.

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

    Рассмотрим принцип установления политик. Любая политика будет состоять из шаблона – набора правил (на rego) и ресурса самой политики с переменными, на основании которых и будет определяться, как сама политика будет реагировать на конкретно ваш кластер и на ваши запросы к нам. То есть, когда вы пишете саму политику, вы будете отталкиваться от переменных, которые потом сможете задать, исходя из требований по проекту к конкретному кластеру.

    Разбираемся в политиках

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

    Из политик, которые мы использовали на проекте:

    • gatekeeper-library . Обязательство указывать лимиты CPU и памяти, а также можно установить свой максимальный лимит для этого.
    • allowedrepos . Указывает, из каких репозиториев можно брать docker image для кластера (в идеале, оставить только свой внутренний репозиторий, и все image брать именно из него).
    • requiredannotations . Обязывает иметь конкретные инструкции для ресурсов.
    • requiredlabels . То же, только для лейблов.
    • privileged-containers . Не дает запускать контейнеры в privileged mode (можно указать исключения).

    Указав только эти политики, достаточно серьезно можно улучшить безопасность вашего кластера.

    Выводы

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

  • Микро, мини и макросервисы. Что за чем стоит и что выбрать для проекта

    Микро, мини и макросервисы. Что за чем стоит и что выбрать для проекта

    Введение: появление минисервисов

    В сегодняшних реалиях все привыкли к тому, что есть всего два классических варианта архитектуры программы – монолит и микросервисы (пока вынесем за скобки serverless и т. д.). И, в основном, если речь идет о монолите, то о его миграции и переходе на микросервисный подход. И можно подумать, что наши архитектурные подходы живут в черно-белом мире, где есть только добро, зло и ничего другого. Но не все так просто, как кажется на первый взгляд.

    Потому как третья альтернатива появляется подход с использованием минисервисов.

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

    Разбираемся в типах сервисов

    Монолит (макросервис)

    Достоинства:

    • Простота. Монолитные архитектуры просты в создании, тестировании и развертывании. В основном масштабируется вертикально (путем увеличения количества RAM и CPU), ведь использование горизонтального масштабирования не целесообразно.
    • Сквозные проблемы (Cross-cutting concerns): с помощью единой кодовой базы монолитные программы могут легко справиться со сквозными проблемами (Cross-cutting concerns), такими как логирование, управление конфигурацией и мониторинг производительности.
    • Эффективность. Компоненты в монолите обычно совместно используют память (RAM), поэтому и взаимодействие между ними быстрее, чем связь между сервисами с помощью IPC или других механизмов.

    Недостатки:

    • Надежность. Ошибка в любом из модулей программы может привести к остановке всего приложения.
    • Обновление. Через единую большую кодовую базу и тесную связку, для каждого обновления нужно будет развертывать все приложение.
    • Стек технологий. Монолитное приложение должно использовать один и тот же технологический стек. Изменения в технологическом стеке стоят дорого, как с точки зрения времени, так и затрат.

    Микросервис

    Достоинства:

    • Возможность экспериментировать с разными технологиями: между модулями есть меньшие технологические зависимости. Откат к предыдущим итерациям менее сложен.
    • Малое связывание (Low coupling): компоненты микросервисов слабо связаны, поэтому они не взаимосвязаны и могут быть проверены отдельно. Это также делает приложение более адаптированным к изменениям с течением времени.
    • Улучшенная изоляция неисправностей (fault isolation): большие приложения продолжают работать в случае сбоя одного модуля.

    Недостатки:

    • Коммуникация между сервисами усложняется: поскольку каждый сервис является независимым, поэтому необходимо обращать внимание на варианты взаимодействий для service-to-service communication[2]. В одном из таких сценариев разработчики могут быть вынуждены писать дополнительный код во избежание сбоев.
    • Тестирование и мониторинг: как только вы разбиваете программы на независимые сервисы, у вас будет больше движущихся частей, которые нужно отслеживать и исправлять. Без надлежащих инструментов тестирования и мониторинга ситуация может быстро выйти из-под контроля.

    Минисервисы

    Достоинства:

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

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

    При этом следует учитывать, что все перечисленные преимущества немного проигрывают микросервисам.

    Недостатки:

    • Контроль интерфейсов еще более важен: каждый сервис имеет свой собственный API, на который приложения полагаются, чтобы быть последовательными. Хотя вы можете легко вносить изменения в сервис, не влияя на внешние системы, взаимодействующие с ней, если вы измените API (интерфейс), любое приложение, использующее этот микросервис, будет поражено, если изменение не будет обратно совместимым.
    • Предварительные затраты могут быть выше: чтобы архитектура работала в вашей организации, вам нужна достаточная инфраструктура хостинга с поддержкой безопасности и обслуживания, а также нужны квалифицированные команды разработчиков, которые понимают все службы и управляют ими.

    В отличие от преимуществ, недостатки в минисервисах не столь значимы, чем в микросервисах.

    Сравним мини и микросервисы

    Чтобы понять разницу между микросервисами и минисервисами, рассмотрим варианты реализации одного ТС, используя два подхода и сравним их между собой.

    ТС: Web-приложение с аутентификацией, рендерингом pdf и отправкой файлов по почте.

    Подход №1 (микросервисный)

    Согласно разделению ответственности (Separation of Concerns) проектируем микросервисы с четко определенными обязанностями и получим:

    1) HTML-renderer service – сервис рендеринга html.

    2) HTML-to-PDF service – сервис конвертации html to pdf.

    3) Mailer service – сервис почтовой отправки.

    4) JWT-generator service – сервис генерации jwt токенов.

    5) Authentication service – сервис аутентификации.

    6) File-proxy service – сервис взаимодействия с файлами.

    Подход №2 (минисервисный)

    Минисервисный подход предполагает группировку схожих или зависимых функциональностей в один сервис, поэтому получаем следующие сервисы:

    1) PDF-renderer service – инкапсулирует функциональность HTML-renderer service и HTML-to-PDF.

    2) Mailer service – остается неизменным.

    3) Authentication service – инкапсулирует функциональность JWT-generator service и Authentication service.

    4) File proxy service – остается неизменным.

    Вывод: микро и мини сервисы остаются схожими с точки зрения взаимодействия между собой, или с базой данных, единственное отличие — это количество инкапсулирующихся обязанностей (микросервис = 1, минисервис > 1).

    Сравнение в глобальном масштабе

    Сравним основные характеристики различных подходов:

    Macroservice/monolith Miniservice Microservice
    Code

    (вариативность языков программирования)

    1/5 3/5 5/5
    Deploy

    (сложность)

    5/5 2/5 1/5
    Reuse 1/5 3/5 5/5
    Development time 5/5 3/5 1/5

    Вывод: каждый из подходов имеет свои преимущества и недостатки, но для каждого подхода есть свой главный use-case.

    Monolith – маленькое приложение (не будет увеличиваться) для быстрого выхода в production.

    Miniservice – мягкая миграция (менее затратная) из Monolith.

    Microservice – построение сложного/большого приложения из 0 (from scratch).

    Что выбрать: критерии

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

    1. Четко ли определены требования приложения?
    2. Оценили ли мы бизнес-риски?
    3. Есть ли у нашей команды достаточно экспертизы (в микро/мини/макро)?
    4. Есть ли у нас необходимая инфраструктура?
  • DOCKER DESKTOP доступен для Linux

    DOCKER DESKTOP доступен для Linux

    Сегодня стало известно об общей доступности Docker Desktop для Linux, разработчикам, использующим среду рабочего стола Linux, точно такие же возможности Docker Desktop, которые в настоящее время доступны в macOS и Windows.

    Во-первых, что такое Docker Desktop?

    Некоторые разработчики Linux, которые использовали только Docker Engine, могут не знать о Docker Desktop, поэтому давайте дадим краткий обзор. Docker Desktop — это простое в установке приложение, которое позволяет создавать и совместно использовать контейнерные приложения и микросервисы. Оно поставляется в комплекте с контейнерными инструментами, такими как Kubernetes, Docker Compose, BuildKit и сканером уязвимостей.

    Разработчики могут использовать Docker Dashboard для визуального управления всеми ресурсами своего контейнера — и спокойно отдыхать, зная, что Desktop установил разумные и безопасные значения по умолчанию для потребления ресурсов. Кроме того, Docker Desktop теперь включает в себя расширения Docker, позволяющие разработчикам повысить свою продуктивность за счет интеграции дополнительных инструментов разработки, созданных партнерами Docker, сообществом или их товарищами по команде!

    Почему создали Docker Desktop для Linux?

    Docker Desktop для Linux был вторым по популярности в общедоступной дорожной карте Docker . Разработчики Linux, которые голосовали за выпуск дорожной карты,  хотят:

    1. Унифицированный интерфейс Docker для всех основных ОС
    2. Мгновенный доступ к новым функциям (например, расширениям Docker ), которые исторически были доступны только на настольных компьютерах для Windows и Mac.
    3. Полная интеграция с Kubernetes, которую обеспечивает Docker Desktop
    4. Пользовательский интерфейс Docker Desktop, который значительно упрощает управление томами, контейнерами и образами, а также предоставляет информацию о процессах Docker, запущенных локально на вашем компьютере.

    Тем не менее, разработчики, которые довольны использованием Docker Engine в Linux, могут продолжать это делать! Desktop для Linux просто гарантирует, что разработчики Linux смогут использовать все потрясающие новые функции, встроенные в Docker Desktop, без необходимости компрометировать свои существующие рабочие процессы на основе интерфейса командной строки.

    Где получить?

    Чтобы начать работу с Desktop для Linux, посетите документацию Docker , чтобы найти соответствующие инструкции для выбранного вами дистрибутива. При запуске предоставляются пакеты и пакеты с конкретной поддержкой Ubuntu, Debian и Fedora. Также есть экспериментальный пакет для ArchLinux,  в ближайшие недели будет добавлена поддержка 64-битных вариантов ОС Raspberry Pi. debrpm

    Что дальше?

    Docker Desktop постоянно развивается.  В ближайшие планы относительно Docker Desktop для Linux входит максимальное упрощение процессов установки и обновления, например, установка одной командой, например apt-get install docker-desktop.

  • Kubernetes автоматическое масштабирование кластера

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

    Многие пользователи Kubernetes, особенно на корпоративном уровне, быстро сталкиваются с необходимостью автоматического масштабирования сред. К счастью, K8s Horizontal Pod Autoscaler (HPA) позволяет настроить развертывание для горизонтального масштабирования множеством способов. Одним из самых больших преимуществ использования Kube Autoscaling является то, что ваш кластер может отслеживать возможности загрузки ваших существующих модулей и вычислять, требуется ли больше модулей или нет.

    Платформа автоматического масштабирования Kubernetes

    Используйте эффективное автомасштабирование Kubernetes за счет гармонизации двух предлагаемых уровней масштабируемости:

    • Автомасштабирование на уровне пода: эта плоскость включает горизонтальное автомасштабирование пода (HPA) и вертикальное автомасштабирование пода (VPA), оба из которых масштабируют доступные ресурсы ваших контейнеров.
    • Автомасштабирование на уровне кластера: Cluster Autoscaler (CA) управляет этой плоскостью масштабируемости, увеличивая или уменьшая количество узлов внутри вашего кластера по мере необходимости.

    Kubernetes Autoscaling Framework в деталях:

    Горизонтальное автомасштабирование Pod (HPA)

    HPA масштабирует для вас количество реплик Pod в вашем кластере. Перемещение инициируется ЦП или памятью для увеличения или уменьшения масштаба по мере необходимости. Однако можно настроить HPA для масштабирования модулей в соответствии с различными внешними и пользовательскими метриками (metrics.k8s.io, external.metrics.k8s.io и custom.metrics.k8s.io).

    Вертикальное автомасштабирование Pod (VPA)

    Построенный преимущественно для сервисов с отслеживанием состояния, VPA добавляет ЦП или память к подам по мере необходимости, хотя он также работает как для подов с отслеживанием состояния, так и без него. Чтобы внести эти изменения, VPA перезапускает поды для обновления новых ресурсов ЦП и памяти, которые можно настроить для активации в ответ на события OOM (недостаточно памяти). После перезапуска модулей VPA всегда обеспечивает наличие минимального количества в соответствии с бюджетом распределения модулей (PDB), который вы можете установить вместе с максимальной и минимальной скоростью выделения ресурсов.

    Кластер автомасштабирования (CA)

    Второй уровень автоматического масштабирования включает CA, который автоматически регулирует размер кластера, когда:

    • Любые поды не запускаются и переходят в состояние ожидания из-за недостаточной емкости в кластере (в этом случае CA будет масштабироваться).
    • Узлы в кластере были недостаточно загружены в течение определенного периода времени, и есть шанс переместить свои модули на расширяющиеся узлы (в этом случае CA уменьшится).

    CA выполняет стандартные проверки, чтобы определить, находятся ли какие-либо модули в состоянии ожидания в ожидании дополнительных ресурсов или недостаточно загружены ли узлы кластера. Затем функция соответствующим образом регулирует количество узлов кластера, если требуется больше ресурсов. CA взаимодействует с облачным провайдером, чтобы запросить дополнительные узлы или закрыть простаивающие, и гарантирует, что масштабируемый кластер остается в рамках ограничений, установленных пользователем. Он работает с AWS, Azure и GCP.

    5 шагов к использованию HPA и CA с Amazon EKS

    В этой статье представлено пошаговое руководство по установке и автоматическому масштабированию через HPA и CA с кластером Amazon Elastic Container Service for Kubernetes (Amazon EKS). В соответствии с рекомендациями приведены два примера тестовых вариантов использования, чтобы показать функции на месте:

    Предпосылки кластера:

    • Amazon VPC и выделенная группа безопасности, соответствующая необходимой настройке для кластера Amazon EKS.
    • В качестве альтернативы, чтобы избежать пошагового создания VPC вручную, AWS предоставляет стек CloudFormation, который создает VPC для EKS .
    • Роль сервиса Amazon EKS для применения к вашему кластеру.

    1. Создайте кластер AWS EKS (плоскость управления и рабочие процессы) в соответствии с официальными инструкциями здесь . После запуска группы рабочих узлов Auto Scaling они могут зарегистрироваться в вашем кластере Amazon EKS, и вы сможете начать развертывание на них приложений Kube.

    2.  Разверните сервер метрик , чтобы HPA могла масштабировать модули в развертывании на основе данных ЦП/памяти, предоставляемых API (как описано выше). API-интерфейс metrics.k8s.io обычно предоставляется сервером метрик (который собирает метрики ЦП и памяти из API сводки, предоставляемые Kubelet на каждом узле).

    3. Добавьте следующую политику в роль, созданную EKS для рабочих процессов и узлов K8S (это необходимо для того, чтобы центр сертификации K8S работал вместе с группой AWS Autoscaling Group (AWS AG)).

    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Effect": "Allow",
    "Action": [
    "autoscaling:DescribeAutoScalingGroups",
    "autoscaling:DescribeAutoScalingInstances",
    "autoscaling:DescribeLaunchConfigurations",
    "autoscaling:DescribeTags",
    "autoscaling:SetDesiredCapacity",
    "autoscaling:TerminateInstanceInAutoScalingGroup"
    ],
    "Resource": "*"
    }
    ]
    }

    4.  Разверните функцию K8S CA.

    • В зависимости от используемого дистрибутива Linux может потребоваться обновить файл развертывания и путь к сертификату. Например, при использовании AMI Linux 2; заменить /etc/ssl/certs/ca-certificates.crtна /etc/ssl/certs/ca-bundle.crtв определении развертывания.

    5. Обновите определение развертывания для ЦС, чтобы найти определенные теги в AWS AG ( k8s.io/cluster-autoscaler/<CLUSTER NAME>должны содержать настоящее имя кластера). Также обновите переменную окружения AWS_REGION.Добавьте следующие теги в группу доступности AWS, чтобы ЦС K8S мог автоматически идентифицировать группу доступности AWS:
    > k8s.io/cluster-autoscaler/enabled
    > k8s.io/cluster-autoscaler/

    Kubernetes Autoscaling: тестовый пример №1

    Протестируйте K8S HPA в сочетании с функцией K8S CA:

    Предпосылки:

    • Кластер AWS EKS развернут и работает
    • Сервер метрик установлен для подачи API метрик.
    • Функция K8S CA установлена
    1. Разверните образец приложения и создайте ресурс HPA для развертывания приложения .
    2. Увеличьте нагрузку , запустив службу App K8S из нескольких мест.
    3. Теперь HPA должен начать масштабировать количество модулей в развертывании по мере увеличения нагрузки. Это масштабирование происходит в соответствии с тем, что указано в ресурсах HPA. В какой-то момент новые модули переходят в «состояние ожидания» в ожидании дополнительных ресурсов.
    $ kubectl get nodes -w
    NAME STATUS ROLES AGE VERSION
    ip-192-168-189-29.ec2.internal Ready 1h v1.10.3
    ip-192-168-200-20.ec2.internal Ready 1h v1.10.3
    $ kubectl get Pods -o wide -w
    NAME READY STATUS RESTARTS AGE IP NODE
    ip-192-168-200-20.ec2.internal
    php-apache-8699449574-4mg7w 0/1 Pending 0 17m
    php-apache-8699449574-64zkm 1/1 Running 0 1h 192.168.210.90 ip-192-168-200-20
    php-apache-8699449574-8nqwk 0/1 Pending 0 17m
    php-apache-8699449574-cl8lj 1/1 Running 0 27m 192.168.172.71 ip-192-168-189-29
    php-apache-8699449574-cpzdn 1/1 Running 0 17m 192.168.219.71 ip-192-168-200-20
    php-apache-8699449574-dn9tb 0/1 Pending 0 17m
    ...

    4. CA обнаруживает ожидающие Pod из-за недостаточной емкости и корректирует размер группы автоматического масштабирования AWS. Добавляется один дополнительный узел:

    $ kubectl get nodes -w
    NAME STATUS ROLES AGE VERSION
    ip-192-168-189-29.ec2.internal Ready 2h v1.10.3
    ip-192-168-200-20.ec2.internal Ready 2h v1.10.3
    ip-192-168-92-187.ec2.internal Ready 34s v1.10.3

    5. HPA теперь может планировать создание ожидающих модулей. Они начинают работать в новом узле кластера. Средняя загрузка ЦП теперь ниже указанной цели, поэтому нет необходимости планировать дополнительные поды.

    $ kubectl get hpa
    NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
    php-apache Deployment/php-apache 40%/50% 2 25 20 1h
    $ kubectl get Pods -o wide -w
    NAME READY STATUS RESTARTS AGE IP NODE
    php-apache-8699449574-4mg7w 1/1 Running 0 25m 192.168.74.4 ip-192-168-92-187
    php-apache-8699449574-64zkm 1/1 Running 0 1h 192.168.210.90 ip-192-168-200-20
    php-apache-8699449574-8nqwk 1/1 Running 0 25m 192.168.127.85 ip-192-168-92-187
    php-apache-8699449574-cl8lj 1/1 Running 0 35m 192.168.172.71 ip-192-168-189-29
    ...

    6. Теперь остановите загрузку, начатую в пункте 2), замкнув некоторые клеммы (но не все). Поскольку некоторые из них все еще обращаются к конечной точке службы приложений, можно проверить, не произошел ли сбой при масштабировании кластера.

    7. Средняя загрузка ЦП снижается, поэтому HPA начинает убивать некоторые поды, обновляя количество реплик в развертывании.

    $ kubectl get hpa
    NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
    php-apache Deployment/php-apache 47%/50% 2 20 7 1h
    $ kubectl get Pods -o wide -w
    NAME READY STATUS RESTARTS AGE IP NODE
    ...
    php-apache-8699449574-v5kwf 1/1 Running 0 36m 192.168.250.0 ip-192-168-200-20
    php-apache-8699449574-vl4zj 1/1 Running 0 36m 192.168.242.153 ip-192-168-200-20
    php-apache-8699449574-8nqwk 1/1 Terminating 0 26m 192.168.127.85 ip-192-168-92-187
    php-apache-8699449574-dn9tb 1/1 Terminating 0 26m 192.168.124.108 ip-192-168-92-187
    php-apache-8699449574-k5ngv 1/1 Terminating 0 26m 192.168.108.58 ip-192-168-92-187
    ...

    8. CA обнаруживает, что узел недогружен, и работающие поды могут быть размещены на других узлах. AWS AG обновляется соответствующим образом:

    $ kubectl get nodes
    NAME STATUS ROLES AGE VERSION
    ip-192-168-189-29.ec2.internal Ready 2h v1.10.3
    ip-192-168-200-20.ec2.internal Ready 2h v1.10.3
    ip-192-168-92-187.ec2.internal NotReady 23m v1.10.3
    $ kubectl get nodes
    NAME STATUS ROLES AGE VERSION
    ip-192-168-189-29.ec2.internal Ready 2h v1.10.3
    ip-192-168-200-20.ec2.internal Ready 2h v1.10.3

     

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

    Kubernetes Autoscaling: тестовый пример № 2

    Проверьте, автоматически ли ЦС регулирует размер кластера, если ресурсов недостаточно для планирования пода, который требует больше ЦП, чем доступно.

    Предпосылки:

    – Кластер AWS EKS развернут и работает
    – Установлена ​​функция ЦС K8S1. Создайте два развертывания, которые запрашивают менее 1 виртуального ЦП.

    $ kubectl run nginx --image=nginx:latest --requests=cpu=200m
    $ kubectl run nginx2 --image=nginx:latest --requests=cpu=200m

    2. Создайте новое развертывание, которое требует больше, чем доступный ЦП.

    $ kubectl run nginx3 --image=nginx:latest --requests=cpu=1

     

    3. Новый под останется в состоянии ожидания, потому что нет доступных ресурсов:

    $ kubectl get Pods -w
    NAME READY STATUS RESTARTS AGE
    nginx-5fcb54784c-lcfht 1/1 Running 0 13m
    nginx2-66667bf959-2fmlr 1/1 Running 0 3m
    nginx3-564b575974-xcm5t 0/1 Pending 0 41s

    При описании пода можно увидеть событие, указывающее на нехватку ЦП:

    $ kubectl describe Pod nginx3-564b575974-xcm5t
    …..
    …..
    Events:
    Type Reason Age From Message
    ---- ------ ---- ---- -------
    Warning FailedScheduling 32s (x7 over 1m) default-scheduler 0/1 nodes are available
    : 1Insufficient cpu

    4. Теперь центр сертификации автоматически настраивает размер кластера (группы доступности AWS). Добавляется один дополнительный узел:

    $ kubectl get nodes
    NAME STATUS ROLES AGE VERSION
    ip-192-168-142-179.ec2.internal Ready 1m v1.10.3 <<
    ip-192-168-82-136.ec2.internal Ready 1h v1.10.3

    5. В кластере теперь достаточно ресурсов для запуска пода:

    $ kubectl get Pods
    NAME READY STATUS RESTARTS AGE
    nginx-5fcb54784c-lcfht 1/1 Running 0 48m
    nginx2-66667bf959-2fmlr 1/1 Running 0 37m
    nginx3-564b575974-xcm5t 1/1 Running 0 35m

    6. Два развертывания удалены. Через некоторое время ЦС обнаруживает узел в кластере, который недостаточно загружен, и работающие поды могут быть размещены на другом существующем узле. AWS AG также обновляется, уменьшая требуемую емкость на 1.

    $ kubectl get nodes
    NAME STATUS ROLES AGE VERSION
    ip-192-168-82-136.ec2.internal Ready 1h v1.10.3
    $ kubectl get Pods -o wide
    NAME READY STATUS RESTARTS AGE IP NODE
    nginx-5fcb54784c-lcfht 1/1 Running 0 1h 192.168.98.139 ip-192-168-82-136

    Нужна помощь в настройке и поддержке Kubernetes, обращайтесь office@itfb.com.ua

  • Обновление OpenSSH на CentOS 7.x

    Проверяю безопасность сервера сканером, можно обнаружить множество уязвимостей ssh. Проблема в том, что свежие релизы Centos используют старые пакеты OpenSSH v7.4. Для исправления уязвимостей необходимо обновить данный пакет.

    [root@localhost ~]# cat /etc/redhat-release
    CentOS Linux release 7.9.2009 (Core)

    Проверяем версию установленного пакета ssh

    [root@localhost ~]# rpm -qa | grep openssh
    openssh-clients-7.4p1-21.el7.x86_64
    openssh-server-7.4p1-21.el7.x86_64
    openssh-7.4p1-21.el7.x86_64

    Зачастую для обновления или установки пакетов в Centos используется команда yum. Но в данном случае она нам не поможет, так как в репозитории нет новой версии пакета openssh.

    Как же максимально быстро установить новый пакет openssh? На github  для этого написали скрипт, который выполняет сборку пакета из исходных кодов и выполняет его установку.

    Поддерживаемые версии установки для данного скрипта  OpenSSH {7.9p1,8.0p1,8.1p1,8.2p1,8.3p1}.

    bash <(curl -sSL https://github.com/Junyangz/upgrade-openssh-centos/raw/master/build-RPMs-OpenSSH-CentOS.sh) \
        --version 8.3p1  \
        --output_rpm_dir /tmp/tmp.dirs \
        --upgrade_now yes >

    –output_rpm_dir  -обязательная опция, вы должны указать директорию для сборки пакета.

    Содержимое скрипта.

    build_RPMs() {
        local output_rpm_dir="${1}"
        yum install -y pam-devel rpm-build rpmdevtools zlib-devel openssl-devel krb5-devel gcc wget libx11-dev gtk2-devel libXt-devel
        mkdir -p ~/rpmbuild/SOURCES && cd ~/rpmbuild/SOURCES
        
        wget -c https://mirrors.tuna.tsinghua.edu.cn/OpenBSD/OpenSSH/portable/openssh-${version}.tar.gz
        wget -c https://mirrors.tuna.tsinghua.edu.cn/OpenBSD/OpenSSH/portable/openssh-${version}.tar.gz.asc
        wget -c https://mirrors.tuna.tsinghua.edu.cn/slackware/slackware64-current/source/xap/x11-ssh-askpass/x11-ssh-askpass-1.2.4.1.tar.gz
    
        tar zxvf openssh-${version}.tar.gz
        yes | cp /etc/pam.d/sshd openssh-${version}/contrib/redhat/sshd.pam
        mv openssh-${version}.tar.gz{,.orig}
        tar zcpf openssh-${version}.tar.gz openssh-${version}
        cd
        tar zxvf ~/rpmbuild/SOURCES/openssh-${version}.tar.gz openssh-${version}/contrib/redhat/openssh.spec
    
        cd openssh-${version}/contrib/redhat/ && chown root.root openssh.spec
        sed -i -e "s/%define no_gnome_askpass 0/%define no_gnome_askpass 1/g" openssh.spec
        sed -i -e "s/%define no_x11_askpass 0/%define no_x11_askpass 1/g" openssh.spec
        sed -i -e "s/BuildPreReq/BuildRequires/g" openssh.spec
        sed -i -e "s/PreReq: initscripts >= 5.00/#PreReq: initscripts >= 5.00/g" openssh.spec
        sed -i -e "s/BuildRequires: openssl-devel < 1.1/#BuildRequires: openssl-devel < 1.1/g" openssh.spec
        sed -i -e "/check-files/ s/^#*/#/"  /usr/lib/rpm/macros
    
        rpmbuild -ba openssh.spec
        cd /root/rpmbuild/RPMS/x86_64/
        tar zcvf ${output_rpm_dir}/openssh-${version}-RPMs.el${rhel_version}.tar.gz openssh*
        rm -rf ~/rpmbuild ~/openssh-${version}
    }

    В качестве параметра version нужна указать версию пакета которую вы хотите собрать.

    Так же есть возможность обновить текущую версию пакета openssh указав опцию  –upgrade_now yes

    upgrade_openssh() {
        local temp_dir="$(mktemp -d)"
        local output_rpm_dir="$1"
        trap "rm -rf ${temp_dir}" EXIT
        pushd "${temp_dir}"
    
        timestamp=$(date +%s)
        if [ ! -f ${output_rpm_dir}/openssh-${version}-RPMs.el${rhel_version}.tar.gz ]; then
            echo "${output_rpm_dir}/openssh-${version}-RPMs.el${rhel_version}.tar.gz not exist"
            exit 1
        fi
        cp ${output_rpm_dir}/openssh-${version}-RPMs.el${rhel_version}.tar.gz ./
        tar zxf openssh-${version}-RPMs.el${rhel_version}.tar.gz
        cp /etc/pam.d/sshd pam-ssh-conf-${timestamp}
        rpm -U *.rpm
        mv /etc/pam.d/sshd /etc/pam.d/sshd_${timestamp}
        yes | cp pam-ssh-conf-${timestamp} /etc/pam.d/sshd
        sed -i '/PermitRootLogin yes/ s/^#*//'  /etc/ssh/sshd_config
        chmod 600 /etc/ssh/ssh*
        /etc/init.d/sshd restart
        echo "New version upgrades as to lastest:" ; $(ssh -V)
    }

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

    Скрипт использует в качестве версии, параметры, так что его можно использовать для установки самой последней доступной версии пакета openssh.

    Необходима помощь в настройке сервера, обращайтесь office@itfb.com.ua

  • Президент подписал «Закон об облачных услугах для госорганов»

    Президент 16.03.2022 подписал закон об облачных услугах, который месяц назад был принят Верховной Радой. Он позволит урегулировать то, как органы государственной власти применяют облачные технологии, в частности, перенести основные процессы сразу в облако и эффективнее использовать госбюджет.

    «Облачные технологии позволят снизить нагрузки на органы власти и местного самоуправления, ответственные за эксплуатацию государственных информационных систем. Ведь для обработки информации самостоятельно нужно периодически увеличивать количество вычислительных и человеческих ресурсов.

    По данным журнала The Economist, объемы цифровой информации растут в десять раз каждые пять лет. Поэтому предлагаем ввести принцип Cloud First: перенести основные государственные ИТ-сервисы в облака,» – прокомментировал этот закон глава Минцифры Михаил Федоров.

    В тексте закона №2655 определены терминология и перечень облачных услуг, правовые основы и условия договора их предоставления. Например, в перечень облачных услуг относят:

    • инфраструктуру как услугу (IaaS);
    • платформу как услугу (PaaS);
    • программное обеспечение как услуга (SaaS);
    • безопасность как услуга (SECaaS).

    Также в тексте есть требования к облачным услугам и описана система государственного регулирования этой отрасли. В Минцифре отмечают, что принятие этого закона может стимулировать сервисы типа Microsoft Azure, AWS, Google Сloud построить дата-центры в Украине.

  • Как исправить уязвимость CVE-2022-24086 в Magento

    В воскресенье, 13 февраля, Adobe опубликовала бюллетень по безопасности. Компания выпустила исправления для новой критической уязвимости 0 дня, связанной с выполнением произвольного кода, в продуктах Magento и Commerce с открытым исходным кодом Adobe. Уязвимость, отслеживаемая как CVE-2022-24086, характеризуется неправильной проверкой ввода. Злоумышленники могут злоупотреблять этим, чтобы добиться выполнения произвольного кода в уязвимых версиях продуктов, поскольку это предварительно аутентифицированная уязвимость с оценкой CVSS 9,8 из 10. Она критична. Будет лучше, если вы это исправите. В этом посте мы рассмотрим, как исправить CVE-2022-24086 — критическую уязвимость 0 дня, связанную с выполнением произвольного кода, в продуктах Magento и Commerce с открытым исходным кодом Adobe.

    Что такое неправильная проверка ввода?

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

    Краткое изложение CVE-2022-24086 — уязвимости выполнения произвольного кода в Magento и Commerce:

    Это ошибка предварительной проверки подлинности, характеризующаяся неправильной проверкой ввода. Злоумышленники могут использовать это для выполнения произвольного кода на уязвимых версиях продуктов Adobe.

    Связанный идентификатор CVE CVE-2022-0513
    Описание Неправильная проверка ввода в продуктах Adobe с открытым исходным кодом Magento и Commerce.
    Связанный идентификатор ZDI
    Оценка CVSS 9.8 Критический
    Вектор CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    Оценка воздействия
    Оценка эксплуатационной пригодности
    Вектор атаки (AV) Сеть
    Сложность атаки (AC) Низкий
    Требуется привилегия (PR) Нет
    Взаимодействие с пользователем (пользовательский интерфейс) Нет
    Объем Без изменений
    Конфиденциальность (С) Высокая
    Целостность (Я) Высокая
    доступность (а) Высокая

    Продукты Adobe, подверженные уязвимости CVE-2022-24086:

    Уязвимость затрагивает продукты Adobe с открытым исходным кодом Magento и Commerce 2.4.3-p1 и более ранние версии, а также 2.3.7-p2 и более ранние версии.

    Примечание. Adobe подтвердила, что Commerce 2.3.3 и более ранние версии не затрагиваются.

    Продукт Версия Платформа
    Adobe Commerce 2.4.3-p1 и более ранние версии Все
    2.3.7-p2 и более ранние версии Все
    Magento с открытым исходным кодом 2.4.3-p1 и более ранние версии Все
    2.3.7-p2 и более ранние версии Все

    Как исправить CVE-2022-24086 — уязвимость выполнения произвольного кода в Magento и Commerce?

    Adobe отреагировала на уязвимость, выпустив исправления для ее устранения. Adobe рекомендует пользователям обновить свою установку до последней версии. Здесь вы можете увидеть информацию об исправленной версии в таблице.

    Товар Обновленная версия Платформа Приоритетный рейтинг инструкции по установке
    Adobe Commerce MDVA-43395_EE_2.4.3-p1_v1 Все 1 Примечания к выпуску

    Как исправить CVE-2022-24086 — уязвимость выполнения произвольного кода в Magento и Commerce?

    1. Скачать патчи

      Загрузите один из следующих патчей:

      MDVA-43395_EE_2.4.3-p1_v1.patch.zip

      MDVA-43395_EE_2.4.3-p1_COMPOSER_v1.patch.zip

    2. Применение исправления композитора для Adobe Commerce в облачной инфраструктуре

      Скопируйте файлы %patch_name%.composer.patch в каталог m2-hotfixes. Создайте каталог в корне проекта, если у вас его нет.

      Добавьте, зафиксируйте и отправьте изменения кода:

      # git add -A
      # git commit -m «Apply %patch_name%.composer.patch patch»
      # git push origin

       

    3. Применение исправления композитора для локальной версии Adobe Commerce и Magento с открытым исходным кодом

      Загрузите загруженные файлы исправлений в локальный каталог Adobe Commerce или в корневой каталог Magento с открытым исходным кодом. Выполните следующую команду

      # patch -p1 < %patch_name%.composer.patch
      ИЛИ
      # patch -p2 < %patch_name%.composer.patch

    4. Обновить кеш

      Обновите кеш, чтобы применить изменения:
      Администратор в разделе Система > Управление кешем .

    Мы надеемся, что этот пост поможет вам узнать, как исправить CVE-2022-24086 — критическую уязвимость нулевого дня, связанную с выполнением произвольного кода , в продуктах Magento и Commerce с открытым исходным кодом Adobe.

    Нужна помощь в обновлении, обращайтесь office@itfb.com.ua

  • 10 основных причин, по которым ваш сайт загружается медленно

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

    Вот наши 10 основных причин медленной загрузки веб-сайтов.

    1. Неоптимизированные изображения

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

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

    Например, изображения JPEG намного меньше по размеру по сравнению с другими форматами изображений, такими как PNG или GIF. Вполне естественно, что ваша веб-страница будет загружаться быстрее, если вы используете изображения JPEG вместо PNG/GIF.

    Выводы:

    • Проверьте размер файла ваших изображений, все, что превышает 1 МБ, действительно неприемлемо.
    • Используйте JPEG вместо PNG, особенно для больших изображений. Иконки не считаются.
    • Неоптимизированные изображения могут стоить вам денег в виде превышения пропускной способности.

    2. Проблемы с JavaScript

    Наличие плагинов JavaScript/jQuery сделало очень удобным добавление динамического контента на веб-сайты. Однако при неправильной реализации JavaScript может снизить скорость загрузки страницы вашего сайта.

    Для загрузки, интерпретации и выполнения jQuery и JavaScript требуется время. Поэтому, если вы используете несколько вызовов API для рендеринга данных JavaScript/jQuery, это может привести к значительной задержке при загрузке веб-страниц.

    Выводы:

    • Раздувание скриптов. Проведите аудит сценариев JavaScript, чтобы увидеть, что вам действительно нужно, и удалите то, что вам не нужно.
    • Асинхронная загрузка обязательна.
    • Подумайте об использовании чего-то вроде Segment или Google Tag Manager. Единый скрипт для всех ваших инструментов!

    3. Слишком много Flash-контента

    Хотя Flash — отличный инструмент для добавления интерактивности на ваш веб-сайт, он, скорее всего, способствует медленной скорости загрузки страниц. Flash-контент обычно имеет громоздкий размер, и чем больше размер файла, тем медленнее будут загружаться ваши страницы.

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

    Выводы:

    • Flash очень громоздкий и не подходит для производительности.
    • Раньше флеш был крут. Это больше не так.
    • Ищите замену HTML5.

    4. Чрезмерные HTTP-запросы

    Наличие множества файлов JavaScript, CSS и изображений может привести к слишком большому количеству HTTP-запросов. Когда пользователь посещает вашу веб-страницу, браузер выполняет несколько запросов на загрузку каждого из этих файлов, что может значительно снизить скорость загрузки страницы.

    Выводы:

    • Используйте спрайты для сокращения HTTP-запросов.
    • По возможности сократите количество файлов на своих страницах. Включает CSS, изображения, javascript.
    • Минимизируйте файлы CSS и Javascript, чтобы сократить общее количество файлов, которые пользователям придется загружать.

    5. Не использовать методы кэширования

    Кэширование, как известно, значительно повышает производительность веб-сайтов. Если вы не кэшируете, вы многое упускаете. Это метод, который позволяет вам хранить часто используемые данных в «кэшированной памяти».

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

    Внедрив браузерное/HTTP-кэширование и кэширование на стороне сервера, вы, вероятно, значительно улучшите производительность своего веб-сайта.

    Выводы:

    • Кэширование значительно повышает производительность.
    • Вы можете кэшировать кучу вещей от HTTP, запросов к базе данных до изображений.
    • Если вы можете что-то кэшировать, сделайте это. Но делайте это осторожно, чтобы ничего не испортить. Это может быть сложно.

    6. Нечистый код

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

    Удаляя эти ненужные элементы, вы можете сжать код, уменьшить размер файла и улучшить общее время загрузки страницы, а если вы отслеживаете рейтинг, вы, вероятно, также заметите повышение производительности SEO . С технической точки зрения этот процесс известен как минификация. Если вам не нравится программировать, есть несколько онлайн-инструментов, которые можно использовать для очистки и минимизации файлов таблиц стилей.

    Выводы:

    • Внимание к деталям имеет значение.
    • Не ленитесь и используйте встроенный CSS
    • Старайтесь не создавать несколько таблиц стилей CSS, если можно использовать одну.
    • Уменьшить!

    7. Не использовать сжатие gZIP

    Включив сжатие gZIP, вы указываете серверу обернуть все веб-объекты (изображения, CSS, файлы JavaScript и т. д.) в один контейнер перед их отправкой запрашивающему браузеру.

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

    Если вы еще не включили сжатие gZIP на своем веб-сайте, то это первое, что вы должны сделать, не теряя времени.

    Выводы:

    • Сжатие gZIP — это простой выигрыш в производительности.
    • Он объединяет все ваши веб-объекты (изображения, CSS, jS) в один контейнер для отправки запрашивающему браузеру.

    8. Слишком много рекламы

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

    Но это не должно происходить за счет снижения производительности или пользовательского опыта. Не позволяйте слишком большому количеству рекламы стать еще одной причиной медленной работы вашего сайта!

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

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

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

    Выводы:

    • Рекламные объявления являются дополнительными HTTP-запросами и замедляют время загрузки страницы.
    • Используйте их только там, где это необходимо, это повысит эффективность, удобство использования и CTR ваших объявлений.

    9. Не использовать службу CDN

    Служба CDN — это распределенная сеть независимых серверов, развернутых в разных географических точках, которые могут предоставлять веб-контент посетителям с высокой доступностью и высокой производительностью.

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

    Выводы:

    • Не обязательно, но CDN может помочь. Особенно, если у вас есть посетители со всего мира.
    • CDN кэширует часто используемые данные в географически распределенных центрах обработки данных.
    • Они помогают свести к минимуму время приема-передачи (RTT) и быстрее предоставлять контент вашей аудитории.

    10. Плохой хостинг

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

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

    Например, в hosting-cloud предлагает быстрые VPS на ssd дисках, так же можно заказать и оптимизацию производительности и круглосуточную поддержку.

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

    Вывод

    Скорость загрузки страницы веб-сайта зависит от множества факторов, таких как неоптимизированные изображения, большое количество HTTP-запросов, громоздкий код и проблемы с JavaScript, и это лишь некоторые из них.

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

    Наша служба поддержки поможет вам навсегда избавиться от медленной загрузки веб-сайтов. Мы поможем вам настроить параметры Apache, конфигурации и версии PHP, а также даже скомпилировать пользовательские стеки Apache/PHP по запросу.

  • Kubernetes и безопасность контейнеров

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

    Первый уровень – это кластерные серверы, на которые приходится вся ваша рабочая нагрузка. Следующими уровнями являются кластеры и контейнеры. Наша цель – минимизировать участки, уязвимые к атаке.

    Для начала убедитесь, что ваш кластер развернут в частной сети, а трафик поступает с load balancer и сервисов ingress. Не открывайте такие порты как SSH или RDP, старайтесь использовать SSM или вообще ничего, поскольку Kubernetes почти не нужна базовая система конфигураций. Кроме того, используя службы управления Kubernetes, вам даже не нужно беспокоиться о начальных настройках. Вы будете просто управлять операторами.

    Непривилегированные пользователи (rootless)

    Dockerfile-alpine

    FROM  alpine: 3.12 , 
    #  Create  user  and  set  ownership  and  permissions  as  required
    RUN adduser  - D myuser  &&  chown  - R myuser  / myapp - data
     COPY  myapp  / myapp
     USER  myuser
    ENTRYPOINT ["/myapp"]
    

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

    Неизменные контейнерные файловые системы

    read-only-deployment.yaml
     apiVersion: apps/v1 
    kind: Deployment 
    metadata: 
    labels: 
    app: web 
    name: web 
    spec: 
    selector: 
    matchLabels: 
    app: web 
    template: 
    metadata: 
    labels: 
    app: web 
    name: web 
    spec: 
    containers: 
    - command: [ "sleep" ]
     args: ["999"] 
    image: ubuntu:latest 
    name: web 
    securityContext: 
    readOnlyRootFilesystem: true 
    volumeMounts:
    - mountPath: /writeable/location/here
    name: volName 
    volumes:
    - emptyDir: {}
    name:volName
    

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

    Без shell, cat, grep, less, tail, echo и т.д.

    Dockerfile
     # Start by Building the application. 
    FROM  golang: 1.13 -buster as build
     
    WORKDIR  /go/src/app 
    ADD  . /go/src/app
     
    RUN  go get -d -v ./ ... 
    RUN  go Build -o /go/bin/app
    
    # Now copy it в наше base image. 
    FROM  gcr.io/distroless/base-debian10 
    COPY  --from=build /go/bin/app / 
    CMD  [ "/app" ]
    

    «Distoless» изображения содержат только ваше приложение и его зависимости во время выполнения. Они не имеют менеджеров пакетов, shell оболочек или любых других программ, которые вы ожидали бы найти в стандартном дистрибутиве Linux.

    Меньше значит лучше

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

    # Start by building the application.,  
    FROM  golang: 1.13 -buster as build
     
    WORKDIR  /go/src/app 
    ADD  . /go/src/app
     
    RUN  go get -d -v ./ ... 
    RUN  go Build -o /go/bin/app
    
    # Now copy it в наше base image. 
    FROM  gcr.io/distroless/base-debian10 
    COPY  --from=build /go/bin/app / 
    CMD  [ "/app" ]
    

    Секреты

    a-
     Video: v1 
    kind: Pod 
    metadata: 
    name: volume-test 
    spec: 
    containers:
    - name: container-test
    image: busybox 
    volumeMounts:
    - name: all-in-one
    mountPath: "/projected-volume" 
    readOnly: true 
    volumes:
    - name: all-in-one
    projected: 
    sources:
    - secret:
    name: mysecret 
    items:
    - key: username
    path: my-group/my-username
    

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

    Вы можете хранить тип секрет в Kubernetes API, монтировать их как файлы или просто объявлять как переменную среды. Также есть операторы, например, Bitnami Sealed Secret, которые помогают зашифровать содержимое секрета и позволяют отправить конференционные данные в репозиторий. Даже публично.

    Сканируйте Docker контейнеры

    Хорошая новость заключается в том, что Docker и Snyk недавно объединились, чтобы обеспечить лучшее сканирование уязвимостей контейнеров. Что это значит для вас? Теперь Snyk интегрирован с Docker Hub для сканирования официальных изображений. Кроме того, Docker интегрировал сканирование Snyk прямо в клиенты Docker. Это означает, что теперь вы можете интегрировать его в одну команду для сканирования контейнеров в CI.

    Конечно, вы можете использовать другие провайдеры, например Quay. Но они требуют большей интеграции и конфигурации. Кроме того, такие службы как Docker hub, AWS ECR, Quay, обеспечивают сканирование изображения после того, как вы отправили контейнер в Docker registry. Но пока вы будете исправлять эти уязвимости, контейнер, возможно, уже будет использоваться на нескольких средах и в том числе на продакшени.

    Также существует несколько служб, которые можно развернуть, например, docker-bench-security. Они будут выполнять сканирование вашего кластера Kubernetes. Впрочем, это может быть лишним, ведь у нас есть Pod Security Policy, которая будет охватывать большинство наших мер безопасности, о чем мы поговорим ниже.

    Безопасность Kubernetes

    Первый вопрос, который мы должны задать, работая с Kubernetes, это «как я могу установить системные операторы и проектные аппликации в Kubernetes стекластере?» Почему бы не использовать инструменты CLI? Да это возможно. Но не обязательно означает, что это верный путь. Все workloads должны быть структурированы как пакеты и развернуты с определенной гибкостью. Для этого у нас есть Helm.

    Helm помогает развертывать те же файлы YALM, но с шаблонизацией, как с переменными и условиями. Кроме того, он имеет историю ревизий, что позволяет восстановить ту или иную версию. Другими словами, Helm сделает вашу жизнь легче. Кроме того, почти все услуги предоставляют свои собственные Helm чарты, которые вы можете установить в один клик. Это так же просто, как установка пакетов в Linux.

    Существует два подхода к автоматизированному и безопасному развертыванию Helm черт: push-based и pull-based.

    Push-based подход – это то, что я люблю называть классическим подходом. Мы все его знаем, потому что используем каждый день. Скажем, вам нужно выстроить процесс CI/CD. Вы выбрали систему CI; вы создаете и отправляете артефакт, а затем запускаете развертывание непосредственно из CI. Это самый простой способ, и он имеет значительные преимущества, такие как обратная связь.

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

    Pull-based подход, также известный как GitOps, основанный на операторе, работающем внутри кластера. Он отслеживает изменения в хранилище и применяет автоматически. Поскольку оператор имеет доступ к репозиторию, нам не нужно предоставлять системе CI доступ к кластеру.

    Преимущество использования этого подхода заключается в том, что у вас всегда есть источник истины (SSOT — Single Source of Truth ). Более того, оператор заметит любые изменения, внесенные вручную, и восстановит их в состояние репозитория, поэтому мы никогда не столкнемся со смещением конфигурации. Есть два pull-based инструменты: Flux и ArgoCD. Давайте поговорим об ArgoCD.

    kind: Application
    metadata:
      name: bookinfo
      namespace: argocd
    spec:
      destination:
        namespace: bookinfo
        server: https://kubernetes.default.svc
      project: default
      source:
        path: applications/bookinfo
        repoURL: git@github.com:sqerison/gitops-demo-kubernetes-workloads.git
        targetRevision: main
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
    kind: AppProject
    metadata:
      name: bookinfo
      namespace: argocd
    spec:
      destinations:
        -  namespace:  '*' 
          server:  '*'
      clusterResourceWhitelist:
        -  group :  '*' 
          kind:  '*'
      sourceRepos:
        -  git @github .com:sqerison / gitops - demo - kubernetes - workloads.git
         -  git @github .com:sqerison / gitops - demo - bookinfo - app.git
    

    ArgoCD  это оператор который и отвечает за pull-based подход и следует GitOps принципам. Основная его роль, это менеджмент ресурсов и их обновление при получении изменений из репозитория. ArgoCD работает с двумя основными ресурсами: Application и AppProject.

    Application описывает сам ресурс, то есть аппликацию, которую нужно установить. Это может быть helm чарт, или обычные YAML файлы, будь то Kustomize ресурсы. Также мы указываем к какому проекту (AppProject) относится эта аппликация. И еще несколько других опций.

    AppProject обеспечивают логическую группировку приложений, что полезно, когда Argo CD используется несколькими командами. Он имеет несколько функций, например, ограничить то, что может быть развернуто, ограничить типы объектов, которые могут или не могут быть развернуты, например, RBAC, CRD, DaemonSets, Network Policy и т.д. При создании аппликации мы можем выбрать, в рамках какого проекта она будет существовать, и какие доступы она получит и не позволит выйти за рамки дозволенного.

    kind: AppProject
    metadata:
      name: bookinfo
      namespace: argocd
    spec:
      destinations:
        -  namespace:  '*' 
          server:  '*'
      clusterResourceWhitelist:
        -  group :  '*' 
          kind:  '*'
      sourceRepos:
        -  git @github .com:sqerison / gitops - demo - kubernetes - workloads.git
         -  git @github .com:sqerison / gitops - demo - bookinfo - app.git
    

    Pod Security Policy

    В начале статьи упоминались non-root контейнеры, read-only файловые системы и другие docker практики, как передача сокета docker, или использование сети системы (—net=host).

    С помощью PSP мы можем ввести и не допустить выполнения событий, если эти требования не будут удовлетворены.

    psp-non-privileged.yaml
     apiVersion: policy/v1beta1 
    kind: PodSecurityPolicy 
    metadata: 
    name: example 
    spec: 
    privileged: false # Вы не можете пользоваться pods! 
    # Занимающиеся fills в некоторых необходимых полях. 
    seLinux: 
    rule: RunAsAny 
    supplementalGroups: 
    rule: RunAsAny 
    runAsUser: 
    rule: MustRunAsNonRoot 
    fsGroup: 
    rule: RunAsAny 
    volumes:
    - '*'
    

    Вот обычный пример, для чего можно применить PSP. Запрещает запуск контейнеров в привилегированном режиме (privileged: false) и запрещает работу под пользователем root (MustRunAsNonRoot). Важно! Для того что правила PSP ресурса вступили в силу, их нужно авторизовать с помощью RBAC.

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

    Но PSP – не единственное, что мы можем использовать для обеспечения функций безопасности. У нас есть Open Policy Agent.

    Open Policy Agent

    Агент Open Policy, в сущности, является Gatekeeper-ом. Это оператор, который оценивает запросы к контроллеру допуска (admission controller), чтобы определить, соответствуют ли они правилам.

    С помощью этого инструмента мы можем расширить контроль над создаваемыми ресурсами. Мы можем контролировать такие вещи как labels, requests и limits. Это важно, когда вы хотите масштабировать ваше приложение. Мы также можем ограничить список репозиториев docker, разрешив только корпоративные или AWS ECR. С помощью Gatekeeper вы можете ограничить любую опцию или аргумент во всех ресурсах Kubernetes.

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

    opa-k8spspprivilegedcontainer-ct.yaml
     apiVersion: templates.gatekeeper.sh/v1beta1 
    kind: ConstraintTemplate 
    metadata: 
    name: k8spspprivilegedcontainer 
    spec: 
    crd: 
    spec: 
    name: 
    kind: 
    K8sPSPPrivilegedContainer
    - target: admission.k8s.gatekeeper.sh
    rego: |
    package k8spspprivileged
    
    violation[{"msg": msg, "details": {}}] {
    c := input_containers[_]
    c.securityContext.privileged
    msg := sprintf( "Privileged container is not allowed: %v, securityContext: %v" , [c.name, c.securityContext])
    }
    input_containers[c] {
    c := input.review.object.spec.containers[_]
    }
    input_containers[c] {
    c := input.review.object.spec.initContainers[_]
    }
    

    Это политика для ограничения docker репозиториев с типом ConstraintTemplate. Я не знаю, как писать на REGO. Это только пример, который я нашел в библиотеке, предоставленной Gatekeeper на GitHub. Итак, эта конфигурация – это просто шаблон, и аргументы для этого приведены в следующем примере.

    opa-k8sallowedrepos-inuse.yaml
     apiVersion: constraints.gatekeeper.sh/v1beta1 
    kind: K8sAllowedRepos 
    metadata: 
    name: repo-is-openpolicyagent 
    spec: 
    match: 
    kinds: 
    - apiGroups: [ "" ]
     kinds: " 
    " 
    -  "default" 
    parameters: 
    repos: 
    -  "openpolicyagent/" 
    -  "quay.io/" 
    -  "<aws_account>.dkr.ecr.<region>.amazonaws.com/"
    

    Как только вы создадите шаблон, Gatekeeper на его основе создаст CRD, на который вы сможете ссылаться, описывая какие именно репозитории вы хотите разрешить и для каких namespace-ов это применить. Мы применяем эту политику к модулям и namespace-ам по умолчанию, но вы можете и самостоятельно определить некоторые namespace-ы. В конце концов у нас есть список реестров, которым мы хотим доверять. Самое трудное – это написать шаблоны, которые вообще можно погуглить, а остальное не сложное.

    Network Policies

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      namespace: default
      name: deny-from-other-namespaces
    spec:
      podSelector:
        matchLabels:
      ingress:
      - from:
        - podSelector: {}

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

    В этом примере можно увидеть, как разрешить трафик из других namespace-ов на основе лейбов. И да, если вы хотите проэкспериментировать сетью, вы можете запустить под в тестовом namespace-е с меткой prod, и трафик будет разрешен. Но это не очень критично. В крайнем случае всегда можно обратиться к Gatekeeper-a и указать, какие именно лейбы должны присутствовать в данном namespace-е.

     

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: web-allow-prod
    spec:
      podSelector:
        matchLabels:
          app: web
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              purpose: production

    Чтобы Network Policies работали, вам нужно установить поддерживающий их сетевой плагин (CNI). Calico – хороший кандидат. AWS EKS имеет собственный сетевой плагин, и, в крайнем случае, вы можете использовать Security Groups для просмотра и управления правилами AWS консоли.

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: api-allow-5000
    spec:
      podSelector:
        matchLabels:
          app: apiserver
      ingress:
      - ports:
        - port: 5000
        from:
        - podSelector:
            matchLabels:
              role: monitoring

    Последний пример – ограничения по порту. Если быть точным, разрешите трафик только в порт с метриками, к которому будет доступна система мониторинга.

    Еще одно замечание по AWS CNI. В случае использования Custom Networking Network Policies потеряют свою силу. Поэтому вы должны выбирать, какая система политик вам больше подходит.

    Кроме того, есть еще Mesh система Istio, которая имеет свои политики. Она работает на седьмом уровне OSI, и позволяет управлять трафиком более гибко. Но Istio – достаточно широкая тема, поэтому мы сегодня не будем о ней говорить.

    Секреты

    Всем сейчас интересно, как мы можем безопасно доставить конфиденциальную информацию в кластер, не беспокоясь о потере или раскрытии. Хорошим кандидатом для управления вашими секретами является Bitnami Sealed Secrets. Вам просто нужно зашифровать секрет с помощью ключа шифрования и результатом шифрования уже будет готовый ресурс, который уже можно разворачивать в кластере.

    Другой альтернативой является GitCrypt, который шифрует файлы с помощью GPG ключей и может быть расшифрован только другим ключом, которые были предварительно добавлены. Это не самый лучший вариант для секретов Kubernetes, но хороший для других конфиденциальных данных, таких как частные ключи или kubeconfig.

    apiVersion: bitnami.com/v1alpha1
    kind: SealedSecret
    metadata:
      annotations:
        sealedsecrets.bitnami.com/cluster-wide: "true"
      creationTimestamp: null
      name: demo-secret
    spec:
      encryptedData:
        api-key: AgCK+iL6mZX6woqKiYQPWeELNt4/JrpaiwLR75d24OnshhsNveGB7CqGF1dr+rAxal4gr+d4No4Q+uAQgUizgLnY2IdWvAKVh/3miCgPW8SO8p8BOxpD8U1qBgJBb74M8rPbvxh47L0y2iSymSa4wdf4zcyju5CvoWnnB0Qbsx6lNzGMDnt6rjjzje3Su7ktrj4qnmX6BhRnukGmw+bErT31DzVWDrgrlcd2eQFuAflysckJv7wdIZXKSZwAWHAJzipUcNbG+O+UHJwia7RXwef9F2Ruebnl2jXH5/7iCV+83NLivdl0aW2TzLGOLR1NMG63NtN3T95Qfisame2QkYCBmYRCCCn3iwwxzDXDymAFE9/RqnnIPzhA/K0YayPZnLInoO3pTVxF1DL+RnmWRojUOwoO5ZkY++Behzq7nn9nRrEC+u/aDk2CXwJe9WbHwVgznKM7N6v4IUlcQz93VhRUbDetnWhA3TnD+HDsc85z0hvFp8c2U4giqRL4CnXHQIfBG63hLHoAogWOH8I+paVId180DWFpwjsAsKXVbESUa2ORL7LmuiDg1qKLoVFxiEEVJmnYPv5F8P1XMvJPW6L6QRQnJqj/ntyRSyEKnNh3umRTBoJzfXNDhsDXMPMu0leuYN1D+arx6IHBCKPexevE53iE7JK05bj/Oq8ujCOJRyv6TqjX4gQM3+kgXmi8rnCYB1CJg6lvhH1+pw==
      template:
        data: null
        metadata:
          annotations:
            sealedsecrets.bitnami.com/cluster-wide: "true"
          creationTimestamp: null
          name: demo-secret

    Здесь вы можете увидеть пример Sealed Secrets. Как видите, значение зашифровано. И как только вы развернете этот файл в кластере, оператор Bitnami Sealed Secrets. преобразует и расшифрует этот файл в обычный секрет. Как этот.

    Как видите, теперь наш Sealed Secret – это обычный секрет. А помните ArgoCD? Как уже упоминалось ранее, вы можете легко предоставить доступ к ArgoCD разработчикам и другим инженерам. Но не забудьте убедиться, что у них доступ только на чтение.

    Kubernetes Hardening

    Теперь пора поговорить о самих компонентах кластера. Они также имеют свои уязвимые места и злоумышленники с радостью воспользуются ими в случаи неправильных конфигурации.

    API Server

    API Server является ядром Kubernetes. На некоторых ванильных и старых версиях кластеров, API-сервер работает не только через HTTPS, но и на незащищенном порту (HTTP), который не проверяет аутентификации и авторизации. Обязательно убедитесь, что вы отключили незащищенные порты. Вы также можете попытаться отправить curl запрос на 8080 порт, чтобы проверить, получите ли ответ.

    Etcd

    Etcd похож на базу данных, которая хранит информацию о кластере и секретах кластера. Это важный компонент, и каждый, кто может писать в etcd может эффективно контролировать ваш Kubernetes кластер. Даже простое чтение содержимого etcd может легко дать полезные подсказки потенциальному злоумышленнику. Сервер etcd должен быть сконфигурирован так, чтобы доверять только сертификатам, которые предназначены API-серверам. Таким образом, он будет доступен только для проверенных компонентов в кластере.

    Kubelet

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

    Kubernetes dashboard

    Kubernetes панель. Эту систему лучше отключить полностью, поскольку у нас есть другие инструменты, которые могут помочь нам понять статус кластера. Как, например, ArgoCD. Вы увидите только ресурсы, созданные Argo, но это хорошо, поскольку обычно проблемы возникают из-за аппликации и ресурсы проекта, а сам кластер достаточно стабильным.

    Другие вспомогательные инструменты

    Это еще не все. У меня есть несколько инструментов, которые помогут в поиске уязвимых мест.

    Kubescape

    Чтобы запустить этот инструмент, достаточно выполнить две команды. Одну – для загрузки скрипта, а другую – для его выполнения. В результате вы получите список уязвимостей и неправильных конфигураций с итогом и общей оценкой в ​​конце. Помните рекомендации по усилению Kubernetes? Этот инструмент проверит их для вас. Кроме того, Kubescape использует базы данных, которые соответственно обновляются для обнаружения новых уязвимостей.

    Kube-bench

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

    Kubesec

    Простой плагин для сканирования модулей Kubernetes.

    Kubeaudit

    Имеет подобные функции, но используется для обнаружения неисправности (debugging) и создает хороший список с примерами, которые помогут устранить их.

  • Что нужно учить, чтобы стать веб-разработчиком

    Материал будет интересен начинающим, кто стремится связать свою жизнь с веб-разработкой. Сегодня обучение программированию невероятно просто – любой материал можно загуглить или взглянуть на YouTube. Самое сложное — определить, а что же нужно гуглить. Я уверен, что статья ответит на этот вопрос и сэкономит кому-то много времени.

    Список сформирован для освоения только направления Front-end разработки и конкретно для работы в Украине. Я не буду давать советы, что нужно учить, чтобы попасть в международные компании или компании из списка FAANG. И так, каждый Front-end разработчик должен знать Back-end, поэтому в этом списке будут разнообразные технологии. Наша цель – действительно высококвалифицированный Front-end разработчик.

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

    Ставим цель

    Все начинается с цели. Чего мы хотим добиться? Прежде чем забираться в кипы учебных материалов и разбираться с языками программирования, убедитесь, что программирование это то, что вам нравится. Любите ли вы решать задачи и можете сидеть часами над монотонными задачами? Только недавно узнали, что веб-разработкой можно неплохо зарабатывать? От этого зависит, как быстро и эффективно вы будете учиться и превратится ли этот процесс в каторгу.

    Чтобы пройти путь от точки А до точки Б, было бы прекрасно понимать, где находится эта точка Б. Вы хотите работать разработчиком senior в Украине и получать свои $5000 или планируете переезд за границу и работу в международных компаниях?

    Базовый Computer Science

    Нужно получить базовые знания о работе компьютера, браузера, веб-сайта. Что такое программа и как она работает? Можно пройти какой-нибудь базовый курс информатики, то, что изучают в школе. Освоить азы любого языка программирования (С, С++, Python) для того, чтобы было понимание, что такое переменная, конструкции языка, функции.

    Полезно будет прохождение популярного курса CS50. Перевод на русский язык доступен на Прометеусе — Основы программирования CS50 2019 .

    Command line (Терминаль)

    Работа с консолью или терминалом – неотъемлемая часть обыденности программиста. Осваиваем базовые команды: навигации по каталогам, создание файлов и папок, изменения прав, запуск других программ через консоль. Чем раньше освоим этот инструмент, тем легче будет в будущем. Можно пройти любой курс по Linux и работе с консолью. На Udemy легко найти очень популярные предложения, например, Linux Basics: All You Need To Know To Start .

    HTML

    HTML – язык разметки (не программирование). С нее мы приступаем к изучению вебразработки. Осваиваем теги и построение страницы – каркас вебсайта. Доступных материалов много, к примеру, тот же CS50 от Гарвардского института, но уже специально для вебпрограммирования. Перевод на русский также доступен на  Прометеус . Хотя HTML и не обновляется часто, удобнее учиться по курсам или туториалам на веб-сайтах, чем по книгам – нагляднее будет.

    CSS

    CSS – каскадные таблицы стилей. Если HTML это голый и скучный каркас, то с CSS наши страницы начинают выглядеть красиво и стильно. Освоив эти две технологии, мы можем уже создавать первые проекты. Простые «лендинги» или сайты-визитки. Надо набивать руку. Можно копировать другие сайты, главное сделать как можно больше страниц, чтобы запомнить названия тегов и правил.

    Система контроля версий Git

    Созданные нами проекты нужно где хранить, чтобы можно было делиться исходным кодом, смотреть, когда мы это создавали и как меняли. Git – идеальное решение, ведь это самая популярная система контроля версий. Весь код комитим и публикуем на GitHub.

    Лучшее в Git – то, что его используют абсолютно все. Независимо от того, вы Back-end, Front-end, mobile-разработчик или вообще DevOPS, без Git просто некуда.

    Дополнительно к CS50 курсу, где также упоминается GIT, могу порекомендовать свой бесплатный курс Git for beginenrs на YouTube. Скоро будет еще перевод на украинский. Также на  официальном сайте можно совершенно бесплатно использовать учебник Pro Git от Scott Chacon и Ben Straub.

    JavaScript

    JS – основной язык программирования в интернете и для front-end разработчиков в целом. Ее изучение и практика займет больше времени. И вместе с этим, освоив JS core, изучение любых библиотек и фреймворков не составит существенных проблем. Освоив JS мы можем добавить интерактивность к нашим сайтам: валидации форм, сложные анимации и эффекты.

    Материалов из JS невероятно много. Также есть несколько книг, которые обязательны для прочтения, но не сразу, только когда поймете суть языка JavaScript и немного набьете руку. Книги:

    • “JavaScript: The Definitive Guide” David Flanagan.
    • “JavaScript: The Good Parts” by Douglas Crockford .
    • “You Don’t Know JS” by Kyle Simpson (Бесплатно на GitHub).

    jQuery (для старых проектов)

    Одной из самых популярных библиотек для JS была jQuery . Сейчас она менее популярна, но это не значит, что мы можем упустить ознакомление с ней. Не всем нам работать с современными и топовыми технологиями, кому-то и поддерживать старый (legacy) код нужно.

    Значительное преимущество этой библиотеки – наличие тысяч плагинов и дополнений. Можно произвести любой слайдер, галерею или сложный анимационный эффект.

    Ajax / Fetch API

    Ценность нашим проектам предоставляют актуальные данные и своевременное обновление. С помощью Ajax мы можем производить асинхронные запросы на сервер для получения или отправки данных. Fetch API  – новая реализация этого подхода.

    CSS-препроцессоры

    Поскольку CSS — это только таблицы стилей, то ни о каких переменных, циклах или функциях мы говорить не можем. Для этого можно использовать препроцессор: Sass, Less или PostCSS. Они дают нам возможность использовать переменные и mixins (нечто вроде функций). Затем этот код «компилируется» в обычный CSS.

    CSS-методологии

    Кто хоть чуть-чуть работал с CSS, знает, насколько может быть сложно поддерживать его организацию. Правильное формирование селекторов и стилей является сложной задачей. Весь этот код нужно поддерживать и модифицировать. Чтобы упростить жизнь, придумали разные методологии: BEM, Atomic CSS, OOCSS и многие другие. Это, по сути, набор правил, описывающий, как мы называем классы и используем селекторы.

    CSS-фреймворки

    К счастью, нам не нужно все писать самому или реализовывать какую-либо из методологий на проекте. Можно пользоваться готовыми решениями. Здесь приходит время для использования CSS-фреймворка. Выбор велик: Bootstrap , Material , Tailwind , Compass и множество других. Готовы к использованию наборы компонов, глобальные стили и возможность кастомизации под любой проект.

    Данных знаний и технологий уже достаточно для создания полноценных сайтов-визиток, лендингов и других простых сайтов на несколько страниц. Конечно, это при условии, что мы не пишем Back-end, все данные уже для нас подготовлены.

    Регулярные выражения

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

    Project deploy

    Когда мы создали первые проекты, пришло время показать их миру. Здесь мы начинаем осваивать самые простые подходы к развертыванию проектов и их доступу в интернете. Необходимо купить доменное имя и хостинг. Стоят они не очень дорого, но пользы принесут вам многое. На собеседованиях будет что показать, ведь свое портфолио нужно куда-то скачать.

    Самый простой способ – загрузка исходных файлов через FTP на сервер хостинга.

    PHP

    Да, вам не показалось. В 2022 году я до сих пор советую изучить PHP фронтенд-разработчику. Почему? С помощью jQuery или даже React (Angular, Vue) построение действительно сложного сайта займет месяцы, если не годы. А вам нужен опыт работы с блогами, интернет-магазинами, содержащим админ-панель и возможность настройки виджетов и плагинов. Об этом мы поговорим в главе 17 CMS.

    MySQL

    Язык запросов SQL и базы данных MySQL пригодятся в любом случае. Если мы уже работаем с PHP, то без них никуда, а если нет, то не проблема. Даже сейчас я иногда использую SQL, например, проверяю аналитику в BigQuery.

    CMS (WordPress, Joomla, Drupal)

    Основная причина, по которой следует изучить PHP – это WordPress (или любая другая CMS). Ни в одном другом языке нет такого количества простых и функциональных систем управления контентом. Блог или интернет-магазин можно сделать через час. А функционала там будет столько, что самому за всю жизнь столько не написать. Нужно уметь использовать готовые решения.

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

    Nginx

    Удобный и популярный веб-сервер. Здесь нам понадобятся наши знания по работе с консолью, ведь это сервер на Linux. Мы не часто с ним работаем, но понимание, как он обрабатывает запросы и возвращает файлы, важно.

    SEO

    Нам не нужно выводить сайты в ТОП-10 поисковой выдачи, но понимать, что такое оптимизация сайта под поисковые сервисы необходимо. Сюда входит семантическая верстка, оптимизация производительности страниц, работа с Lighthouse, Google PageSpeed, WebPageTest и другими сервисами. От того, как вы оптимизируете сайт (понимаете, что это такое и зачем) зависит, сколько денег заработает ваш клиент.

    Аналитика (Google Analytics)

    Когда наши сайты уже доступны миру, я хотел бы узнать, кто на них заходит, какие страницы просматривает и какое поведение пользователей в целом. Здесь нам помогут разные аналитики. Самый простой является Google Analytics. Устанавливаем с помощью Google Tag Manager и собираем информацию. На всех проектах и ​​компаниях, где я работал, мы использовали этот сервис, и я занимался его настройкой.

    Архитектура patterns (MVC, MVVM)

    Поигравшись с разными CMS, пора продолжать прокачивать свои Hard Skills. Архитектурные паттерны MVC, MVVM помогут понять принципы построения сложных приложений. Как разделить логику, данные и представления данных.

    ООП

    Объектно ориентированное программирование – классика. Если упустите понимание принципов подражания, полиморфизма и инкапсуляции, создайте себе множество проблем при работе с TypeScript или более сложными программами на JS.

    JS-фреймворки и библиотеки

    React, Vue, Angular являются сейчас самыми популярными JS-фреймворками. В большинстве вакансий требуется их знание. Именно их используют большинство outsource и продуктовых компаний. Выберите один из них и копайте в этом направлении.

    Стейт менеджер

    В дополнение к фреймворкам – стейт менеджеры. Их сейчас много, но самые популярные – это Redux , MobX . Упростят (или наоборот) жизнь при работе над сложными проектами, где много данных, они часто обновляются, и все эти изменения нужно показывать пользователю.

    Webpack

    Самый популярный бандлер . Что он делает? Для упрощения работы мы используем разные библиотеки, языки программирования (например, TypeScript), множество ресурсов (изображения, шрифты). Чтобы все это оптимально собрать и создать оптимизированный билд проекта, мы и используем Webpack.

    NodeJS

    Лучшее в JavaScript – то, что этот язык можно использовать и на серверах. Серверная версия JS называется NodeJS – это программная платформа, которая компилирует JS в машинный код. Без нее Front-end разработчикам некуда. Хотите или нет, но какие-нибудь основы нужно знать.

    Express

    Самый популярный фреймворк для NodeJS. Упрощает жизнь во многих случаях. Даже если вам нужно просто создать простой вебсервер, он пригодится.

    Package managers (npm, yarn)

    Поскольку большинство библиотек упакованы в пакеты и хранятся в специальных репозиториях, знания npm или yarn будут обязательными. Там ничего сложного, просто нужно знать, как установить нужный пакет из npm.

    Build tools

    К этой категории я отнес дополнительные инструменты, без которых нам будет сложно сделать качественный продукт, например, линтеры или раннеры. Код должен быть чистым и, как минимум, в одном стиле. К счастью это можно автоматизировать с помощью EsLint или Prettier. Также нам нужно запускать наши приложения из консоли одной командой. Здесь на помощь приходят npm script, Grunt, Gulp или тот же Webpack.

    RESTful

    Реализация протоколов обмена данными между клиентом и сервером. Даже если вы не пишете Back-end сторону, понимать. какие методы могут делать запросы к серверу (GET, POST, DELETE…) и какие статусы могут возвращаться (200, 301, 404…), следует понимать. Каждый из них имеет свои ограничения, которые мы должны помнить.

    MongoDB

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

    Имея базовые знания по Back-end (NodeJS, Express, MongoDB), мы можем уже создать полноценный сложный проект с помощью одного JavaScript. Опыт показывает, что такие знания любому высококвалифицированному Front-end разработчику особенно важны.

    Performance (оптимизация)

    Настало время улучшать качество наших проектов. При работе с SEO мы уже немного затронули тему производительности наших приложений. Пора копнуть поглубже. Оптимизация кода, скорость загрузки страниц, скорость отображения контента. Здесь пригодятся знания Webpack, Nginx. Профайлинг – совокупность методов и техник поиска самых медленных мест ваших приложений.

    Логирование

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

    ElasticSearch

    ElasticSearch может быть отличным выбором для хранения логов и последующей их визуализации. Можно посмотреть на весь ELK стек . Инструменты полезны и интересны.

    Практики чистого кода

    Прочтите Роберта Мартина и его книгу « Чистый код ». Эта книга ответит на большинство вопросов по написанию чистого кода. Вы из будущего и ваши коллеги будут невероятно благодарны вам.

    Тестирование

    Есть много видов тестирования, например e2e, unit testing, функциональное, мануальное. Важнейшим для программиста является unit-testing (модульное тестирование). Без него код нельзя назвать чистым. Написание тестов уменьшает количество ошибок, упрощает модификацию кода, создает дополнительную документацию вашего кода. Самыми популярными фреймворками для модульного тестирования JS являются Jest, Jasmine.

    Безопасность

    Кроме чистоты, ваш код должен обеспечивать требования безопасности. Взгляните на  ТОП-10 правил OWASP . Ну и не забудьте настроить протокол HTTPS и проверить CORS.

    Code review процесс

    Поскольку работа программиста — это преимущественно командная работа, умение проводить code review необходимо. GitHub дает отличные возможности и инструментарий для проведения code review. Каковы цели и предназначение этого процесса? Что такое collective code ownership и как он достигается review?

    Design and Development принципы

    Есть несколько принципов написания кода, которые нужно освоить: KISS, SOLID, YAGNI, DRY. Эти принципы часто спрашивают на собеседованиях – покажите себя с лучшей стороны. Каждый из этих принципов также реализует практики чистого кода.

    CI/CD

    Continuous integration – регулярно меряем наш код в репозиторий, после чего автоматически прогоняются тесты, линтинг, билд и любые дополнительные шаги. Мы уверены, что наши изменения не сломали проект.

    Continuous delivery (deployment) — максимально часто деплоим код в продакшине.

    Самыми популярными инструментами являются Jenkins и CircleCI. Вам, как Front-end разработчику, не нужно уметь настраивать их с нуля, но уметь запустить джоб или просмотреть логи – просто необходимо.

    Agile

    Работа в команде требует знания некоторых техник и практик. Здесь на помощь приходят Scrum, Kanban и XP.

    Cloud

    Так случилось, что сейчас все переносят в облака. Ознакомьтесь с самыми популярными решениями: AWS, GCP или Azure.

    Docker

    Часть работы Front-end разработчик передали дизайнеру, а именно часть верстки. Инструменты Figma и ей подобные генерируют CSS компоненты. С одной стороны, стало легче, но с другой – на свободное место добавили другую технологию – Docker. Фронт мы пишем в связке с беком, и чтобы его приподнять, нужно запускать Docker.

    TypeScript

    Прекрасный язык, который расширяет возможности JS для разработчиков, например, добавив типизацию или интерфейсы. Активно сейчас используется как на back-end, так и на front-end.

    GraphQL

    Язык запросов, альтернатива REST. Позволяет получать только данные, необходимые для клиента. Такие реализации как  Apollo добавляют множество дополнительных возможностей, например менеджмент стейта. Мы заменили Redux на Apollo, и все работает отлично. Как бонус всегда актуальна документация для ваших запросов.

    Кайдзе́н — «непрерывное усовершенствование»

    Программирование – путь с началом, но без конца. Чтобы оставаться квалифицированным специалистом, нужно каждый день учиться и понимать, что происходит в мире Front-end разработки. Каждый день выходят новые библиотеки или фреймворки и нужно успевать за обновлением информации. Упустив этот процесс хотя бы на год, можно быстро потерять квалификацию.

    Итоги

    В этом плане и списке технологий я полностью упустил такие вещи как английский язык и soft skills. Они не менее важны, но не являются темой этой статьи.

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

    Надеюсь, что этот материал дал вам ответы на ваши вопросы и сделал путь обучения программированию более понятным.