Devops notes

 

  • Эта статья под распил к конкретные, тут заметки именно
  • Многие инструменты и практики devops на собеседованиях/в требованиях сейчас спрашивают и у сетевых инженеров и у performance инженеров и у программистов; по сути это универсальные знания, которыми нужно обладать
  • Кто то SRE выносит отдельно от devops, кто то его считает подвидом devops
  • По практике работы SRE с мониторингом в отдельной статье
  • Многое более детально описано в отдельных статьях – docker, k8s, terraform, best practice (microservice)
  • Часть взято из практики
  • Часть из феникс-проекта
  • Часть с сайта https://easyoffer.ru/rating/devops
  • Часть из видео

пример вакансии (от 250к)
Ideal DevOps делал следующее: 
-Работал на позиции DevOps от 3 лет;
-Работал с Kubernetes, администрировал его;
-Знает CI/CD (особенно с GitLab и Ansible);
-Знает ОС Linux (особенно Debian/Ubuntu);
-Умеет писать скрипты на Bash / Python;
- Работал с высоконагруженными проектами на PHP, Go (возможно иное), знает методы их тонкой настройки и балансировки;
-Работал с SQL- базами данных (балансировка, репликация, анализ запросов и их оптимизация, общий тюнинг);
-Понимает как устроена сеть, как работают и взаимодействуют между собой различные протоколы и сетевые сервисы и отсутствие страха перед tcpdump и Wireshark;
-Не боится командной работы, готов к коммуникации.
Что поможет выделиться: 
-Опыт в настройке такого сетевого оборудования как Juniper и работы с BGP; 
-Опыт с Bare-Metal.

Примеры задач для cloud! (в первую очередь AWS) devops (junior/middle/senior)

Задачи в реальных сценариях могут быть любые, по сути в первую очередь senior справится быстрее и качественнее.

  • Часто спрашивают сделать простой pipeline, на канале ADV-IT есть примеры pipeline
  • Написать скрипт который делает MySQL Dump базы данных, игнорируя таблицу logs, и сохраняет dump в zip файле с timestamp в имени файла и копирует это в AWS S3 bucket. Сделать Jenkins Job который этот скрипт запускает в 2 ночи каждый раз
  • Написать скрипт который ищет последний dump файл в AWS S3 Bucket и восстанавливает этот dump в указанную базу данных. Сделать Jenkins job который этот скрипт запускает.
  • При CPU Utilization >80% последние 10 минут, автоматически перезапустить
    Windows Service на сервере ( NewRelic)
  • Настроить оповещение в Slack когда делается MySQL Dump и его результат
  • Написать Terraform модуль для AWS Elastic Network Interface + Security Group
  • Добавить AWS S3 VPC Endpoint для VPC модуля на Terraform
  • Написать на Terraform AWS CloudWatch Alarms c Notification в SNS Topic
  • Задеплоить AWS VPC используя существующий Module
  • Сделать CI/CD: GitHub + Jenkins + AWS ElasticBeanstalk
  • Установить и настроить OpenVPN Server в AWS (используя Terraform) при этом если сервер умирает, запускается новый, все настройки сохраняются и востанавливаются на новом сервере автоматически!
  • Настроить AWS SSO интеграцию с Microsoft Azure Active Directory • Ha Google Cloud установить Grafana с автонастройкой чтения данных из BigQuery и настроить интерграцию Login c Google G-Suite
  • Настроить CloudTrail так чтобы все CloudTrail Logs co всех AWS Accounts организации сохранялись в $3 bucket в Security Account (Terraform)
  • Настроить AWS Backup так чтобы Backup Plans были одинаковы во всех AWS Accounts огранизации (используя Terraform)
  • Написать Terraform модуль для AWS SSM Associations
  • Написать Terraform модуль для деплоя AWS ACM Private Certificate Authority
  • Написать Terraform модуль для деплоя AWS MSK (kafka) сервиса
  • Написать Terraform модуль для деплоя AWS Glue Crawler для S3 и DynamoDB
  • Сделать Jenkins Job для деплоя php приложения в Prod на ECS Cluster при Push to main branch, a при push to develop branch деплой в Staging
