- [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)
- [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)
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 整合。
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
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>
aws ec2 create-security-group --group-name MySecurityGroup --description "Security group for my app" --vpc-id <vpc-id>
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
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>
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
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>
jdbc:mysql://<rds-endpoint>:3306/mydatabase
:
mysql -h <rds-endpoint> -u admin -p
<ec2-public-ip>:8080
存取 Jenkins。 sudo cat /var/lib/jenkins/secrets/initialAdminPassword
導覽至Manage Jenkins -> Manage Plugins
。
搜尋“GitHub”並安裝它。
- `Manage Jenkins -> Manage Credentials -> Add Credentials`.
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'
}
}
}
}
提交 Jenkinsfile 並將其推送到您的儲存庫。
Jenkins 將自動觸發建置。
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
docker build -t myapp:latest .
docker tag myapp:latest myrepo/myapp:v1.0.0
docker push myrepo/myapp:v1.0.0
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"
docker-compose up
kubectl
和eksctl
: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
eksctl create cluster --name my-cluster --version 1.21 --region us-east-1 --nodegroup-name my-nodes --node-type t3.medium --nodes 3
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
kubectl apply -f deployment.yaml
kubectl get pods
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
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/prometheus
values.yaml
檔案以抓取您的應用程式指標: scrape_configs:
- job_name: 'myapp'
static_configs:
- targets: ['myapp-service:8080']
helm install grafana grafana/grafana
kubectl get secret --namespace default grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
kubectl port-forward svc/grafana 3000:80
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"
receivers:
- name: 'email'
email_configs:
- to: '[email protected]'
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
stage('Security Scan') {
steps {
sh 'trivy image myrepo/myapp:v1.0.0'
}
}
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
sonar.properties
檔案進行資料庫整合: sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube
stage('SonarQube Analysis') {
steps {
withSonarQubeEnv('My SonarQube Server') {
sh 'mvn sonar:sonar'
}
}
}
本專案指南深入介紹如何透過 CI/CD、容器化、Kubernetes 部署、監控和安全性設定端對端 DevOps 管道。透過遵循本指南,您不僅可以獲得實務經驗,還可以建立可用於生產的管道。請記住,掌握 DevOps 的關鍵是持續實踐並隨時了解最新的工具和方法。
您可以根據您的專案要求隨意自訂步驟並整合更多工具。 DevOps 是一個廣闊的領域,本指南只是您成為熟練的 DevOps 工程師之旅的開始。快樂編碼和快樂部署!
加入我們的Telegram 社群||在 GitHub 上關注我以獲取更多 DevOps 內容!