Розширена DevSecOps пайплайн з Kubernetes, AWS та GitOps

pic

Вступ до проєкту:

Ласкаво просимо до посібника з проекту End-to-End DevSecOps для Kubernetes! У цьому всебічному проєкті ми пройдемо через процес налаштування надійної тришарової архітектури на AWS з використанням Kubernetes, найкращих практик DevOps та заходів безпеки. Цей проєкт має на меті надати практичний досвід у розгортанні, забезпеченні безпеки та моніторингу масштабованого середовища застосунків.

Огляд проєкту:

У цьому проєкті ми охопимо такі основні аспекти:

  1. Налаштування користувача IAM: Створення користувача IAM на AWS з необхідними правами доступу для полегшення діяльності з розгортання та керування.
  2. Інфраструктура як код (IaC): Використання Terraform та AWS CLI для налаштування сервера Jenkins (EC2 інстанція) на AWS.
  3. Розгортання сервера Jenkins: Розгортання сервера Jenkins за допомогою Terraform.
  4. Налаштування сервера Jenkins: Встановлення та налаштування основних інструментів на сервері Jenkins, зокрема самого Jenkins, Docker, Sonarqube, Terraform, Kubectl, AWS CLI та Trivy.
  5. Розгортання EKS кластера: Розгортання Amazon EKS кластера — керованої служби Kubernetes на AWS за допомогою Terraform.
  6. Розгортання Jumper сервера: Для комунікації з EKS кластером, який знаходиться в приватній підмережі, розгортаємо Jumper сервер через консоль AWS.
  7. Налаштування балансувальника навантаження: Налаштування AWS Application Load Balancer (ALB) для EKS кластера.
  8. Репозиторії Amazon ECR: Створення приватних репозиторіїв для Docker образів фронтенду та бекенду в Amazon Elastic Container Registry (ECR).
  9. Інсталяція ArgoCD: Встановлення та налаштування ArgoCD для безперервної доставки та GitOps.
  10. Інтеграція Sonarqube: Інтеграція Sonarqube для аналізу якості коду в конвеєрі DevSecOps.
  11. Jenkins пайплайни з GitHub Webhook: Створення Jenkins пайплайнів для розгортання коду бекенду та фронтенду на EKS кластері з автоматичним запуском пайплайнів за допомогою Git Webhook.
  12. Розгортання застосунку ArgoCD: Використання ArgoCD для розгортання тришарового застосунку, включаючи компоненти бази даних, бекенду, фронтенду та ingress.
    13.
    pic

Вступ до проєкту:

Ласкаво просимо до посібника з проєкту End-to-End DevSecOps для Kubernetes! У цьому всебічному проєкті ми пройдемо через процес налаштування надійної тришарової архітектури на AWS з використанням Kubernetes, найкращих практик DevOps та заходів безпеки. Цей проєкт має на меті надати практичний досвід у розгортанні, забезпеченні безпеки та моніторингу масштабованого середовища застосунків.

Огляд проєкту:

У цьому проєкті ми охопимо такі основні аспекти:

  1. Налаштування користувача IAM: Створення користувача IAM на AWS з необхідними правами доступу для полегшення діяльності з розгортання та керування.
  2. Інфраструктура як код (IaC): Використання Terraform та AWS CLI для налаштування сервера Jenkins (EC2 інстанція) на AWS.
  3. Розгортання сервера Jenkins: Розгортання сервера Jenkins за допомогою Terraform.
  4. Налаштування сервера Jenkins: Встановлення та налаштування основних інструментів на сервері Jenkins, зокрема самого Jenkins, Docker, Sonarqube, Terraform, Kubectl, AWS CLI та Trivy.
  5. Розгортання EKS кластера: Розгортання Amazon EKS кластера — керованої служби Kubernetes на AWS за допомогою Terraform.
  6. Розгортання Jumper сервера: Для комунікації з EKS кластером, який знаходиться в приватній підмережі, розгортаємо Jumper сервер через консоль AWS.
  7. Налаштування балансувальника навантаження: Налаштування AWS Application Load Balancer (ALB) для EKS кластера.
  8. Репозиторії Amazon ECR: Створення приватних репозиторіїв для Docker образів фронтенду та бекенду в Amazon Elastic Container Registry (ECR).
  9. Інсталяція ArgoCD: Встановлення та налаштування ArgoCD для безперервної доставки та GitOps.
  10. Інтеграція Sonarqube: Інтеграція Sonarqube для аналізу якості коду в конвеєрі DevSecOps.
  11. Jenkins пайплайни з GitHub Webhook: Створення Jenkins пайплайнів для розгортання коду бекенду та фронтенду на EKS кластері з автоматичним запуском пайплайнів за допомогою Git Webhook.
  12. Розгортання застосунку ArgoCD: Використання ArgoCD для розгортання тришарового застосунку, включаючи компоненти бази даних, бекенду, фронтенду та ingress.