• Задеплоить Read Replica для существующей MySQL в AWS
• Задеплоить существующий ALB в третьей AWS Availability Zone
• Задеплоить Bastion Server в AWS
• Написать инструкцию как установить MFA для AWS IAM User
• Настроить НТТР > HTTPS Redirect на Apache WebServer
• Написать скрипт и установить как Jenkins Job для синхронизации файлов
между AWS S3 Bucket из us-west-2 в cn-north-1
• Написать Скрипт для Mount S3 Bucket для Linux при загрузке сервера ЕС2
• Сделать Upgrade версии PHP на AWS Elastic Beanstalk
• Написать скрипт на PowerShell для проверки приложения, и автоперезапуска его сервиса если приложение не работает
• Написать Скрипт на Python который делает move файлам старше Х дней в AWS S3
• Сделать Upgrade HAProxy на новую версию
• Написать GitHub Action CI для запуска тестов с тригером Assign Reviewer
• Jenkins Job запускаемый при push to staging, для сборки docker image и деплоя в AWS ECS
• Настроить RDS Encryption на всех существующих PROD databases
• Заменить три сервера на которых работают три Ruby скрипта ежедневно в

AWS Lambda Functions (используя Terraform)

• Написать скрипт останавливающий стертые файлы в AWS S3 Bucket по указанному path, Jenkins Job запускает это скрипт с параметрами
• Заменить 5 Application Load Balancers на один с разными TargetGroups и ALB Rules
• Задеплоить k8s cluster с кучей node groups
• Задеплоить ArgoCD для k8s
• Задеплоить Internal и External Ingress Controller в k8s cluster
• Задеплоить кучу k8s add-ons
• Настроить в Jenkins чтобы определенные пользователи могли видеть только определенные Jobs, и делать определенные действия

 

  • Улучшить GitHub Action Cl чтобы не запускал тесты при повторном
    Assign/UnAssign Reviewer
  • Написать подробный Migration Plan для 10 серверов Windows Server 2008 из On-Premises дата центра в AWS, описать все шаги, риски, стоимость
  • Написать Terraform модуль для деплоя Kafka Cluster
  • Задеплоить Kafka Cluster с SSL аутентикацией
  • Задеплоить Kafka Cluster в k8s c SASL authentication (Helm Chart)
  • Написать Terraform модуль для деплоя Kafka Connect to S3
  • Установить Fortigate Firewall Active-Passive (используя Terraform) в AWS
  • Написать скрипт для Lifecycle AWS ECR Images, оставлять определенные images с тагами и удалять другие через Х дней. Задеплоить как Lambda Function через Terraform, запускать по расписанию
  • Написать Terraform модуль для деплоя ECS Cluster + ECS Service
  • Создать Terraform код для существующей Инфраструктуры (import)
  • Установить AWS FSx в одном регионе, установить AWS FSx в другом регионе, настроить AWS DataSync для синхронизации данных из одного в другой FSx каждые 15 минут! (используя Terraform)
  • Написать скрипт для восстановления snapshot Elasticsearch
  • Создать отдельный AWS Account и перенести всю инфраструктуру проекта
    XYZ в этот AWS Account при минимальном downtime
  • Сделать Staging Environment для проекта XYZ
  • Написать Модули Terraform и Задеплоить AWS Config в AWS организации с сохранением конфигов в S3 бакете в member акаунте АА, и агрегаторе конфигов в member акаунте BBB.
  • Задеплоить Vault cluster в k8s (Helm Chart)
  • Сделать Refactoring кода Terraform из одной директории по иерархии директорий
  • Сделать Refactoring кода Terraform из OSS в Terraform Cloud включая модули

 

 

Что такое DevOps

Пример описания devops на примере презентации от Инфотекс

  • Потребность в devops связана с рядом трендов и их наложением – облачные технологии, микросервисы, контейнеризация, развитие инструментов обработки (ci/cd).
  • devops по своей сути это объединение разработки, тестирования и эксплуатации в единый циклический процесс – по сути все аспекты ИТ проекта; связующее звено между dev/test/maintain
    • разработка и доп вопросы
      • сборка кода после разработки
      • деплой в каких то средах
    • тестирование
      • автоматизированное
    • эксплуатация
      • мониторинга/видимости
      • обратный лупбек в разработку
  • devops по сути доносит до разработки еще на этапе построения продукта потенциальные проблемы (по тестам/экспертизе или закладыванием правильной архитектуры) в эксплуатации/безопасности; после релиза так же не заканчивается жизнь продукта – мониторинг, обратная связь; в итоге продукт на рынок как выводится потенциально быстрее и качественнее, так и улучшается эксплуатациях
  • Все это достигается за счет практик типа – devops ci/cd, IaC, observability/continuous monitoring, microservices/dockers/k8s, etc.
  • devops тоже бывают разные – помимо «все во всем» (широкая специализация это и плюс и минус – в том числе поэтому разные требования к роли) чаcто нужно заниматься конкретным и есть разные направления (в зависимости от компании/проекта и конкретных задач) – напр. часто можно встретить облачных инженеров, инженеров по сборке. Devops (как Шива) может заменять собой (одновременно или занимаясь конкретным):
    • build engineer – собирают код, который написали программисты
    • release engineer – доставляет код в production
    • monitoring – SRE – ops (infra: network/dba/servers/k8s/cloud engineer – не хотелось бы ночью работать 🙂 )
    • automation
    • testing
  • Наибольшее ускорение на релизы привносит внедреное ci/cd (см. в отдельной статье)

