Вступ до проєкту:
Ласкаво просимо до посібника з проекту End-to-End DevSecOps для Kubernetes! У цьому всебічному проєкті ми пройдемо через процес налаштування надійної тришарової архітектури на AWS з використанням Kubernetes, найкращих практик DevOps та заходів безпеки. Цей проєкт має на меті надати практичний досвід у розгортанні, забезпеченні безпеки та моніторингу масштабованого середовища застосунків.
Огляд проєкту:
У цьому проєкті ми охопимо такі основні аспекти:
- Налаштування користувача IAM: Створення користувача IAM на AWS з необхідними правами доступу для полегшення діяльності з розгортання та керування.
- Інфраструктура як код (IaC): Використання Terraform та AWS CLI для налаштування сервера Jenkins (EC2 інстанція) на AWS.
- Розгортання сервера Jenkins: Розгортання сервера Jenkins за допомогою Terraform.
- Налаштування сервера Jenkins: Встановлення та налаштування основних інструментів на сервері Jenkins, зокрема самого Jenkins, Docker, Sonarqube, Terraform, Kubectl, AWS CLI та Trivy.
- Розгортання EKS кластера: Розгортання Amazon EKS кластера — керованої служби Kubernetes на AWS за допомогою Terraform.
- Розгортання Jumper сервера: Для комунікації з EKS кластером, який знаходиться в приватній підмережі, розгортаємо Jumper сервер через консоль AWS.
- Налаштування балансувальника навантаження: Налаштування AWS Application Load Balancer (ALB) для EKS кластера.
- Репозиторії Amazon ECR: Створення приватних репозиторіїв для Docker образів фронтенду та бекенду в Amazon Elastic Container Registry (ECR).
- Інсталяція ArgoCD: Встановлення та налаштування ArgoCD для безперервної доставки та GitOps.
- Інтеграція Sonarqube: Інтеграція Sonarqube для аналізу якості коду в конвеєрі DevSecOps.
- Jenkins пайплайни з GitHub Webhook: Створення Jenkins пайплайнів для розгортання коду бекенду та фронтенду на EKS кластері з автоматичним запуском пайплайнів за допомогою Git Webhook.
- Розгортання застосунку ArgoCD: Використання ArgoCD для розгортання тришарового застосунку, включаючи компоненти бази даних, бекенду, фронтенду та ingress.
13.
Вступ до проєкту:
Ласкаво просимо до посібника з проєкту End-to-End DevSecOps для Kubernetes! У цьому всебічному проєкті ми пройдемо через процес налаштування надійної тришарової архітектури на AWS з використанням Kubernetes, найкращих практик DevOps та заходів безпеки. Цей проєкт має на меті надати практичний досвід у розгортанні, забезпеченні безпеки та моніторингу масштабованого середовища застосунків.
Огляд проєкту:
У цьому проєкті ми охопимо такі основні аспекти:
- Налаштування користувача IAM: Створення користувача IAM на AWS з необхідними правами доступу для полегшення діяльності з розгортання та керування.
- Інфраструктура як код (IaC): Використання Terraform та AWS CLI для налаштування сервера Jenkins (EC2 інстанція) на AWS.
- Розгортання сервера Jenkins: Розгортання сервера Jenkins за допомогою Terraform.
- Налаштування сервера Jenkins: Встановлення та налаштування основних інструментів на сервері Jenkins, зокрема самого Jenkins, Docker, Sonarqube, Terraform, Kubectl, AWS CLI та Trivy.
- Розгортання EKS кластера: Розгортання Amazon EKS кластера — керованої служби Kubernetes на AWS за допомогою Terraform.
- Розгортання Jumper сервера: Для комунікації з EKS кластером, який знаходиться в приватній підмережі, розгортаємо Jumper сервер через консоль AWS.
- Налаштування балансувальника навантаження: Налаштування AWS Application Load Balancer (ALB) для EKS кластера.
- Репозиторії Amazon ECR: Створення приватних репозиторіїв для Docker образів фронтенду та бекенду в Amazon Elastic Container Registry (ECR).
- Інсталяція ArgoCD: Встановлення та налаштування ArgoCD для безперервної доставки та GitOps.
- Інтеграція Sonarqube: Інтеграція Sonarqube для аналізу якості коду в конвеєрі DevSecOps.
- Jenkins пайплайни з GitHub Webhook: Створення Jenkins пайплайнів для розгортання коду бекенду та фронтенду на EKS кластері з автоматичним запуском пайплайнів за допомогою Git Webhook.
- Розгортання застосунку ArgoCD: Використання ArgoCD для розгортання тришарового застосунку, включаючи компоненти бази даних, бекенду, фронтенду та ingress.
Налаштування моніторингу:
Налаштування моніторингу для EKS кластера за допомогою Helm, Prometheus та Grafana.
Попередні вимоги:
Перед тим, як розпочати проєкт, переконайтесь, що у вас є наступні попередні вимоги:
- Обліковий запис AWS з необхідними правами для створення ресурсів.
- Встановлені Terraform та AWS CLI на вашому локальному комп'ютері.
- Базові знання Kubernetes, Docker, Jenkins та принципів DevOps.
Крок 1: Створимо користувача IAM і згенеруємо ключ доступу AWS
Створіть нового користувача IAM на AWS та надайте йому права AdministratorAccess для тестових цілей (не рекомендується для проєктів вашої організації).
Перейдіть до сервісу AWS IAM і натисніть на Users.
Натисніть на Create user
Введіть ім'я для вашого користувача і натисніть Next.
Виберіть опцію Attach policies directly і шукайте AdministratorAccess, потім виберіть її.
Натисніть Next.
Натисніть Create user
Тепер виберіть створеного користувача, потім натисніть на Security credentials та згенеруйте ключ доступу, натиснувши Create access key.
Виберіть Command Line Interface (CLI), поставте галочку для підтвердження і натисніть Next.
Введіть Description і натисніть Create access key.
Тепер ви побачите ваші облікові дані, а також зможете завантажити CSV файл для майбутнього використання.
Крок 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
Після внесення змін перезавантажте вашу машину, щоб зміни у змінних середовища вступили в силу.
Налаштування AWS CLI
Виконайте команду нижче та додайте ваші ключі.
aws configure
Крок 3: Розгорнемо сервер Jenkins (EC2) за допомогою Terraform
Клонуйте Git репозиторій - посилання
Перейдіть до Jenkins-Server-TF
Зробіть деякі зміни у файлі backend.tf, такі як зміна імені bucket і dynamodb таблиці (переконайтеся, що ви створили обидва вручну в AWS Cloud).
Тепер замініть ім'я Pem файлу, якщо ваш файл має інше ім'я.
Щоб вказати ім'я Pem файлу, який вже створений на AWS
Ініціалізуйте бекенд, виконавши наступну команду
terraform init
Виконайте наступну команду для перевірки наявності синтаксичних помилок
terraform validate
Виконайте наступну команду, щоб отримати план того, які AWS сервіси будуть створені.
terraform plan -var-file=variables.tfvars
Тепер виконайте наступну команду, щоб створити інфраструктуру на AWS Cloud, що займе максимум 3-4 хвилини
terraform apply -var-file=variables.tfvars --auto-approve
Тепер підключіться до вашого Jenkins-сервера, натиснувши на Connect.
Скопіюйте команду ssh та вставте її на вашому локальному комп'ютері.
Крок 4: Налаштування Jenkins
Тепер ми увійшли до нашого Jenkins сервера.
Ми встановили кілька сервісів, таких як 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
Тепер ми повинні налаштувати Jenkins.
Отже, скопіюйте публічну IP-адресу вашого сервера Jenkins і вставте її у ваш улюблений браузер з портом 8080.
Для пароля адміністратора введіть нижче наведену команду на сервері Jenkins.
sudo systemctl status jenkins.service
Натискайте Install suggested plugins (Встановити рекомендовані плагіни).
Плагіни будуть встановлені.
Після встановлення плагінів натискайте Continue as admin (Продовжити як адміністратор).
Натискайте Save and Finish (Зберегти та завершити).
Натискайте Start using Jenkins (Розпочати використання Jenkins).
Панель інструментів Jenkins виглядатиме, як показано нижче.
Крок 5: Розгорнемо EKS кластер за допомогою Terraform
Тепер поверніться до терміналу вашого сервера Jenkins і налаштуйте AWS.
Перейдіть у Manage Jenkins (Керування Jenkins).
Натискайте на Plugins (Плагіни).
У розділі Available plugins (Доступні плагіни) встановіть наступні плагіни і натискайте Install (Встановити):
AWS Credentials (Облікові дані AWS)
Pipeline: AWS Steps (Конвеєр: кроки AWS)
Pipeline: Stage View (Конвеєр: перегляд етапів)
Після того, як плагіни будуть встановлені, перезавантажте сервіс Jenkins, поставивши галочку на Restart Jenkins (Перезавантажити Jenkins).
Знову увійдіть у ваш сервер Jenkins.
Тепер, щоб отримати доступ до ресурсів AWS, потрібно налаштувати облікові дані AWS у Jenkins.
Перейдіть у Manage Plugins (Керування плагінами) і натискайте на Credentials (Облікові дані).
Натискайте на global. (глобальні).
Виберіть AWS Credentials (Облікові дані AWS) як Kind (Тип) і введіть ID, як показано на нижньому знімку, крім вашого Access Key і Secret Access Key для AWS, після чого натискайте Create (Створити).
Облікові дані виглядатимуть наступним чином.
Тепер ми будемо створювати кластер EKS за допомогою Terraform, тому нам потрібно підключити Jenkins до Terraform.
Перейдіть у Manage Jenkins (Керування Jenkins).
Натискайте на Plugins (Плагіни).
У розділі Available plugins (Доступні плагіни) введіть terraform і натискайте Install & Restart (Встановити та перезавантажити).
Перейдіть до налаштувань інструментів і введіть шлях до Terraform або встановіть його.
Розгорніть кластер EKS за допомогою Jenkins Pipeline. Для цього потрібні файли Terraform та Jenkinsfile, які можна знайти в моєму репозиторії на GitHub -> https://github.com/Bazith1/Three-Tier-Project.
Клонуйте репозиторій і запустіть конвеєр, використовуючи Jenkinsfile для розгортання кластера EKS.
Крок 6: Розгорнемо Jump Server через консоль AWS
Jump Server — для підключення до Pods EKS кластера через Kubectl.
Створіть Jump Server через EC2.
Виберіть інстанс типу medium, без необхідності використання ключів.
Створіть Jump Server у VPC кластера EKS в публічній підмережі та дозволіть доступ по SSH за допомогою груп безпеки.
Виберіть 30 ГБ для EBS тома (EBS Volume).
У розділі Advanced details (Додаткові деталі) виберіть профіль інстанса Jenkins (Jenkins-Instance-Profile) для комунікації з іншими сервісами.
Змініть IMDS на "Optional" (Необов'язковий).
Скопіюйте команди нижче в сценарій користувача (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
Крок 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
Створіть політику IAM за допомогою команди нижче.
aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document file://iam_policy.json
Створіть постачальника OIDC (OIDC Provider).
eksctl utils associate-iam-oidc-provider --region=ap-south-1 --cluster= Bazith-lgUXahBU --approv
Створіть обліковий запис сервісу (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
Запустіть команду нижче, щоб розгорнути контролер 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
Якщо ваші 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" (Створити репозиторій).
Виберіть опцію Private (Приватний), щоб створити репозиторій, та натисніть Save (Зберегти).
Те саме зробіть для репозиторію backend, потім натисніть Save (Зберегти).
Тепер ми налаштували наш приватний репозиторій ECR.
Тепер потрібно налаштувати ECR локально, оскільки ми маємо завантажити наші образи в Amazon ECR.
Скопіюйте першу команду для входу.
Тепер запустіть скопійовану команду на Jenkins Server (Сервері Jenkins).
Крок 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
Всі pods повинні бути в стані "Running" (Запущено), для перевірки виконайте команду нижче
kubectl get pods -n argocd
Тепер виставимо сервер argoCD як LoadBalancer за допомогою команди нижче
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
Ви можете перевірити, чи створено Load Balancer, зайшовши в AWS Console (Консоль AWS).
Для доступу до argoCD, скопіюйте DNS Load Balancer і введіть його в улюблений браузер.
Ви отримаєте попередження, подібне до цього фрагмента.
Натисніть Advanced (Додатково).
Натисніть на посилання, яке з'являється під Hide advanced (Сховати додатково).
Тепер нам потрібно отримати пароль для нашого сервера argoCD для виконання деплойменту.
kubectl get secrets -n argocd
kubectl edit secret argocd-initial-admin-secret -n argocd
Скопіюйте пароль та декодуйте його за допомогою команди
echo $(echo RmpiMGNsZnN0MnFvbzVuZg== | base64 --decode)
Введіть ім'я користувача (admin) і пароль в argoCD, а потім натисніть SIGN IN (Увійти).
Ось наш Дашборд ArgoCD.
Крок 10: Тепер налаштуємо SonarQube для нашого DevSecOps Pipeline
Для цього скопіюйте публічну IP-адресу вашого Jenkins Server та вставте її в улюблений браузер з портом 9000.
Ім'я користувача та пароль буде admin.
Натисніть Log In (Увійти).
Оновіть пароль.
Натисніть Administration (Адміністрування), потім Security (Безпека), і виберіть Users (Користувачі).
Натисніть Update tokens (Оновити токени).
Натисніть Generate (Генерувати).
Скопіюйте токен, збережіть його в безпечному місці і натисніть Done (Готово).
Тепер нам потрібно налаштувати webhooks (вебхуки) для перевірки якості коду.
Натисніть Administration (Адміністрування), потім Configuration (Конфігурація) і виберіть Webhooks (Вебхуки).
Натисніть Create (Створити).
Введіть назву вашого проекту, а в полі URL вкажіть публічну IP-адресу вашого Jenkins Server (Сервера Jenkins) з портом 8080 і додайте в кінці sonarqube-webhook, після чого натисніть Create (Створити).
http://:8080/sonarqube-webhook/
Тут ви можете побачити webhook.
Тепер нам потрібно створити проект для frontend (фронтенд) коду.
Натисніть Manually (Вручну).
Введіть відображувану назву вашого Project (Проекту) і натисніть Setup (Налаштувати).
Натисніть Locally (Локально).
Виберіть Use existing token (Використовувати наявний токен) і натисніть Continue (Продовжити).
Виберіть Other (Інше) і Linux (Лінукс) як операційну систему.
Після виконання цих кроків ви отримаєте команду, яку можна побачити в наступному фрагменті.
Тепер використайте цю команду в Jenkins Frontend Pipeline (Пайплайн для фронтенду), де буде виконуватися перевірка якості коду.
Тепер нам потрібно створити проект для backend (бекенд) коду.
Натисніть Create Project (Створити проект).
Введіть назву вашого проекту і натисніть Set up (Налаштувати).
Натисніть Locally (Локально).
Виберіть Use existing token (Використовувати наявний токен) і натисніть Continue (Продовжити).
Виберіть Other (Інше) і Linux (Лінукс) як операційну систему.
Після виконання цих кроків ви отримаєте команду, яку можна побачити в наступному фрагменті.
Тепер використайте цю команду в Jenkins Backend Pipeline (Пайплайн для бекенду), де буде виконуватися перевірка якості коду.
Тепер потрібно зберегти облікові дані Sonar.
Перейдіть до Dashboard -> Manage Jenkins -> Credentials (Дашборд -> Керувати Jenkins -> Облікові дані).
Виберіть тип Secret text (Тайний текст), вставте ваш токен SonarQube в Secret (Тайна інформація) і залиште інші поля незмінними.
Натисніть Create (Створити).
Тепер нам потрібно зберегти GitHub Personal access token (Токен особистого доступу GitHub), щоб здійснити пуш змін до файлу деплойменту, який буде змінений у самому пайплайні для образу ECR.
Додайте облікові дані GitHub (Add GitHub credentials).
Виберіть тип Secret text (Тайний текст) і вставте ваш GitHub Personal access token (не пароль) в Secret (Тайна інформація), залишаючи інші поля незмінними.
Також створіть токен з правами адміністратора, щоб ви могли читати і записувати.
Натисніть Create (Створити).
Примітка: Якщо ви ще не створили ваш токен, спочатку створіть його, а потім вставте в Jenkins.
Тепер, відповідно до нашого пайплайну, нам потрібно додати Account ID (Ідентифікатор облікового запису) в облікові дані Jenkins, через URI репозиторію ECR.
Виберіть тип Secret text (Тайний текст), вставте ваш AWS Account ID (Ідентифікатор облікового запису AWS) в Secret (Тайна інформація) і залиште інші поля незмінними.
Натисніть Create (Створити).
Тепер нам потрібно вказати ім’я нашого ECR образу для фронтенду, яке є frontend.
Виберіть тип Secret text (Тайний текст), вставте ім’я вашого фронтенд-репозиторію в Secret (Тайна інформація) і залиште інші поля незмінними.
Натисніть Create (Створити).
Тепер нам потрібно вказати ім’я нашого ECR образу для бекенду, яке є backend.
Виберіть тип Secret text (Тайний текст), вставте ім’я вашого бекенд-репозиторію в Secret (Тайна інформація) і залиште інші поля незмінними.
Натисніть Create (Створити).
Останній фрагмент усіх облікових даних, які нам потрібні для реалізації цього проекту.
Крок 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
Тепер нам потрібно налаштувати встановлені плагіни.
Перейдіть до Dashboard -> Manage Jenkins -> Tools (Дашборд -> Керувати Jenkins -> Інструменти).
Ми налаштовуємо jdk.
Пошукайте jdk і надайте конфігурацію, як в наступному фрагменті.
Тепер ми налаштуємо sonarqube-scanner.
Пошукайте sonarqube scanner і надайте конфігурацію, як в наступному фрагменті.
Тепер ми налаштуємо nodejs.
Пошукайте node і надайте конфігурацію, як в наступному фрагменті.
Тепер ми налаштуємо OWASP Dependency check (Перевірка залежностей OWASP).
Пошукайте Dependency-Check і надайте конфігурацію, як в наступному фрагменті.
Тепер ми налаштуємо docker.
Пошукайте docker і надайте конфігурацію, як в наступному фрагменті.
Тепер нам потрібно вказати шлях до Sonarqube в Jenkins.
Перейдіть до Dashboard -> Manage Jenkins -> System (Дашборд -> Керувати Jenkins -> Система).
Пошукайте SonarQube installations (Інсталяції SonarQube).
Вкажіть назву, як вказано, потім в полі Server URL (URL сервера) скопіюйте публічну IP-адресу SonarQube (таку ж, як у Jenkins) з портом 9000, виберіть токен Sonar, який ми додали нещодавно, і натисніть Apply & Save (Застосувати та зберегти).
Тепер ми готові створити наш Jenkins Pipeline (Пайплайн Jenkins) для деплою нашого фронтенд-коду.
Перейдіть до Jenkins Dashboard (Дашборд Jenkins).
Натисніть New (Новий) Item (Елемент).
Введіть назву вашого Pipeline (Пайплайну) і натисніть OK.
Ми будемо активувати webhook, щоб щоразу, коли розробник пушить код в репозиторій, цей Jenkins пайплайн автоматично спрацьовував.
Увімкніть Github hook trigger for GITScm Polling (Тригер хуку GitHub для опитування GITScm).
Тепер використовуйте файл Jenkins з репозиторію GitHub, виберіть скрипт пайплайну з SCM і надайте ваше Github url і пароль.
Вкажіть шлях до вашого Jenkins File (Файл Jenkins).
Це файл Jenkins для деплою фронтенд-коду на EKS.
Скопіюйте і вставте його в Jenkins.
https://github.com/Bazith1/Three-Tier-Project/blob/main/Jenkins-Pipeline-Code/Jenkinsfile-Frontend
Натисніть Apply (Застосувати) & Save (Зберегти).
Тепер натискаємо на build (будувати).
Наш пайплайн був успішним після деяких поширених помилок.
Примітка: Зробіть зміни в пайплайні відповідно до вашого проєкту.
Щоб активувати Jenkins за допомогою хуку GitHub, нам потрібно увімкнути webhook в GitHub.
Створення Webhook
Перейдіть до вашого репозиторію на GitHub, перейдіть до Settings > Webhooks > Add Webhook
(Налаштування > Webhooks > Додати Webhook).
Надайте наступні дані:
- 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 (Елемент).
Введіть назву вашого Pipeline (Пайплайну) і натисніть OK.
Ми будемо активувати webhook, щоб кожного разу, коли розробник пушить код до репозиторію, цей Jenkins пайплайн автоматично спрацьовував.
Увімкніть Github hook trigger for GITScm Polling (Тригер хуку GitHub для опитування GITScm).
Це файл Jenkins для деплою бекенд-коду на EKS.
Скопіюйте і вставте його в Jenkins.
https://github.com/Bazith1/Three-Tier-Project/blob/main/Jenkins-Pipeline-Code/Jenkinsfile-Backend
Натисніть Apply (Застосувати) & Save (Зберегти).
Тепер натискаємо на build (будувати).
Наш пайплайн був успішним після деяких поширених помилок.
Примітка: Зробіть зміни в пайплайні відповідно до вашого проєкту.
Отже, ми вже налаштували GitHub hook для активації Jenkins, і він автоматично запустить пайплайн для бекенду так само.
Крок 12: Ми розгорнемо наш Тришаровий додаток за допомогою ArgoCD.
Оскільки наш репозиторій є приватним.
Отже, нам потрібно налаштувати приватний репозиторій в ArgoCD.
Ми будемо розгортати наш додаток на просторі тришарової інфраструктури. Для цього створимо простір тришарової інфраструктури на EKS.
kubectl create namespace three-tier
Як ви знаєте, наші два репозиторії 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
Натискаємо на Settings (Налаштування) та вибираємо Repositories (Репозиторії).
Натискаємо на CONNECT REPO USING HTTPS (Підключити репозиторій через HTTPS).
Тепер надаємо ім’я репозиторію, де зберігаються ваші файли Manifests.
Надаємо ім’я користувача та персональний токен доступу GitHub і натискаємо CONNECT (Підключити).
Якщо ваш Connection Status (Статус підключення) показує Successful (Успішно), це означає, що репозиторій успішно підключено.
Тепер створимо наш перший додаток, яким буде база даних.
Натискаємо на CREATE APPLICATION (Створити додаток).
Заповніть деталі так, як зазначено в наступному фрагменті, і прокрутіть вниз.
Виберіть той самий репозиторій, який ви налаштували на попередньому етапі.
У полі Path вкажіть місце розташування ваших файлів Manifests та заповніть інші параметри, як показано на нижньому скріншоті.
Натискаємо CREATE (Створити).
Поки ваш додаток бази даних починає розгортатись, ми створимо додаток для бекенду.
Заповніть деталі так, як зазначено в наступному фрагменті, і прокрутіть вниз.
Виберіть той самий репозиторій, який ви налаштували на попередньому етапі.
У полі Path вкажіть місце розташування ваших файлів Manifests та заповніть інші параметри, як показано на нижньому скріншоті.
Натискаємо CREATE (Створити).
Як тільки ваш додаток Ingress буде розгорнуто.
Це створить Application Load Balancer.
Ви можете перевірити створений балансувальник навантаження з ім'ям k8s-three.
Тепер скопіюйте ALB-DNS та перейдіть до вашого постачальника домену, у моєму випадку постачальник домену — Porkbun.
Перейдіть до DNS і додайте запис типу CNAME, де вказуєте хостнейм backend, а в полі "Answer" (Відповідь) додаєте ваш ALB та натискаєте Save.
Примітка: Я створив піддомен backend.amanpathakdevops.study.
Ви можете побачити всі 4 розгортання додатків у наведеному фрагменті.
Тепер через 2-3 хвилини перейдіть до вашого піддомену у браузері, щоб побачити результат.
Ось це — розгортання додатку Ingress в ArgoCD.
Ось це — розгортання додатку Frontend в ArgoCD.
Ось це — розгортання додатку Backend в ArgoCD.
Ось це — розгортання додатку Database в ArgoCD.
Якщо ви звернете увагу, ми налаштували Persistent Volume (Постійний том) та Persistent Volume Claim (Запит на постійний том). Тому, якщо контейнери будуть видалені, дані не будуть втрачені. Дані збережуться на хост-машині.
Щоб перевірити це, видалімо обидва контейнери бази даних.
Тепер буде запущено нові контейнери.
І ваш додаток не втратить жодного шматочка даних.
Крок 12: Ми налаштуємо моніторинг для нашого EKS кластеру.
Ми можемо моніторити специфікації кластера та інші необхідні речі.
Моніторинг ми будемо реалізовувати за допомогою Helm.
Додайте репозиторій Prometheus за допомогою наступної команди
helm repo add stable https://charts.helm.sh/stable
Встановіть 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
Тепер перевірте сервіс за допомогою наступної команди
kubectl get svc
Тепер нам потрібно отримати доступ до консолей Prometheus та Grafana ззовні кластера.
Для цього нам потрібно змінити тип сервісу з ClusterType на LoadBalancer.
Редагуйте сервіс stable-kube-prometheus-sta-prometheus
kubectl edit svc stable-kube-prometheus-sta-prometheus
Зміна на 48-й лінії з ClusterType на LoadBalancer
Редагуйте сервіс stable-grafana
kubectl edit svc stable-grafana
Зміна на 39-й лінії з ClusterType на LoadBalancer
Тепер, якщо ви ще раз перераховуєте сервіси, то побачите DNS-ім’я LoadBalancers.
kubectl get svc
Ви також можете перевірити це через вашу консоль.
Тепер перейдіть до вашої панелі керування Prometheus.
Вставте :9090 у вашому улюбленому браузері, і ви побачите ось таке
Натисніть на Status та виберіть Target.
Ви побачите багато цілей
Тепер перейдіть до вашої Grafana панелі керування.
Скопіюйте ALB DNS Grafana і вставте в ваш улюблений браузер.
Ім'я користувача буде admin, а пароль prom-operator для входу в Grafana.
Тепер натискайте на Data Source.
Виберіть Prometheus.
У Connection вставте ваше :9090.
Якщо URL правильний, ви побачите зелене повідомлення.
Натискайте Save та Test.
Тепер ми створимо панель керування для візуалізації журналів Kubernetes Cluster.
Натискайте на Dashboard.
Як тільки ви натискаєте на Dashboard, ви побачите багато компонентів Kubernetes для моніторингу.
Спробуємо імпортувати тип панелі керування для Kubernetes.
Натискайте на New і виберіть Import.
Введіть 6417 ID і натискайте Load або використовуйте ID 17375.
Примітка: 6417 — це унікальний ID від Grafana, який використовується для моніторингу та візуалізації даних Kubernetes.
Виберіть data source, який ви створили раніше, і натискайте Import.
Ось і все.
Тепер ви можете переглядати дані вашого Kubernetes Cluster.
Не соромтеся досліджувати інші деталі Kubernetes Cluster.
Тепер ви можете побачити вашу панель Grafana для перегляду даних EKS, таких як поди, простори імен (namespace), деплойменти тощо.
Якщо ви хочете моніторити трирівневий простір імен.
У просторі імен замініть "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