Налаштування моніторингу:

Налаштування моніторингу для EKS кластера за допомогою Helm, Prometheus та Grafana.

Попередні вимоги:

Перед тим, як розпочати проєкт, переконайтесь, що у вас є наступні попередні вимоги:

  • Обліковий запис AWS з необхідними правами для створення ресурсів.
  • Встановлені Terraform та AWS CLI на вашому локальному комп'ютері.
  • Базові знання Kubernetes, Docker, Jenkins та принципів DevOps.

Крок 1: Створимо користувача IAM і згенеруємо ключ доступу AWS

Створіть нового користувача IAM на AWS та надайте йому права AdministratorAccess для тестових цілей (не рекомендується для проєктів вашої організації).

Перейдіть до сервісу AWS IAM і натисніть на Users.

pic

Натисніть на Create user

pic

Введіть ім'я для вашого користувача і натисніть Next.

pic

Виберіть опцію Attach policies directly і шукайте AdministratorAccess, потім виберіть її.

Натисніть Next.

pic

Натисніть Create user

pic

Тепер виберіть створеного користувача, потім натисніть на Security credentials та згенеруйте ключ доступу, натиснувши Create access key.

pic

Виберіть Command Line Interface (CLI), поставте галочку для підтвердження і натисніть Next.

pic

Введіть Description і натисніть Create access key.

pic

Тепер ви побачите ваші облікові дані, а також зможете завантажити CSV файл для майбутнього використання.

pic

Крок 2: Встановимо Terraform та AWS CLI для розгортання сервера Jenkins (EC2) на AWS

Встановіть і налаштуйте Terraform та AWS CLI на вашому локальному комп'ютері для створення сервера Jenkins на AWS Cloud.

Скрипт встановлення Terraform

wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg - dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg  
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list  
sudo apt update  
sudo apt install terraform -y

Скрипт встановлення AWS CLI

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"  
sudo apt install unzip -y  
unzip awscliv2.zip  
sudo ./aws/install

Тепер налаштуємо обидва інструменти.

Налаштування Terraform

Редагуйте файл /etc/environment за допомогою команди нижче, додайте виділені рядки та введіть ваші ключі в простір для вводу.

sudo vim /etc/environment

pic

Після внесення змін перезавантажте вашу машину, щоб зміни у змінних середовища вступили в силу.

Налаштування AWS CLI

Виконайте команду нижче та додайте ваші ключі.

aws configure

pic

Крок 3: Розгорнемо сервер Jenkins (EC2) за допомогою Terraform

Клонуйте Git репозиторій - посилання

Перейдіть до Jenkins-Server-TF

Зробіть деякі зміни у файлі backend.tf, такі як зміна імені bucket і dynamodb таблиці (переконайтеся, що ви створили обидва вручну в AWS Cloud).

pic

Тепер замініть ім'я Pem файлу, якщо ваш файл має інше ім'я.
Щоб вказати ім'я Pem файлу, який вже створений на AWS

pic

Ініціалізуйте бекенд, виконавши наступну команду

terraform init

pic

Виконайте наступну команду для перевірки наявності синтаксичних помилок

terraform validate

pic

Виконайте наступну команду, щоб отримати план того, які AWS сервіси будуть створені.

terraform plan -var-file=variables.tfvars

pic

Тепер виконайте наступну команду, щоб створити інфраструктуру на AWS Cloud, що займе максимум 3-4 хвилини

terraform apply -var-file=variables.tfvars --auto-approve

pic

Тепер підключіться до вашого Jenkins-сервера, натиснувши на Connect.

pic

Скопіюйте команду ssh та вставте її на вашому локальному комп'ютері.

pic

Крок 4: Налаштування Jenkins

Тепер ми увійшли до нашого Jenkins сервера.

pic

Ми встановили кілька сервісів, таких як Jenkins, Docker, Sonarqube, Terraform, Kubectl, AWS CLI та Trivy.

Давайте перевіримо, чи все правильно встановлено.

java --version  
jenkins --version  
docker --version  
docker ps  
terraform --version  
kubectl version  
aws --version  
trivy --version  
eksctl version

pic

pic

Тепер ми повинні налаштувати Jenkins.
Отже, скопіюйте публічну IP-адресу вашого сервера Jenkins і вставте її у ваш улюблений браузер з портом 8080.