DevOps (сокращение от Development и Operations) – это культурная и методологическая практика в области информационных технологий, которая уделяет особое внимание совместной работе между разработчиками (Development) и системными администраторами, операторами (Operations) и другими ИТ-специалистами. Основной целью DevOps является автоматизация и улучшение процессов разработки, развертывания и управления приложениями, чтобы обеспечить более быструю поставку программного обеспечения с улучшенным качеством.

Основные принципы и практики DevOps включают в себя:

  1. Автоматизация: Автоматизация процессов развертывания, тестирования, интеграции и управления инфраструктурой с использованием инструментов и скриптов.
  2. Совместная работа: Сокращение разрыва между разработкой и операциями, поощрение сотрудничества и обмена знанием между командами.
  3. Непрерывная интеграция и непрерывная поставка (CI/CD): Практика постоянного объединения изменений в коде и автоматической поставки приложений в производство.
  4. Мониторинг и обратная связь: Систематический мониторинг производственных приложений и сбор обратной связи, чтобы быстро выявлять и устранять проблемы.
  5. Использование контейнеров и оркестрации: Использование технологий, таких как Docker и Kubernetes, для упрощения развертывания и масштабирования приложений.

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

 

Инструменты Devops

Devops tools

devops не привязан напрямую к инструментам – незнание каких то не говорит о том, что ты не можешь быть devops или не являешься им – даже pepilenes, k8s, cloud api. Задачи devops зачастую решаются без этих/конкретных инструментов и даже без выделенной роли devops, если команда программистов/тестировщиков/автоматизаторов внедрила соответствующие практики (build/release engineer, automation, testing, monitoring, etc). По сути практикой devops может быть даже обычный bash скрипт, который смотрит наличие новых версий кода в мастере и деплоит код на сервера в продакшн.

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

  • Cloud/API
    • aws/azure/gcp/yandex/sber
  • Containers/VMs
    • hh: Cotainer/VM Security опыт в работе по обеспечению безопасности bare metal, виртуальных машин, гипервизоров, контейнерной инфраструктуры и систем оркестрации (Hardening K8s, Runtime security, Network policies, RBAC, Secret management, Container security);
    • VMware
    • KVM
    • OpenStack
    • docker
    • k8s
      • hh developer: написание helmchart и манифестов, виды деплоя, управление приложением в кластере, опыт поиска проблем связанных с развернутым в кластере приложением
      • hh performance engineer: в идеале уметь донастроить, например, увеличить выделенные ресурсы на pod
  • Отдельная статья – CI/CD
  • Отдельная статья – Инструменты SQL/NoSQL; big data; analytics
  • Отдельная статья – Monitoring
  • Отдельная статья – IaC (infra as a code)
    • git
    • terraform (о нем отдельная статья),
    • Ansible
    • puppet
    • chef
  • брокеры сообщений
    • hh: прием-отправка сообщений, создание очередей и т.п.
    • Kafka (large scale)
    • redis (large scale)
    • amazon SQS
    • RabbitMQ (small scale)
    • offload задач в фоновый режим
      • hh: использование в приложениях, внутреннее устройство
      • Celery
  • service discovery & network automation
    • Consul для динамических нод K8s конечно не нужен, но если у вас там помимо K8s прямо зоопарк, то, наверное, оправдано.
    • consul -Вместо статической конфигурации мы решили использовать Service Discovery. У нас в инфраструктуре уже давно был Hashicorp Consul (в качестве KV-хранилища), но теперь мы решили его использовать как Service Discovery для мониторинга.Для этого на каждую машину во всех наших окружениях мы установили consul-агент в режиме клиента. Через него мы начали регистрировать наши prometheus-экспортеры как сервисы в Consul. Такой способ регистрации сервиса очень удобен, потому что всю работу за нас делает нативный consul-агент, от нас требуется лишь подложить в нужное место JSON-файл. При этом обновление и дерегистрация сервиса выполняется аналогичным образом (с помощью обновления или удаления файла). Дерегистрация машин/сервисов (например, для последующего удаления машины) может также производиться с помощью штатного выключения сервиса consul на машине. При остановке consul-агент выполняет graceful-shutdown, который выполняет дерегистрацию.Кроме этого, дерегистрацию можно выполнить через Consul API.
  • WEB servers/proxy

 

