在這個高階 AWS DevOps 專案中,我們將建立一個複雜的 CI/CD 管道,以在 AWS 上自動部署基於微服務的應用程式。我們將利用關鍵的 DevOps 實踐,例如使用Terraform進行基礎設施即程式碼 (IaC) 、使用Amazon EKS(彈性 Kubernetes 服務)進行容器編排、與 Istio 進行服務網格集成,以及使用Prometheus 、 Grafana和Fluentd進行全面監控和日誌記錄。
該專案旨在涵蓋 AWS 和 DevOps 工程師經常遇到的複雜的現實場景,讓您深入了解如何建置、部署和管理現代雲端原生應用程式。
- Setting Up the VPC and Networking
- IAM Roles and Policies
- Creating an EKS Cluster
- Integrating with RDS for Persistent Storage
- Setting Up Jenkins on EC2 with Auto-Scaling
- Configuring Jenkins Master-Slave Architecture
- Installing Istio on EKS
- Configuring Traffic Management, Security, and Observability
- Integrating GitHub, Jenkins, Docker, and EKS
- Implementing Blue-Green Deployments
- Automated Canary Deployments with Istio
- Setting Up Prometheus and Grafana
- Configuring Fluentd for Centralized Logging
- Setting Up Alertmanager for Incident Response
該專案將指導您設定高級 CI/CD 管道,使用 Kubernetes (EKS)、用於服務網格的 Istio 和用於 CI/CD 的 Jenkins,在 AWS 上自動部署基於微服務的應用程式。我們將涵蓋從使用 Terraform 進行基礎架構配置到在安全、可擴展且可觀察的環境中部署和管理微服務的整個生命週期。
AWS 帳號:對 AWS 帳號的管理存取權。
AWS CLI :已安裝並使用適當的憑證進行設定。
Terraform :安裝在您的本機電腦上。
kubectl :安裝用於管理 Kubernetes 叢集。
Jenkins :安裝在 EC2 執行個體上或透過 Docker 設定。
Docker :在本機上安裝並執行。
Git :已安裝並設定。
Helm :安裝用於 Kubernetes 套件管理。
該架構由具有公共和私有子網路的VPC、跨多個可用區部署的EKS 叢集、部署在具有自動擴展功能的EC2 上的高可用配置中的Jenkins、用於持久資料儲存的RDS 以及用於服務網格整合的Istio 組成。監控由 Prometheus 和 Grafana 處理,而 Fluentd 則集中記錄日誌。
1. 開發者工作站:
開發人員將程式碼提交到GitHub儲存庫。
2.持續集成:
Jenkins從 GitHub 拉取最新程式碼。
Jenkins 建立並測試應用程式。
Docker用於建立應用程式的 Docker 映像。
建置的映像被推送到Docker 註冊表(例如 Amazon ECR)。
3. 基礎設施即程式碼:
Terraform用於配置 AWS 基礎設施,包括:
- **VPC** for networking.
- **IAM Roles and Policies** for security.
- **EKS Cluster** for Kubernetes.
- **RDS** for persistent storage.
4.持續部署:
Jenkins 使用 Kubernetes 清單或 Helm 圖表將 Docker 映像部署到Amazon EKS 。
Istio (服務網格)用於管理微服務之間的流量。
5.服務網格:
Istio提供流量管理、安全性 (mTLS) 和可觀察性。
Istio Ingress Gateway管理對服務的外部存取。
6. 監控和記錄:
Prometheus從 Kubernetes 集群和 Istio 收集指標。
Grafana將指標視覺化並提供儀表板。
Fluentd用於集中日誌記錄,將日誌傳送至Amazon CloudWatch或Elasticsearch 。
Alertmanager與 Prometheus 整合以進行警報。
7.持續回饋:
Alertmanager會向 Slack 或電子郵件發送通知。
Jenkins 向開發人員提供建置和部署回饋。
GitHub :版本控制和原始碼儲存庫。
Jenkins :用於自動化建置、測試和部署的 CI/CD 伺服器。
Docker :將應用程式容器化以獲得一致的環境。
Terraform :自動配置 AWS 基礎架構。
Amazon ECR :Docker 映像儲存庫。
Amazon EKS :用於部署和管理容器化應用程式的 Kubernetes 服務。
Istio :用於管理服務間通訊的服務網格。
Prometheus & Grafana :監控指標和儀表板的堆疊。
Fluentd :集中式日誌記錄解決方案。
Alertmanager :根據 Prometheus 收集的指標管理警報。
Amazon CloudWatch :基於雲端的記錄和監控服務。
程式碼提交:開發人員將程式碼推送到 GitHub。
CI Pipeline :Jenkins 偵測程式碼變更、建置專案、執行測試並建置 Docker 映像。
映像推送:Jenkins 將 Docker 映像推送到 Amazon ECR。
基礎架構部署:Terraform 在 AWS 上配置必要的基礎架構。
CD 管道:Jenkins 將應用程式部署到 Amazon EKS,並由 Istio 管理流量路由。
服務網格管理:Istio 處理服務通訊、安全性和監控。
監控和日誌記錄:Prometheus 收集指標,Grafana 將其視覺化,Fluentd 將日誌轉發到 CloudWatch。
警報:Alertmanager 根據 Prometheus 指標發送警報。
mkdir advanced-aws-devops-project
cd advanced-aws-devops-project
terraform init
main.tf
檔案來定義您的 VPC、子網路和網路元件: provider "aws" {
region = "us-west-2"
}
resource "aws_vpc" "main_vpc" {
cidr_block = "10.0.0.0/16"
enable_dns_support = true
enable_dns_hostnames = true
tags = {
Name = "advanced-devops-vpc"
}
}
resource "aws_subnet" "public_subnet" {
vpc_id = aws_vpc.main_vpc.id
cidr_block = "10.0.1.0/24"
map_public_ip_on_launch = true
availability_zone = "us-west-2a"
tags = {
Name = "public-subnet"
}
}
resource "aws_subnet" "private_subnet" {
vpc_id = aws_vpc.main_vpc.id
cidr_block = "10.0.2.0/24"
availability_zone = "us-west-2b"
tags = {
Name = "private-subnet"
}
}
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.main_vpc.id
tags = {
Name = "main-igw"
}
}
resource "aws_route_table" "public_route_table" {
vpc_id = aws_vpc.main_vpc.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw.id
}
tags = {
Name = "public-route-table"
}
}
resource "aws_route_table_association" "public_subnet_association" {
subnet_id = aws_subnet.public_subnet.id
route_table_id = aws_route_table.public_route_table.id
}
terraform apply
iam.tf
檔案來定義 EKS、RDS 和其他 AWS 服務的 IAM 角色和原則: resource "aws_iam_role" "eks_role" {
name = "eks_role"
assume_role_policy = jsonencode({
"Version": "2012-10-17",
"Statement": [{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "eks.amazonaws.com"
}
}]
})
}
resource "aws_iam_role_policy_attachment" "eks_policy_attachment" {
role = aws_iam_role.eks_role.name
policy_arn = "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
}
resource "aws_iam_role" "rds_role" {
name = "rds_role"
assume_role_policy = jsonencode({
"Version": "2012-10-17",
"Statement": [{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "rds.amazonaws.com"
}
}]
})
}
resource "aws_iam_role_policy_attachment" "rds_policy_attachment" {
role = aws_iam_role.rds_role.name
policy_arn = "arn:aws:iam::aws:policy/AmazonRDSFullAccess"
}
terraform apply
main.tf
以建立具有自動擴展節點組的 EKS 叢集: module "eks" {
source = "terraform-aws-modules/eks/aws"
cluster_name = "advanced-eks-cluster"
cluster_version = "1.24"
vpc_id = aws_vpc.main_vpc.id
subnets = [aws_subnet.public_subnet.id, aws_subnet.private_subnet.id]
node_groups = {
eks_nodes = {
desired_capacity = 3
max_capacity = 5
min_capacity = 2
instance_type = "t3.medium"
key_name = "your-key-pair"
tags = {
Name = "advanced-eks-node"
}
}
}
}
terraform apply
步驟 4:與 RDS 整合以實現持久存儲
rds.tf
檔案中建立用於持久性儲存的 RDS 實例: resource "aws_db_instance" "db_instance" {
allocated_storage = 20
engine = "mysql"
engine_version = "8.0"
instance_class = "db.t3.micro"
name = "microservicesdb"
username = "admin"
password = "password"
parameter_group_name = "default.mysql8.0"
skip_final_snapshot = true
vpc_security_group_ids = [aws_security_group.eks_sg.id]
db_subnet_group_name = aws_db_subnet_group.rds_subnet_group.name
}
resource "aws_db_subnet_group" "rds_subnet_group" {
name = "rds-subnet-group"
subnet_ids = [aws_subnet.private_subnet.id]
tags = {
Name = "RDS Subnet Group"
}
}
terraform apply
resource "aws_launch_configuration" "jenkins_lc" {
image_id = "ami-0abcdef1234567890"
instance_type = "t3.medium"
key_name = "your-key-pair"
security_groups = [aws_security_group.jenkins_sg.id]
lifecycle {
create_before_destroy = true
}
user_data = <<-EOF
#!/bin/bash
sudo yum update -y
sudo yum install -y java-1.8.0-openjdk
sudo wget -O /etc/yum.repos.d/jenkins.repo \
https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
sudo yum install -y jenkins
sudo systemctl start jenkins
sudo systemctl enable jenkins
EOF
}
resource "aws_autoscaling_group" "jenkins_asg" {
launch_configuration = aws_launch_configuration.jenkins_lc.id
min_size = 2
max_size = 4
desired_capacity = 2
vpc_zone_identifier = [aws_subnet.public_subnet.id]
tags = [
{
key = "Name"
value = "Jenkins Instance"
propagate_at_launch = true
},
]
}
terraform apply
Jenkins 主從(或控制器-代理)架構可讓您在多台機器上指派建置、測試和部署應用程式的工作負載。這種架構增強了效能並提供了更好的資源利用率,特別是在大規模環境中。這是在此架構中設定 Jenkins 的詳細指南。
Jenkins Master :主要的 Jenkins 伺服器,也稱為控制器,它編排建置任務並將其分發到代理節點。
Jenkins 代理程式:執行 Jenkins 主伺服器指派的建置任務的附加伺服器(從伺服器)。
您已在前面的步驟中在 EC2 執行個體上設定了 Jenkins。該實例將作為您的 Jenkins master。確保以下各項到位:
java -version
如果未安裝,您可以透過以下方式進行安裝:
sudo yum install -y java-1.8.0-openjdk
http://<Jenkins_Master_IP>:8080
進行確認。您需要額外的 EC2 執行個體來充當 Jenkins 代理程式。設定它們的方法如下:
使用 AWS 管理主控台啟動新的 EC2 執行個體。您可以選擇 Amazon Linux 2 AMI(或任何其他 Linux 發行版)。
確保這些實例具有足夠的資源(例如,t2.medium)並且與 Jenkins master 位於同一 VPC 中。
確保安全群組允許從 Jenkins master 進行 SSH 存取。
允許 Jenkins 代理與主站通訊所需的連接埠上的通訊(預設 SSH 連接埠 22)。
sudo yum update -y
sudo yum install -y java-1.8.0-openjdk
sudo useradd jenkins
sudo mkdir /home/jenkins/.ssh
sudo chown jenkins:jenkins /home/jenkins/.ssh
sudo chmod 700 /home/jenkins/.ssh
/home/jenkins/.ssh/authorized_keys
檔案。slave.jar
)。關於詹金斯大師: wget http://<Jenkins_Master_IP>:8080/jnlpJars/agent.jar
agent.jar
檔案傳輸到每個代理節點,並將其放置在/home/jenkins
等目錄中。在 Jenkins 儀表板上,前往管理 Jenkins > 管理節點和雲端 > 新節點。
輸入新節點的名稱(例如Agent-1
),選擇Permanent Agent ,然後按一下OK 。
遠端根目錄:指定代理程式上 Jenkins 應執行的目錄,例如/home/jenkins
。
Labels :為節點指派標籤以方便作業分配(例如linux-agent
)。
啟動方法:選擇透過 SSH 啟動代理程式。
Host :輸入代理節點的私有IP位址。
憑證:為jenkins
用戶新增 SSH 憑證(使用者名稱和私鑰)。
按一下「儲存」 ,然後按一下「透過 SSH 啟動代理」 。
Jenkins 將嘗試透過 SSH 連線到代理節點。如果成功,您將看到代理狀態變更為「已連線」。
現在您的 Jenkins master 已連接到代理節點,您可以將作業配置為在特定代理上執行:
在作業配置下,尋找「限制此專案可以運作的位置」部分。
輸入您想要執行作業的代理程式的標籤(例如, linux-agent
)。
儲存作業配置並觸發建置。
該作業現在應該在指定的 Jenkins 代理節點上執行。
節點監控:
Jenkins 為每個代理節點提供內建監控。您可以透過導航到Manage Jenkins > Manage Nodes and Clouds來查看此訊息,您將在其中看到每個代理程式的狀態、空閒時間和負載。
阻垢劑:
對於大型環境,您可以使用 AWS Auto Scaling Groups 為代理節點配置自動擴展,從而允許 Jenkins 根據工作負載自動擴展代理程式數量。
代理可用性:
透過為代理程式配置強大的執行狀況檢查(例如 CPU、記憶體和磁碟使用情況監控)來確保代理程式始終可用。與 CloudWatch 或 Prometheus 等監控工具整合可以幫助自動化。
假設您有一個包含以下元件的微服務應用程式:
使用者服務:管理使用者身份驗證和設定檔。
訂單服務:處理訂單處理和管理。
支付服務:與支付網關整合以處理付款。
為每個服務建立 Dockerfile:
使用者服務 Dockerfile :
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/user-service.jar
COPY ${JAR_FILE} user-service.jar
ENTRYPOINT ["java","-jar","/user-service.jar"]
訂單服務 Dockerfile :
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/order-service.jar
COPY ${JAR_FILE} order-service.jar
ENTRYPOINT ["java","-jar","/order-service.jar"]
支付服務 Dockerfile :
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/payment-service.jar
COPY ${JAR_FILE} payment-service.jar
ENTRYPOINT ["java","-jar","/payment-service.jar"]
docker build -t user-service ./user-service
docker build -t order-service ./order-service
docker build -t payment-service ./payment-service
# Push images to ECR
aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.us-west-2.amazonaws.com
docker tag user-service:latest <aws_account_id>.dkr.ecr.us-west-2.amazonaws.com/user-service:latest
docker push <aws_account_id>.dkr.ecr.us-west-2.amazonaws.com/user-service:latest
helm repo add istio https://istio-release.storage.googleapis.com/charts
helm install istio-base istio/base -n istio-system --create-namespace
helm install istiod istio/istiod -n istio-system
helm install istio-ingress istio/gateway -n istio-system
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: user-service
spec:
hosts:
- user-service
http:
- route:
- destination:
host: user-service
subset: v1
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: user-service
spec:
host: user-service
subsets:
- name: v1
labels:
version: v1
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: istio-system
spec:
mtls:
mode: STRICT
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git 'https://github.com/your-repo/microservices-app.git'
}
}
stage('Build') {
steps {
sh 'mvn clean package'
}
}
stage('Docker Build & Push') {
steps {
script {
docker.build("user-service:latest").push("${env.BUILD_TAG}")
}
}
}
stage('Deploy to EKS') {
steps {
script {
sh 'kubectl apply -f k8s/deployment.yaml'
sh 'kubectl apply -f k8s/service.yaml'
}
}
}
}
}
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service-green
spec:
replicas: 3
selector:
matchLabels:
app: user-service
version: green
template:
metadata:
labels:
app: user-service
version: green
spec:
containers:
- name: user-service
image: <aws_account_id>.dkr.ecr.us-west-2.amazonaws.com/user-service:green
ports:
- containerPort: 8080
kubectl apply -f k8s/user-service-green.yaml
kubectl apply -f k8s/virtualservice.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: user-service
spec:
hosts:
- user-service
http:
- route:
- destination:
host: user-service
subset: v1
weight: 90
- destination:
host: user-service
subset: v2
weight: 10
helm install prometheus prometheus-community/prometheus
helm install grafana grafana/grafana
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1.11
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
global:
smtp_smarthost: 'smtp.gmail.com:587'
smtp_from: 'alertmanager
@example.com'
smtp_auth_username: '[email protected]'
smtp_auth_password: 'password'
route:
receiver: 'email-alert'
receivers:
- name: 'email-alert'
email_configs:
- to: '[email protected]'
該專案展示了先進的 AWS DevOps 設置,其中包含多服務架構、Jenkins CI/CD 管道、Docker、Kubernetes 和 Istio 服務網格。提供的詳細步驟涵蓋基礎設施配置、自動化部署、監控、日誌記錄和警報,為 AWS 和 DevOps 工程師提供全面的指南。此設定可確保高可用性、可擴充性、安全性和可觀察性,使其成為在雲端原生環境中管理微服務的強大解決方案。
加入我們的Telegram 社群||在 GitHub 上關注我以獲取更多 DevOps 內容!