pic

Для пароля адміністратора введіть нижче наведену команду на сервері Jenkins.

sudo systemctl status jenkins.service

pic

Натискайте Install suggested plugins (Встановити рекомендовані плагіни).

pic

Плагіни будуть встановлені.

pic

Після встановлення плагінів натискайте Continue as admin (Продовжити як адміністратор).

pic

Натискайте Save and Finish (Зберегти та завершити).

pic

Натискайте Start using Jenkins (Розпочати використання Jenkins).

pic

Панель інструментів Jenkins виглядатиме, як показано нижче.

pic

Крок 5: Розгорнемо EKS кластер за допомогою Terraform

Тепер поверніться до терміналу вашого сервера Jenkins і налаштуйте AWS.

pic

Перейдіть у Manage Jenkins (Керування Jenkins).

Натискайте на Plugins (Плагіни).

pic

У розділі Available plugins (Доступні плагіни) встановіть наступні плагіни і натискайте Install (Встановити):

AWS Credentials (Облікові дані AWS)

Pipeline: AWS Steps (Конвеєр: кроки AWS)

Pipeline: Stage View (Конвеєр: перегляд етапів)

pic

Після того, як плагіни будуть встановлені, перезавантажте сервіс Jenkins, поставивши галочку на Restart Jenkins (Перезавантажити Jenkins).

pic

Знову увійдіть у ваш сервер Jenkins.

pic

Тепер, щоб отримати доступ до ресурсів AWS, потрібно налаштувати облікові дані AWS у Jenkins.

Перейдіть у Manage Plugins (Керування плагінами) і натискайте на Credentials (Облікові дані).

pic

Натискайте на global. (глобальні).

pic

Виберіть AWS Credentials (Облікові дані AWS) як Kind (Тип) і введіть ID, як показано на нижньому знімку, крім вашого Access Key і Secret Access Key для AWS, після чого натискайте Create (Створити).

pic

Облікові дані виглядатимуть наступним чином.

pic

Тепер ми будемо створювати кластер EKS за допомогою Terraform, тому нам потрібно підключити Jenkins до Terraform.

Перейдіть у Manage Jenkins (Керування Jenkins).

Натискайте на Plugins (Плагіни).

pic

У розділі Available plugins (Доступні плагіни) введіть terraform і натискайте Install & Restart (Встановити та перезавантажити).

pic

Перейдіть до налаштувань інструментів і введіть шлях до Terraform або встановіть його.

pic

Розгорніть кластер EKS за допомогою Jenkins Pipeline. Для цього потрібні файли Terraform та Jenkinsfile, які можна знайти в моєму репозиторії на GitHub -> https://github.com/Bazith1/Three-Tier-Project.

Клонуйте репозиторій і запустіть конвеєр, використовуючи Jenkinsfile для розгортання кластера EKS.

Крок 6: Розгорнемо Jump Server через консоль AWS

Jump Server — для підключення до Pods EKS кластера через Kubectl.

pic

Створіть Jump Server через EC2.

pic

Виберіть інстанс типу medium, без необхідності використання ключів.

pic

Створіть Jump Server у VPC кластера EKS в публічній підмережі та дозволіть доступ по SSH за допомогою груп безпеки.
pic

Виберіть 30 ГБ для EBS тома (EBS Volume).

pic

У розділі Advanced details (Додаткові деталі) виберіть профіль інстанса Jenkins (Jenkins-Instance-Profile) для комунікації з іншими сервісами.

pic