Чем DevOps отличается от Agile

  • обе методологии нацелены на ускорение выпуска релизов, но devops кроме этого нацелен на то, чтобы эти релизы были так же и качественными – devops несколько расширяет agile за счет распространения практик «за релиз» на эксплуатацию/мониторинг, а не выпустили код и все, релиз состоялся
  • ускорение достигается за счет внедрения практик devops, особенно ci/cd (описание выше)
  • при этом это не противовесы, зачастую devops реализуется с waterfall или только с частично принятыми практиками agile

DevOps ((ускорение релизов за счет кооперации dev и ops; инструментов, автоматизации)) и Agile ((ускорение релизов за счет гибкости подходов разработки по новым требованиям)) – это два разных, но взаимосвязанных подхода в области разработки программного обеспечения. Они имеют разные цели и акценты, но могут дополнять друг друга. Вот основные отличия между ними:

  1. Основная цель:
    • DevOps – DevOps сконцентрирован на улучшении сотрудничества и интеграции между разработчиками (Development) и операционными специалистами (Operations) с целью автоматизации и улучшения процессов разработки и развертывания программного обеспечения.
    • Agile – Agile ориентирован на создание гибких и адаптивных процессов разработки, при которых приоритет отдается быстрому реагированию на изменения в требованиях клиентов и созданию ценных итераций продукта.
  2. Область применения:
    • DevOps – DevOps фокусируется на автоматизации и управлении инфраструктурой, континуальной интеграции, доставке и развертывании программного обеспечения, а также на мониторинге и обратной связи после развертывания.
    • Agile – Agile применяется на этапе разработки и управления требованиями, управлении проектами и командами, а также на создании ценных итераций продукта.
  3. Результат:
    • DevOps – Основной результат DevOps – это более быстрая и надежная поставка программного обеспечения, улучшение сотрудничества между командами и снижение рисков при развертывании.
    • Agile – Основной результат Agile – это более гибкий и адаптивный процесс разработки, способность быстро реагировать на изменения в требованиях и создавать продукт, отвечающий потребностям клиентов.
  4. Акцент на культуре:
    • DevOps – DevOps акцентирует внимание на культурных изменениях в организации, с целью создания совместной культуры и устранения барьеров между разработкой и операциями.
    • Agile – Agile также подчеркивает важность культурных изменений, но более ориентирован на изменения в методологиях и процессах.

Хотя DevOps и Agile имеют разные акценты, они могут дополнять друг друга. Комбинированный подход может помочь организациям создавать и поставлять программное обеспечение быстро, надежно и адаптивно, учитывая как аспекты разработки (Agile), так и аспекты развертывания и эксплуатации (DevOps).

 

В чём отличие Deployment от Delivery

“Deployment” ((развертывание)) и “Delivery” ((доставка)) – разница в том, что при deployment нет ручного подтверждения для деплоя на проде (т.е. автоматизировано заливается в prod), а в доставке есть, там деплой происходит обычно в Staging/Dev, а только после апрува в прод (т.е. автоматизированно заливается только в staging). Получается при delivery автодеплой кода происходит в staging/test, а при deployment даже в prod.

 

 

В чём разница между контейнеризацией и виртуализацией

