目錄

  1. 介紹

  2. 專案概況

  3. 先決條件

  4. 第 1 步:AWS 上的基礎設施設置

  1. 步驟2:安裝和設定Jenkins
  1. 第 3 步:使用 Docker 將應用程式容器化
  1. 步驟 4:部署到 Kubernetes (Amazon EKS)
  1. 步驟5:使用Prometheus和Grafana實施持續監控
  1. 第 6 步:保護 CI/CD 管道的安全
  1. 第 7 步:使用 Terraform 實現基礎架構自動化
- [7.1 Writing Terraform Scripts](#71-writing-terraform-scripts)
- [7.2 Managing Infrastructure as Code](#72-managing-infrastructure-as-code)
- [7.3 Terraform State Management](#73-terraform-state-management)
  1. 步驟 8:實施藍綠部署
- [8.1 Setting Up Blue-Green Deployments](#81-setting-up-blue-green-deployments)
- [8.2 Automating Traffic Shifts](#82-automating-traffic-shifts)
- [8.3 Rollback Strategies](#83-rollback-strategies)
  1. 結論

  2. 進一步閱讀和資源


介紹

DevOps 旨在實現流程自動化、改善開發和營運團隊之間的協作以及更快、更可靠地部署軟體。此專案將指導您使用業界標準工具建立全面的 CI/CD 管道。您將使用 Jenkins、Docker、Kubernetes (Amazon EKS)、Prometheus、Grafana、Trivy、SonarQube 和 Terraform 在 AWS 上部署全端應用程式。這種實務經驗將幫助您掌握關鍵的 DevOps 概念和工具。

專案圖

  +------------------------+
  |   Developer Workstation |
  |                        |
  |  - Code Repository     |
  |  - Local Build & Test  |
  +-----------+------------+
              |
              v
  +------------------------+
  |        Jenkins         |
  |                        |
  |  - CI/CD Pipeline      |
  |  - Build & Test        |
  |  - Docker Build        |
  |  - Push Docker Image   |
  +-----------+------------+
              |
              v
  +------------------------+          +----------------------+
  |        Docker Hub      |          |        AWS EKS        |
  |                        |          |                      |
  |  - Docker Image        |          |  - Kubernetes Cluster |
  |                        |          |                      |
  +-----------+------------+          +-----------+----------+
              |                                    |
              v                                    |
  +------------------------+          +----------------------+
  |   Kubernetes Deployment|          |  Prometheus & Grafana|
  |                        |          |                      |
  |  - Deployment          |          |  - Monitoring         |
  |  - Service             |          |  - Dashboards        |
  |                        |          |                      |
  +------------------------+          +----------------------+
              |
              v
  +------------------------+
  |     Amazon RDS         |
  |                        |
  |  - MySQL Database      |
  |                        |
  +------------------------+

專案概況

目標

  • 基礎架構設定:配置AWS資源,包括VPC、EC2執行個體和RDS資料庫。

  • CI/CD 管道:使用 Jenkins 自動化建置、測試和部署流程。

  • 容器化:使用 Docker 將應用程式容器化。

  • Kubernetes 部署:在 Amazon EKS 上部署應用程式。

  • 監控:使用Prometheus和Grafana實施持續監控。

  • 安全性:使用 Trivy 和 SonarQube 保護管道。

  • 基礎架構即程式碼:使用 Terraform 自動化基礎架構管理。

  • 藍綠部署:實施藍綠部署策略。

工具和技術

  • AWS: EC2、VPC、RDS、EKS。

  • Jenkins: CI/CD 自動化。

  • Docker:容器化。

  • Kubernetes:容器編排。

  • Prometheus 和 Grafana:監控和視覺化。

  • Trivy & SonarQube:安全與程式碼品質檢查。

  • Terraform:基礎架構即程式碼。

先決條件

  • AWS帳戶:雲端資源配置所需。

  • 基本 Linux 知識:用於管理 EC2 執行個體。

  • Docker 和 Kubernetes 知識:用於容器化和編排。

  • 熟悉 CI/CD:了解基本 CI/CD 概念。

  • GitHub 帳戶:用於版本控制和 Jenkins 整合。

第 1 步:AWS 上的基礎設施設置

1.1 設定VPC及群組網

  1. 建立專有網路:
   aws ec2 create-vpc --cidr-block 10.0.0.0/16
  • 配置子網路:
     aws ec2 create-subnet --vpc-id <vpc-id> --cidr-block 10.0.1.0/24 --availability-zone us-east-1a
  • 設定 Internet 網關:
     aws ec2 create-internet-gateway
     aws ec2 attach-internet-gateway --vpc-id <vpc-id> --internet-gateway-id <igw-id>
  • 建立路由表並與子網路關聯:
     aws ec2 create-route-table --vpc-id <vpc-id>
     aws ec2 create-route --route-table-id <rtb-id> --destination-cidr-block 0.0.0.0/0 --gateway-id <igw-id>
     aws ec2 associate-route-table --subnet-id <subnet-id> --route-table-id <rtb-id>
  1. 設定安全群組:
  • 建立安全群組:
     aws ec2 create-security-group --group-name MySecurityGroup --description "Security group for my app" --vpc-id <vpc-id>
  • 允許 SSH、HTTP 和 HTTPS:
     aws ec2 authorize-security-group-ingress --group-id <sg-id> --protocol tcp --port 22 --cidr 0.0.0.0/0
     aws ec2 authorize-security-group-ingress --group-id <sg-id> --protocol tcp --port 80 --cidr 0.0.0.0/0
     aws ec2 authorize-security-group-ingress --group-id <sg-id> --protocol tcp --port 443 --cidr 0.0.0.0/0

1.2 配置 EC2 執行個體

  1. 啟動 EC2 執行個體:
  • 使用 AWS 管理主控台或 CLI:
     aws ec2 run-instances --image-id ami-0abcdef1234567890 --count 1 --instance-type t2.micro --key-name MyKeyPair --security-group-ids <sg-id> --subnet-id <subnet-id>
  • 在 EC2 執行個體上安裝 Docker 和 Jenkins:
     sudo yum update -y
     sudo yum install docker -y
     sudo service docker start
     sudo usermod -a -G docker ec2-user

     # Jenkins
     sudo yum install java-1.8.0-openjdk -y
     wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
     rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
     sudo yum install jenkins -y
     sudo systemctl start jenkins
     sudo systemctl enable jenkins

1.3 設定RDS資料庫

  1. 配置 RDS 實例:
  • 建立 MySQL 實例:
     aws rds create-db-instance --db-instance-identifier mydbinstance --db-instance-class db.t2.micro --engine mysql --master-username admin --master-user-password password --allocated-storage 20 --vpc-security-group-ids <sg-id>
  1. 連接應用程式:
  • 使用 RDS 端點更新應用程式設定:
     jdbc:mysql://<rds-endpoint>:3306/mydatabase
  • 透過 MySQL 用戶端測試確保連接

:

     mysql -h <rds-endpoint> -u admin -p

步驟2:安裝和設定Jenkins

2.1 詹金斯安裝

  1. 安裝詹金斯:
  • 已包含在 EC2 配置中。透過<ec2-public-ip>:8080存取 Jenkins。
  1. 解鎖詹金斯:
  • 找回初始管理者密碼:
     sudo cat /var/lib/jenkins/secrets/initialAdminPassword
  • 完成設定精靈。

2.2 配置 Jenkins 進行 GitHub 集成

  1. 安裝 GitHub 插件:
  • 導覽至Manage Jenkins -> Manage Plugins

  • 搜尋“GitHub”並安裝它。

  1. 產生 GitHub 令牌:
  • 從 GitHub 產生個人存取權杖並將其新增至 Jenkins:
 - `Manage Jenkins -> Manage Credentials -> Add Credentials`.
  1. 建立新工作:
  • 設定新的管道作業並將其連結到您的 GitHub 儲存庫。

2.3 設定 Jenkins 管道

  1. 定義 Jenkinsfile:
  • 在您的儲存庫中建立Jenkinsfile
     pipeline {
       agent any
       stages {
         stage('Build') {
           steps {
             sh 'mvn clean install'
           }
         }
         stage('Test') {
           steps {
             sh 'mvn test'
           }
         }
         stage('Deploy') {
           steps {
             sh 'docker build -t myapp .'
             sh 'docker push myrepo/myapp'
           }
         }
       }
     }
  1. 觸發管道:
  • 提交 Jenkinsfile 並將其推送到您的儲存庫。

  • Jenkins 將自動觸發建置。

第 3 步:使用 Docker 將應用程式容器化

3.1 編寫 Dockerfile

  1. 建立一個 Dockerfile:
  • 在您的應用程式目錄中:
     FROM openjdk:8-jdk-alpine
     VOLUME /tmp
     ARG JAR_FILE=target/*.jar
     COPY ${JAR_FILE} app.jar
     ENTRYPOINT ["java","-jar","/app.jar"]
  1. 建置 Docker 映像:
  • 執行以下命令:
     docker build -t myapp:latest .

3.2 建置和推送 Docker 映像

  1. 標記並推送圖片:
  • 使用適當的版本標記圖像:
     docker tag myapp:latest myrepo/myapp:v1.0.0
  • 將映像推送到 Docker Hub:
     docker push myrepo/myapp:v1.0.0

3.3 用於本地開發的 Docker Compose

  1. 建立docker-compose.yml檔案:
  • 定義您的多容器應用程式:
     version: '3'
     services:
       app:
         image: myrepo/myapp:v1.0.0
         ports:
           - "8080:8080"
       db:
         image: mysql:5.7
         environment:
           MYSQL_ROOT_PASSWORD: password
           MYSQL_DATABASE: mydatabase
         ports:
           - "3306:3306"
  1. 執行 Docker Compose:
  • 本地啟動應用程式:
     docker-compose up

步驟 4:部署到 Kubernetes (Amazon EKS)

4.1 設定EKS集群

  1. 安裝kubectleksctl
  • 安裝kubectl
     curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
     chmod +x kubectl
     sudo mv kubectl /usr/local/bin/
  • 安裝eksctl
     curl --silent --location "https://github.com/weaveworks/eksctl/releases/download/0.110.0/eksctl_Linux_amd64.tar.gz" | tar xz -C /tmp
     sudo mv /tmp/eksctl /usr/local/bin
  1. 建立 EKS 叢集:
   eksctl create cluster --name my-cluster --version 1.21 --region us-east-1 --nodegroup-name my-nodes --node-type t3.medium --nodes 3

4.2 建立 Kubernetes 清單

  1. 編寫部署清單:
  • 建立一個deployment.yaml
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: myapp-deployment
     spec:
       replicas: 3
       selector:
         matchLabels:
           app: myapp
       template:
         metadata:
           labels:
             app: myapp
         spec:
           containers:
           - name: myapp
             image: myrepo/myapp:v1.0.0
             ports:
             - containerPort: 8080

4.3 在EKS上部署應用程式

  1. 應用清單:
  • 將應用程式部署到 EKS:
     kubectl apply -f deployment.yaml
  • 監控部署:
     kubectl get pods
  1. 公開應用程式:
  • 建立一個服務來公開應用程式:
     apiVersion: v1
     kind: Service
     metadata:
       name: myapp-service
     spec:
       type: LoadBalancer
       selector:
         app: myapp
       ports:
         - protocol: TCP
           port: 80
           targetPort: 8080
  • 申請服務:
     kubectl apply -f service.yaml

步驟5:使用Prometheus和Grafana實施持續監控

5.1 安裝普羅米修斯

  1. 部署普羅米修斯:
  • 使用 Helm 安裝 Prometheus:
     helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
     helm repo update
     helm install prometheus prometheus-community/prometheus
  1. 配置普羅米修斯:
  • 編輯values.yaml檔案以抓取您的應用程式指標:
     scrape_configs:
       - job_name: 'myapp'
         static_configs:
           - targets: ['myapp-service:8080']

5.2 配置 Grafana 儀表板

  1. 部署 Grafana:
  • 透過 Helm 安裝 Grafana:
     helm install grafana grafana/grafana
  1. 參觀 Grafana:
  • 找回管理員密碼:
     kubectl get secret --namespace default grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
  • 轉送連接埠存取 Grafana:
     kubectl port-forward svc/grafana 3000:80
  1. 新增 Prometheus 作為資料來源:
  • 登入Grafana並新增Prometheus作為資料來源。

5.3 設定警報

  1. 定義警報規則:
  • 在 Prometheus 中為關鍵指標建立警報規則:
     groups:
       - name: example
         rules:
         - alert: HighMemoryUsage
           expr: node_memory_Active_bytes > 1e+09
           for: 1m
           labels:
             severity: critical
           annotations:
             summary: "Instance {{ $labels.instance }} high memory usage"
  1. 設定警報管理器:
  • 配置 Alertmanager 以取得通知:
     receivers:
       - name: 'email'
         email_configs:
           - to: '[email protected]'

第 6 步:保護 CI/CD 管道的安全

6.1 使用 Trivy 掃描漏洞

  1. 安裝 Trivy:
  • 在 Jenkins 伺服器上安裝 Trivy:
     sudo apt-get install wget apt-transport-https gnupg lsb-release
     wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
     echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list
     sudo apt-get update
     sudo apt-get install trivy
  1. 將 Trivy 與 Jenkins 整合:
  • 將 Trivy 加入 Jenkins 管道:
     stage('Security Scan') {
       steps {
         sh 'trivy image myrepo/myapp:v1.0.0'
       }
     }

6.2 整合 SonarQube 以提高程式碼品質

  1. 安裝 SonarQube:
  • 在 EC2 執行個體上安裝 SonarQube:
     sudo yum install java-11-openjdk-devel -y
     wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.9.6.50800.zip
     unzip

 sonarqube-*.zip
     sudo mv sonarqube-8.9.6.50800 /opt/sonarqube
     sudo chown -R sonar: /opt/sonarqube
  1. 配置 SonarQube:
  • 修改sonar.properties檔案進行資料庫整合:
     sonar.jdbc.username=sonar
     sonar.jdbc.password=sonar
     sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube
  1. 將 SonarQube 與 Jenkins 整合:
  • 在Jenkins中加入SonarQube分析:
     stage('SonarQube Analysis') {
       steps {
         withSonarQubeEnv('My SonarQube Server') {
           sh 'mvn sonar:sonar'
         }
       }
     }

結論

本專案指南深入介紹如何透過 CI/CD、容器化、Kubernetes 部署、監控和安全性設定端對端 DevOps 管道。透過遵循本指南,您不僅可以獲得實務經驗,還可以建立可用於生產的管道。請記住,掌握 DevOps 的關鍵是持續實踐並隨時了解最新的工具和方法。

最後的想法

您可以根據您的專案要求隨意自訂步驟並整合更多工具。 DevOps 是一個廣闊的領域,本指南只是您成為熟練的 DevOps 工程師之旅的開始。快樂編碼和快樂部署!


👤 作者

橫幅

加入我們的Telegram 社群||在 GitHub 上關注我以獲取更多 DevOps 內容!


原文出處:https://dev.to/prodevopsguytech/end-to-end-devops-project-building-deploying-and-monitoring-a-full-stack-application-ako


共有 0 則留言