Змініть IMDS на "Optional" (Необов'язковий).

pic

Скопіюйте команди нижче в сценарій користувача (user-data-script), щоб завантажити Jump Server із необхідними пакетами.

#!/bin/bash  

# Оновлення системних пакетів  
sudo apt update -y  

# Встановлення AWS CLI  
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"  
sudo apt install unzip -y  
unzip awscliv2.zip  
sudo ./aws/install  

# Встановлення Kubectl  
sudo apt install curl -y  
sudo curl -LO "https://dl.k8s.io/release/v1.28.4/bin/linux/amd64/kubectl"  
sudo chmod +x kubectl  
sudo mv kubectl /usr/local/bin/  
kubectl version --client || echo "Kubectl installation failed."  


# Встановлення eksctl  
curl -s --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp  
sudo mv /tmp/eksctl /usr/local/bin  
eksctl version || echo "eksctl installation failed."  

# Встановлення Helm  
sudo apt install snapd -y  
sudo snap install helm --classic

Потім запустіть інстанс і підключіться до нього через SSH.

Перевіримо, чи всі чотири пакети встановлені.

kubectl version  
aws --version  
helm version  
eksctl version

Налаштування AWS CLI

Запустіть команду нижче та додайте свої ключі.

aws configure

Далі налаштуйте Kubeconfig для доступу до EKS кластера.

aws eks update-kubeconfig --name Bazith-lgUXahBU --region ap-south-1

Після створення Jump Server перевірте, чи ваші вузли готові, за допомогою команди нижче.

kubectl get nodes

pic

Крок 7: Тепер ми налаштуємо балансувальник навантаження (Load Balancer) на EKS, оскільки наш додаток матиме контролер входу (Ingress Controller).

Завантажте політику для балансувальника навантаження.

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json

pic

Створіть політику IAM за допомогою команди нижче.

aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document file://iam_policy.json

pic

Створіть постачальника OIDC (OIDC Provider).

eksctl utils associate-iam-oidc-provider --region=ap-south-1 --cluster= Bazith-lgUXahBU --approv

pic

Створіть обліковий запис сервісу (Service Account) за допомогою команди нижче, замінивши ID облікового запису на ваш.

eksctl create iamserviceaccount --cluster=Bazith-lgUXahBU --namespace=kube-system --name=aws-load-balancer-controller --role-name AmazonEKSLoadBalancerControllerRole --attach-policy-arn=arn:aws:iam::954976293772:policy/AWSLoadBalancerControllerIAMPolicy --approve --region=ap-south-1

pic

Запустіть команду нижче, щоб розгорнути контролер AWS Load Balancer.

helm repo add eks https://aws.github.io/eks-charts  
helm repo update eks  
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=Bazith-lgUXahBU --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller --set region=ap-south-1 --set vpcId=vpc-02df2241d6b92dd09

Через 2 хвилини виконайте команду нижче, щоб перевірити, чи працюють ваші Pods.

kubectl get deployment -n kube-system aws-load-balancer-controller

pic
Якщо ваші pods мають статус "Error" або "CrashLoopBackOff", скористайтеся командою нижче

helm upgrade -i aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=Bazith-lgUXahBU --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller-1 --set region=ap-south-1 --set vpcId=vpc-02df2241d6b92dd09

Крок 8: Тепер нам потрібно створити приватні репозиторії Amazon ECR для обох рівнів (Frontend та Backend)

Натисніть "Create repository" (Створити репозиторій).

pic

Виберіть опцію Private (Приватний), щоб створити репозиторій, та натисніть Save (Зберегти).

pic

Те саме зробіть для репозиторію backend, потім натисніть Save (Зберегти).

pic

Тепер ми налаштували наш приватний репозиторій ECR.

pic

Тепер потрібно налаштувати ECR локально, оскільки ми маємо завантажити наші образи в Amazon ECR.

Скопіюйте першу команду для входу.

pic

Тепер запустіть скопійовану команду на Jenkins Server (Сервері Jenkins).

pic

Крок 9: Встановлення та налаштування ArgoCD

Ми будемо встановлювати ArgoCD.

Для цього створіть окремий простір і застосуйте конфігурацію argocd для інсталяції.

kubectl create namespace argocd  
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.4.7/manifests/install.yaml

pic

Всі pods повинні бути в стані "Running" (Запущено), для перевірки виконайте команду нижче

kubectl get pods -n argocd

pic

Тепер виставимо сервер argoCD як LoadBalancer за допомогою команди нижче

kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'

pic

Ви можете перевірити, чи створено Load Balancer, зайшовши в AWS Console (Консоль AWS).

pic

Для доступу до argoCD, скопіюйте DNS Load Balancer і введіть його в улюблений браузер.

Ви отримаєте попередження, подібне до цього фрагмента.

Натисніть Advanced (Додатково).

pic

Натисніть на посилання, яке з'являється під Hide advanced (Сховати додатково).

pic

Тепер нам потрібно отримати пароль для нашого сервера argoCD для виконання деплойменту.

kubectl get secrets -n argocd

pic

kubectl edit secret argocd-initial-admin-secret -n argocd

pic

Скопіюйте пароль та декодуйте його за допомогою команди

echo $(echo RmpiMGNsZnN0MnFvbzVuZg== | base64 --decode)

Введіть ім'я користувача (admin) і пароль в argoCD, а потім натисніть SIGN IN (Увійти).

pic

Ось наш Дашборд ArgoCD.

Крок 10: Тепер налаштуємо SonarQube для нашого DevSecOps Pipeline

Для цього скопіюйте публічну IP-адресу вашого Jenkins Server та вставте її в улюблений браузер з портом 9000.

Ім'я користувача та пароль буде admin.

Натисніть Log In (Увійти).

pic

Оновіть пароль.

pic

Натисніть Administration (Адміністрування), потім Security (Безпека), і виберіть Users (Користувачі).

pic

Натисніть Update tokens (Оновити токени).

pic

Натисніть Generate (Генерувати).
pic

Скопіюйте токен, збережіть його в безпечному місці і натисніть Done (Готово).

pic

Тепер нам потрібно налаштувати webhooks (вебхуки) для перевірки якості коду.

Натисніть Administration (Адміністрування), потім Configuration (Конфігурація) і виберіть Webhooks (Вебхуки).

pic

Натисніть Create (Створити).

pic

Введіть назву вашого проекту, а в полі URL вкажіть публічну IP-адресу вашого Jenkins Server (Сервера Jenkins) з портом 8080 і додайте в кінці sonarqube-webhook, після чого натисніть Create (Створити).

http://:8080/sonarqube-webhook/

pic

Тут ви можете побачити webhook.

pic

Тепер нам потрібно створити проект для frontend (фронтенд) коду.

Натисніть Manually (Вручну).

pic

Введіть відображувану назву вашого Project (Проекту) і натисніть Setup (Налаштувати).

pic

Натисніть Locally (Локально).

pic

Виберіть Use existing token (Використовувати наявний токен) і натисніть Continue (Продовжити).

pic

Виберіть Other (Інше) і Linux (Лінукс) як операційну систему.

Після виконання цих кроків ви отримаєте команду, яку можна побачити в наступному фрагменті.

Тепер використайте цю команду в Jenkins Frontend Pipeline (Пайплайн для фронтенду), де буде виконуватися перевірка якості коду.

pic

Тепер нам потрібно створити проект для backend (бекенд) коду.

Натисніть Create Project (Створити проект).

pic

Введіть назву вашого проекту і натисніть Set up (Налаштувати).

pic

Натисніть Locally (Локально).

pic

Виберіть Use existing token (Використовувати наявний токен) і натисніть Continue (Продовжити).

pic

Виберіть Other (Інше) і Linux (Лінукс) як операційну систему.

Після виконання цих кроків ви отримаєте команду, яку можна побачити в наступному фрагменті.

Тепер використайте цю команду в Jenkins Backend Pipeline (Пайплайн для бекенду), де буде виконуватися перевірка якості коду.

pic

Тепер потрібно зберегти облікові дані Sonar.

Перейдіть до Dashboard -> Manage Jenkins -> Credentials (Дашборд -> Керувати Jenkins -> Облікові дані).

Виберіть тип Secret text (Тайний текст), вставте ваш токен SonarQube в Secret (Тайна інформація) і залиште інші поля незмінними.

Натисніть Create (Створити).

pic

Тепер нам потрібно зберегти GitHub Personal access token (Токен особистого доступу GitHub), щоб здійснити пуш змін до файлу деплойменту, який буде змінений у самому пайплайні для образу ECR.

Додайте облікові дані GitHub (Add GitHub credentials).

Виберіть тип Secret text (Тайний текст) і вставте ваш GitHub Personal access token (не пароль) в Secret (Тайна інформація), залишаючи інші поля незмінними.
Також створіть токен з правами адміністратора, щоб ви могли читати і записувати.

pic

pic

Натисніть Create (Створити).

Примітка: Якщо ви ще не створили ваш токен, спочатку створіть його, а потім вставте в Jenkins.

pic

Тепер, відповідно до нашого пайплайну, нам потрібно додати Account ID (Ідентифікатор облікового запису) в облікові дані Jenkins, через URI репозиторію ECR.

Виберіть тип Secret text (Тайний текст), вставте ваш AWS Account ID (Ідентифікатор облікового запису AWS) в Secret (Тайна інформація) і залиште інші поля незмінними.

Натисніть Create (Створити).

pic

Тепер нам потрібно вказати ім’я нашого ECR образу для фронтенду, яке є frontend.

Виберіть тип Secret text (Тайний текст), вставте ім’я вашого фронтенд-репозиторію в Secret (Тайна інформація) і залиште інші поля незмінними.

Натисніть Create (Створити).

pic

Тепер нам потрібно вказати ім’я нашого ECR образу для бекенду, яке є backend.

Виберіть тип Secret text (Тайний текст), вставте ім’я вашого бекенд-репозиторію в Secret (Тайна інформація) і залиште інші поля незмінними.

Натисніть Create (Створити).

pic

Останній фрагмент усіх облікових даних, які нам потрібні для реалізації цього проекту.

pic

Крок 11: Встановіть необхідні плагіни і налаштуйте їх для деплою нашого тришарового додатку

Встановіть наступні плагіни, перейшовши до Dashboard -> Manage Jenkins -> Plugins -> Available Plugins (Дашборд -> Керувати Jenkins -> Плагіни -> Доступні плагіни).

Docker  
Docker Commons  
Docker Pipeline  
Docker API  
docker-build-step  
Eclipse Temurin installer  
NodeJS  
OWASP Dependency-Check  
SonarQube Scanner

pic

Тепер нам потрібно налаштувати встановлені плагіни.

Перейдіть до Dashboard -> Manage Jenkins -> Tools (Дашборд -> Керувати Jenkins -> Інструменти).

Ми налаштовуємо jdk.

Пошукайте jdk і надайте конфігурацію, як в наступному фрагменті.

pic

Тепер ми налаштуємо sonarqube-scanner.

Пошукайте sonarqube scanner і надайте конфігурацію, як в наступному фрагменті.

pic

Тепер ми налаштуємо nodejs.

Пошукайте node і надайте конфігурацію, як в наступному фрагменті.

pic

Тепер ми налаштуємо OWASP Dependency check (Перевірка залежностей OWASP).

Пошукайте Dependency-Check і надайте конфігурацію, як в наступному фрагменті.

pic

Тепер ми налаштуємо docker.

Пошукайте docker і надайте конфігурацію, як в наступному фрагменті.

pic

Тепер нам потрібно вказати шлях до Sonarqube в Jenkins.

Перейдіть до Dashboard -> Manage Jenkins -> System (Дашборд -> Керувати Jenkins -> Система).

Пошукайте SonarQube installations (Інсталяції SonarQube).

Вкажіть назву, як вказано, потім в полі Server URL (URL сервера) скопіюйте публічну IP-адресу SonarQube (таку ж, як у Jenkins) з портом 9000, виберіть токен Sonar, який ми додали нещодавно, і натисніть Apply & Save (Застосувати та зберегти).

pic

Тепер ми готові створити наш Jenkins Pipeline (Пайплайн Jenkins) для деплою нашого фронтенд-коду.

Перейдіть до Jenkins Dashboard (Дашборд Jenkins).

Натисніть New (Новий) Item (Елемент).

Введіть назву вашого Pipeline (Пайплайну) і натисніть OK.

pic

Ми будемо активувати webhook, щоб щоразу, коли розробник пушить код в репозиторій, цей Jenkins пайплайн автоматично спрацьовував.

Увімкніть Github hook trigger for GITScm Polling (Тригер хуку GitHub для опитування GITScm).

pic
Тепер використовуйте файл Jenkins з репозиторію GitHub, виберіть скрипт пайплайну з SCM і надайте ваше Github url і пароль.

pic

Вкажіть шлях до вашого Jenkins File (Файл Jenkins).

pic

Це файл Jenkins для деплою фронтенд-коду на EKS.

Скопіюйте і вставте його в Jenkins.

https://github.com/Bazith1/Three-Tier-Project/blob/main/Jenkins-Pipeline-Code/Jenkinsfile-Frontend

Натисніть Apply (Застосувати) & Save (Зберегти).

pic

Тепер натискаємо на build (будувати).

Наш пайплайн був успішним після деяких поширених помилок.

Примітка: Зробіть зміни в пайплайні відповідно до вашого проєкту.

pic

pic

Щоб активувати Jenkins за допомогою хуку GitHub, нам потрібно увімкнути webhook в GitHub.

Створення Webhook

Перейдіть до вашого репозиторію на GitHub, перейдіть до Settings > Webhooks > Add Webhook (Налаштування > Webhooks > Додати Webhook).

pic

Надайте наступні дані:

  • Payload URL: URL сервера Jenkins з кінцевою точкою webhook:
http://13.234.113.95:8080/github-webhook/
  • Content type: Встановіть application/json.
  • Events: Виберіть Just the push event (Тільки подія push) або Let me select individual events (Дозволити вибрати окремі події), щоб вказати тригери.
  • Activate: Переконайтеся, що webhook активовано.
  • Збережіть webhook.
  • Перевірте підключення Webhook.

Тепер ми готові створити наш Jenkins Pipeline (Пайплайн Jenkins) для деплою бекенд-коду.

Перейдіть до Jenkins Dashboard (Дашборд Jenkins).

Натисніть New (Новий) Item (Елемент).

pic

Введіть назву вашого Pipeline (Пайплайну) і натисніть OK.

pic

Ми будемо активувати webhook, щоб кожного разу, коли розробник пушить код до репозиторію, цей Jenkins пайплайн автоматично спрацьовував.

Увімкніть Github hook trigger for GITScm Polling (Тригер хуку GitHub для опитування GITScm).

pic

Це файл Jenkins для деплою бекенд-коду на EKS.

Скопіюйте і вставте його в Jenkins.

https://github.com/Bazith1/Three-Tier-Project/blob/main/Jenkins-Pipeline-Code/Jenkinsfile-Backend

Натисніть Apply (Застосувати) & Save (Зберегти).

pic

Тепер натискаємо на build (будувати).

Наш пайплайн був успішним після деяких поширених помилок.

Примітка: Зробіть зміни в пайплайні відповідно до вашого проєкту.

pic

Отже, ми вже налаштували GitHub hook для активації Jenkins, і він автоматично запустить пайплайн для бекенду так само.

Крок 12: Ми розгорнемо наш Тришаровий додаток за допомогою ArgoCD.

Оскільки наш репозиторій є приватним.
Отже, нам потрібно налаштувати приватний репозиторій в ArgoCD.

Ми будемо розгортати наш додаток на просторі тришарової інфраструктури. Для цього створимо простір тришарової інфраструктури на EKS.

kubectl create namespace three-tier

pic

Як ви знаєте, наші два репозиторії ECR є приватними. Тому, коли ми намагатимемося запушити зображення в репозиторії ECR, ми отримаємо помилку Imagepullerror.

Щоб позбутися цієї помилки, ми створимо секрет для нашого репозиторію ECR за допомогою наведеного нижче команди, а потім додамо цей секрет до файлу деплойменту.

Примітка: Секрети беруться з файлу .docker/config.json, який створюється під час входу в ECR на попередніх етапах.

kubectl create secret generic ecr-registry-secret \  
 --from-file=.dockerconfigjson=${HOME}/.docker/config.json \  
 --type=kubernetes.io/dockerconfigjson --namespace three-tier  
kubectl get secrets -n three-tier

pic

Натискаємо на Settings (Налаштування) та вибираємо Repositories (Репозиторії).

pic

Натискаємо на CONNECT REPO USING HTTPS (Підключити репозиторій через HTTPS).

pic

Тепер надаємо ім’я репозиторію, де зберігаються ваші файли Manifests.

Надаємо ім’я користувача та персональний токен доступу GitHub і натискаємо CONNECT (Підключити).

pic

Якщо ваш Connection Status (Статус підключення) показує Successful (Успішно), це означає, що репозиторій успішно підключено.

pic

Тепер створимо наш перший додаток, яким буде база даних.

Натискаємо на CREATE APPLICATION (Створити додаток).

pic

Заповніть деталі так, як зазначено в наступному фрагменті, і прокрутіть вниз.

pic

Виберіть той самий репозиторій, який ви налаштували на попередньому етапі.

У полі Path вкажіть місце розташування ваших файлів Manifests та заповніть інші параметри, як показано на нижньому скріншоті.

Натискаємо CREATE (Створити).

pic

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

Заповніть деталі так, як зазначено в наступному фрагменті, і прокрутіть вниз.

pic

Виберіть той самий репозиторій, який ви налаштували на попередньому етапі.

У полі Path вкажіть місце розташування ваших файлів Manifests та заповніть інші параметри, як показано на нижньому скріншоті.

Натискаємо CREATE (Створити).

pic

Як тільки ваш додаток Ingress буде розгорнуто.
Це створить Application Load Balancer.

Ви можете перевірити створений балансувальник навантаження з ім'ям k8s-three.

pic

Тепер скопіюйте ALB-DNS та перейдіть до вашого постачальника домену, у моєму випадку постачальник домену — Porkbun.

Перейдіть до DNS і додайте запис типу CNAME, де вказуєте хостнейм backend, а в полі "Answer" (Відповідь) додаєте ваш ALB та натискаєте Save.

Примітка: Я створив піддомен backend.amanpathakdevops.study.

pic

Ви можете побачити всі 4 розгортання додатків у наведеному фрагменті.

pic

Тепер через 2-3 хвилини перейдіть до вашого піддомену у браузері, щоб побачити результат.

pic

Ось це — розгортання додатку Ingress в ArgoCD.

pic

Ось це — розгортання додатку Frontend в ArgoCD.

pic

Ось це — розгортання додатку Backend в ArgoCD.

pic

Ось це — розгортання додатку Database в ArgoCD.

pic

Якщо ви звернете увагу, ми налаштували Persistent Volume (Постійний том) та Persistent Volume Claim (Запит на постійний том). Тому, якщо контейнери будуть видалені, дані не будуть втрачені. Дані збережуться на хост-машині.

Щоб перевірити це, видалімо обидва контейнери бази даних.

pic

Тепер буде запущено нові контейнери.

pic

І ваш додаток не втратить жодного шматочка даних.

Крок 12: Ми налаштуємо моніторинг для нашого EKS кластеру.

Ми можемо моніторити специфікації кластера та інші необхідні речі.

Моніторинг ми будемо реалізовувати за допомогою Helm.
Додайте репозиторій Prometheus за допомогою наступної команди

helm repo add stable https://charts.helm.sh/stable

pic

Встановіть Prometheus

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts  
helm install prometheus prometheus-community/prometheus  
helm repo add grafana https://grafana.github.io/helm-charts  
helm repo update  
helm install grafana grafana/grafana

pic

Тепер перевірте сервіс за допомогою наступної команди

kubectl get svc

pic

Тепер нам потрібно отримати доступ до консолей Prometheus та Grafana ззовні кластера.

Для цього нам потрібно змінити тип сервісу з ClusterType на LoadBalancer.

Редагуйте сервіс stable-kube-prometheus-sta-prometheus

kubectl edit svc stable-kube-prometheus-sta-prometheus

pic

Зміна на 48-й лінії з ClusterType на LoadBalancer

pic

Редагуйте сервіс stable-grafana

kubectl edit svc stable-grafana

pic

Зміна на 39-й лінії з ClusterType на LoadBalancer

pic

Тепер, якщо ви ще раз перераховуєте сервіси, то побачите DNS-ім’я LoadBalancers.

kubectl get svc

pic

Ви також можете перевірити це через вашу консоль.

pic

Тепер перейдіть до вашої панелі керування Prometheus.

Вставте :9090 у вашому улюбленому браузері, і ви побачите ось таке

pic

Натисніть на Status та виберіть Target.

Ви побачите багато цілей

pic

Тепер перейдіть до вашої Grafana панелі керування.

Скопіюйте ALB DNS Grafana і вставте в ваш улюблений браузер.

Ім'я користувача буде admin, а пароль prom-operator для входу в Grafana.

pic

Тепер натискайте на Data Source.

pic

Виберіть Prometheus.

pic

У Connection вставте ваше :9090.

pic

Якщо URL правильний, ви побачите зелене повідомлення.

Натискайте Save та Test.

pic

Тепер ми створимо панель керування для візуалізації журналів Kubernetes Cluster.

Натискайте на Dashboard.

pic

Як тільки ви натискаєте на Dashboard, ви побачите багато компонентів Kubernetes для моніторингу.

pic

Спробуємо імпортувати тип панелі керування для Kubernetes.

Натискайте на New і виберіть Import.

pic

Введіть 6417 ID і натискайте Load або використовуйте ID 17375.

Примітка: 6417 — це унікальний ID від Grafana, який використовується для моніторингу та візуалізації даних Kubernetes.

pic

Виберіть data source, який ви створили раніше, і натискайте Import.

pic

Ось і все.

Тепер ви можете переглядати дані вашого Kubernetes Cluster.
Не соромтеся досліджувати інші деталі Kubernetes Cluster.

pic

pic

Тепер ви можете побачити вашу панель Grafana для перегляду даних EKS, таких як поди, простори імен (namespace), деплойменти тощо.

pic

Якщо ви хочете моніторити трирівневий простір імен.

У просторі імен замініть "three-tier" на інший простір імен.

Ви побачите деплойменти, які були виконані за допомогою ArgoCD.

Висновок:

У цьому комплексному проекті DevSecOps для Kubernetes ми успішно:

  • Створили користувача IAM та налаштували Terraform для AWS.
  • Розгорнули Jenkins на AWS, налаштували інструменти та інтегрували їх з Sonarqube.
  • Налаштували кластер EKS, конфігурували Load Balancer та створили приватні репозиторії ECR.
  • Реалізували моніторинг за допомогою Helm, Prometheus та Grafana.
  • Встановили та налаштували ArgoCD для практик GitOps.
  • Створили Jenkins пайплайни для CI/CD, розгорнувши Three-Tier додаток.
  • Забезпечили збереження даних за допомогою постійних томів (Persistent Volumes) та запитів на збереження томів (Persistent Volume Claims).

Підтримайте мою роботу

Залишайтеся на зв'язку через LinkedIn: LinkedIn Profile

Будьте в курсі новин через GitHub: GitHub Profile

Не соромтеся звертатися до мене, якщо у вас є інші запитання.

Щасливого навчання!

Перекладено з: Advanced DevSecOps Pipeline with Kubernetes, AWS, and GitOps

Leave a Reply

Your email address will not be published. Required fields are marked *