Контейнеризация и виртуализация – это два разных метода изоляции и управления приложениями и ресурсами в вычислительных средах. Вот основные различия между ними:

  1. Уровень изоляции:
    • Контейнеризация: В контейнеризации приложения и их зависимости упаковываются в контейнеры, которые работают на уровне операционной системы (ОС). Контейнеры разделяют ядро ОС с хост-системой, но имеют свои собственные файловые системы и процессы, что делает их более легкими и быстрыми по сравнению с виртуализацией.
    • Виртуализация: Виртуализация создает виртуальные машины (ВМ), которые эмулируют полноценные физические серверы. Каждая ВМ включает в себя собственную операционную систему и ресурсы. Виртуализация работает на уровне гипервизора, который может быть гипервизором типа 1 (например, VMware ESXi) или типа 2 (например, VirtualBox).
  2. Ресурсы:
    • Контейнеризация: Контейнеры более эффективно используют ресурсы, так как они разделяют ОС и используют единое ядро для выполнения. Они обычно требуют меньше оперативной памяти и меньше вычислительных ресурсов по сравнению с виртуальными машинами.
    • Виртуализация: Виртуальные машины имеют больший оверхед из-за эмуляции аппаратных средств и полноценной операционной системы. Они обычно требуют больше вычислительных ресурсов и оперативной памяти.
  3. Изолированность:
    • Контейнеризация: Контейнеры обеспечивают относительно меньшую изолированность по сравнению с виртуальными машинами. Это означает, что, если в контейнере возникает проблема, она может повлиять на другие контейнеры, работающие на том же хосте.
    • Виртуализация: Виртуальные машины обеспечивают более жесткую изоляцию, так как каждая ВМ имеет свою собственную ОС. Проблемы в одной ВМ обычно не влияют на другие ВМ.
  4. Запуск приложений:
    • Контейнеризация: Запуск приложений в контейерах более быстр и прост, и они могут быть масштабированы более гибко.
    • Виртуализация: Запуск приложений в виртуальных машинах требует больше времени и ресурсов.

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

 

continues integration & continues deployment/delivery

Этапы CI/CD это холиварная тема, но в общем случае:

CI – процесс непрерывной интеграции, отвечает за code quality с максимально быстрым/автоматизированным получением feedback о проделанной работе: позволяет собирать/билдить, тестировать и публиковать артефакты в какое то хранилище/environment (prod/stage/qa/dev). Кодер запушил код, а CI собрал/протестировал/предоставил кодеру фидбек.

CD – деплой/деливери в какое то окружение. В отличии от CI в CD не нужен мануальный апруф для деплоя.

 

webhook в ci/cd

webhook в целом (не только в ci/cd) подразумевает вызов какого то стороннего сервиса по событию – напр. по коммиту в git с помощью webhook git/другой vcs вызывает jenkins/другую ci-cd тулу. Получается push модель вместо pull, когда jenkins опрашивает git на наличие новых версий кода.

 

Как и где хранить build артефакты
  • Артефакты бывают разные (npm пакеты, docker images)
  • Важна денежная сторона при выборе любой тулы
  • Самые известные тулы: artifactory (достаточно универсальный), nexus, разные хранилки cloud провайдеров, специфичные по хранению: docker hub (только images), eca aws (только для контейнеров)

 

как в jenkins сделать нотификацию о успешности билда

там есть post block/step которые можно выполнять после определенных условий или всегда после выполнения job

что такое immutable infrastructure

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

 

 

вопросы (из канала DevOps | Вопросы собесов)

Какой инструмент DevOps лучше всего подходит для управления конфигурацией серверов?

Jenkins
Ansible
Docker
GitLab

Ansible

Что описывает термин “Immutable Infrastructure”?

Инфраструктура, которая изменяется в реальном времени

Инфраструктура, которая не изменяется после развертывания

Инфраструктура с возможностью масштабирования

Инфраструктура, поддерживающая виртуализацию

Инфраструктура, которая не изменяется после развертывания

Какая технология позволяет создавать изолированные среды для приложений?

VirtualBox

Kubernetes

Vagrant

Docker

Docker

Какой инструмент используется для автоматизированного тестирования инфраструктуры как кода?

Terraform

Selenium

Packer

Test Kitchen

Test Kitchen

Какая система управления конфигурацией не является идемпотентной по умолчанию?

Ansible

Chef

Puppet

Bash скрипты

Bash скрипты

Что такое контейнеризация в DevOps?

Разработка приложений

Управление версиями

Изоляция зависимостей

Автоматизация тестов

Изоляция зависимостей

Какой инструмент не используется для CI/CD?

Jenkins

GitLab

Nagios

Travis Cl

Nagios

Какая система управления контейнерами лучше всего подходит для масштабирования?

Docker Swarm
Kubernetes
Mesos
OpenShift

K8s

Какой инструмент используется для автоматизации развертывания, управления и масштабирования приложений в контейнерах?
Jenkins
Kubernetes
Git
Puppet

K8s

 

 

 

 

Leave a Reply