从 Terraform 到 GitOps:构建一个端到端 DevOps 平台,包含 11 个微服务
Source: Dev.to
本文涵盖
- 我如何使用 Terraform 部署跳板机
- 我如何使用 Ansible 配置跳板机
- 额外奖励: 在构建此项目时实时监控您的 AWS 成本(使用 AWS CostWatch)
适用对象
- 免费层用户
- 任何想要在自己的笔记本终端上运行所有操作的人
附加功能:实时监控您的 AWS 成本(AWS CostWatch)
您无需任何服务器——只需使用笔记本电脑的终端。
逐步操作
-
克隆代码库
git clone https://github.com/vsaraths/AWS-Cost-Watch.git cd AWS-Cost-Watch -
安装依赖
pip install boto3 rich sqlite-utils -
配置 AWS 凭证
验证您已经拥有凭证:
aws sts get-caller-identity如果尚未配置凭证:
aws configure按提示提供以下信息:
- Access Key ID(访问密钥 ID)
- Secret Access Key(秘密访问密钥)
- Default region name(默认区域名称)
- Default output format(默认输出格式,选填)
-
运行 CostWatch
python3 aws_cost_dashboard.py该工具将立即扫描您的 AWS 账户,并实时显示费用信息。
Terraform 与 Ansible – 构建跳板机
以下是一份简明的分步指南,用于使用 Terraform(基础设施)和 Ansible(配置)来部署跳板机。
1️⃣ 克隆基础设施仓库
git clone <REPO_URL>
cd <REPO_DIRECTORY>
将
<REPO_URL>和<REPO_DIRECTORY>替换为您项目的实际值。
2️⃣ 配置 AWS CLI(如果尚未配置)
aws configure
输入您将在 Terraform 中使用的相同 AWS 凭证。
3️⃣ 为 Terraform 状态创建 S3 后端
cd s3-buckets
# 运行创建存储桶的 Terraform 脚本
terraform init
terraform apply -auto-approve
S3 存储桶用于远程保存 Terraform 状态,实现安全的协作式基础设施管理。
3.1️⃣ (可选)创建网络基础设施
cd ../network
terraform init
terraform apply -auto-approve # 创建 VPC、子网、路由表等
示例验证
terraform state list
4️⃣ 部署 Jumphost EC2(Terraform + Ansible)
cd ../ec2-jumphost
terraform init
terraform apply -auto-approve # 创建 EC2 实例
实例启动后,随附的 Ansible 剧本会安装并配置所有必需的工具,使设置可重复且幂等。
5️⃣ 连接 EC2 实例并访问 Jenkins
# 将 <KEY_NAME>.pem、<PUBLIC_IP> 替换为您的实际值
ssh -i <KEY_NAME>.pem ec2-user@<PUBLIC_IP>
验证 Git 是否已安装
git --version
获取 Jenkins 管理员密码
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
📌 快速回顾
| 步骤 | 操作 | 关键命令 |
|---|---|---|
| 1 | 克隆仓库 | git clone … |
| 2 | 配置 AWS CLI | aws configure |
| 3 | 创建 S3 后端 | terraform apply(在 s3-buckets 目录) |
| 3.1 | (可选)构建 VPC | terraform apply(在 network 目录) |
| 4 | 启动跳板机 | terraform apply(在 ec2-jumphost 目录) |
| 5 | SSH 与 Jenkins | ssh … → cat …/initialAdminPassword |
如有需要,可自行调整任意命令(例如添加 -var 参数,或使用不同的后端)以适配您的环境。祝部署顺利!
Jenkins – 安装与流水线设置
步骤 6 – 安装 Jenkins 插件
- 导航:
Jenkins Dashboard → Manage Jenkins → Plugins - 安装 所需插件(例如 Git、Docker、Kubernetes、Pipeline 等)。
- 安装完成后,重启 Jenkins(确保没有作业在运行)。
步骤 7 – 设置 Jenkins 凭证
添加 GitHub 个人访问令牌 (PAT):
Jenkins Dashboard → Manage Jenkins → Credentials → (global) → Global credentials (unrestricted) → Add Credentials → Secret text
步骤 8 – 创建 Jenkins 流水线作业
所有流水线均指向同一个 GitHub 仓库:
https://github.com/vsaraths/Deploy--E-Commerce-Application-eks-microservices-platform-11-Services-.git
8.1 创建 EKS 集群
| 设置 | 值 |
|---|---|
| 作业类型 | Pipeline (Multibranch) |
| 分支指定符 | */main |
| 带参数构建 → ACTION | create-eks-cluster |
8.2 创建 Elastic Container Registry (ECR)
| 设置 | 值 |
|---|---|
| 作业类型 | Pipeline (Multibranch) |
| 分支指定符 | */main |
| 带参数构建 → ACTION | create-ecr |
使用以下命令验证仓库:
aws ecr describe-repositories --region us-east-1
8.3 构建并推送 Docker 镜像到 ECR
为每个微服务创建单独的流水线作业(或一个多分支作业)。使用下表为每个服务定义 ACTION 参数。
| 服务 | 构建参数 (ACTION) |
|---|---|
| emailservice | build-emailservice |
| checkoutservice | build-checkoutservice |
| recommendationservice | build-recommendationservice |
| frontend | build-frontend |
| paymentservice | build-paymentservice |
| productcatalogservice | build-productcatalogservice |
| cartservice | build-cartservice |
| loadgenerator | build-loadgenerator |
| currencyservice | build-currencyservice |
| shippingservice | build-shippingservice |
| adservice | build-adservice |
示例 Jenkinsfile (Groovy)
pipeline {
agent any
environment {
AWS_DEFAULT_REGION = 'us-east-1'
ECR_REPO = "your-account-id.dkr.ecr.${env.AWS_DEFAULT_REGION}.amazonaws.com/${params.SERVICE}"
}
stages {
stage('Checkout') {
steps {
git url: 'https://github.com/vsaraths/Deploy--E-Commerce-Application-eks-microservices-platform-11-Services-.git',
branch: 'main'
}
}
stage('Build Docker Image') {
steps {
sh "docker build -t ${params.SERVICE}:latest ./services/${params.SERVICE}"
}
}
stage('Login to ECR') {
steps {
sh "aws ecr get-login-password | docker login --username AWS --password-stdin ${ECR_REPO}"
}
}
stage('Push Image') {
steps {
sh """
docker tag ${params.SERVICE}:latest ${ECR_REPO}:latest
docker push ${ECR_REPO}:latest
"""
}
}
}
}
将 ${params.SERVICE} 替换为每个作业对应的服务名称。
Argo CD – 在 Jumphost EC2 上安装
步骤 13 – 安装 Argo CD
# 13.1 Create a namespace for Argo CD
kubectl create namespace argocd
# 13.2 Install Argo CD manifests
kubectl apply -n argocd \
-f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 13.3 Verify the installation
kubectl get pods -n argocd # All pods should be in the Running state.
# 13.4 (Optional) Validate the cluster nodes
kubectl get nodes
访问 Argo CD UI(端口转发示例)
kubectl port-forward svc/argocd-server -n argocd 8080:443
# Then open https://localhost:8080 in your browser.
回顾
- 使用 CostWatch 实时监控 AWS 成本。
- 使用 Terraform + Ansible 部署可复用的跳板机。
- 配置 Jenkins,包括所需插件、凭证以及针对 EKS、ECR 和所有微服务的流水线。
- 在跳板机上安装 Argo CD,用于管理 GitOps 部署。
按照这些步骤,你将获得一个可重复、易调试且可投入生产的 DevOps 基础。祝构建愉快!
测试 Pod(如有必要)
kubectl get nodes
13.5 – 列出所有 ArgoCD 资源
输出已省略。
13.6 – 使用 LoadBalancer 暴露 ArgoCD Server
13.6.1 – 编辑 ArgoCD Server Service
-
找到 ArgoCD Server Service 的清单文件(例如
argocd-server-svc.yaml)。 -
查找并替换以下行:
Original snippet
type: ClusterIP # ' send_resolved: trueUpdated snippet
type: LoadBalancer注意:
send_resolved: true行属于 Alertmanager 配置,应该从 ArgoCD Service 清单中删除。 -
应用更改
kubectl apply -f argocd-server-svc.yaml
13.6.2 – 重启 Alertmanager Pod
kubectl rollout restart deployment/kube-prom-stack-alertmanager -n monitoring
⚠️ Gmail 用户: 如果需要通过 Gmail 发送警报,请在 Google 账户安全设置中启用“低安全性应用”或创建应用密码。这可以让 Alertmanager 在使用 Gmail 的 SMTP 服务器时进行身份验证。
添加 CPU‑Usage 警报规则
创建 cpu-alert-rule.yaml:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: cpu-alert
namespace: monitoring
spec:
groups:
- name: cpu.rules
rules:
- alert: HighCPUUsage
expr: sum(rate(container_cpu_usage_seconds_total{namespace="argocd"}[5m])) by (pod) > 0.7
for: 2m
labels:
severity: warning
annotations:
summary: "CPU usage > 70% on pod {{ $labels.pod }}"
description: "CPU usage has been above 70% for more than 2 minutes."
应用规则:
kubectl apply -f cpu-alert-rule.yaml
编辑 Prometheus 服务
将服务类型更改为 LoadBalancer(与 Alertmanager 相同的步骤),并应用更改。
获取 Prometheus LoadBalancer IP
kubectl get svc -n monitoring kube-prom-stack-prometheus
示例 URL
http://a1b2c3d4.us-east-1.elb.amazonaws.com:9090
现在您可以访问 Prometheus、Grafana,并在 CPU 使用率超过设定阈值时收到电子邮件警报。
🎉 Final Checklist
- ✅ Prometheus & Grafana installed
- ✅ Grafana dashboards imported (Kubernetes, Argo CD, etc.)
- ✅ Alertmanager reachable via LoadBalancer and email alerts configured
- ✅ CPU/RAM metrics for your Argo CD app visible in Grafana
You’re all set! 🎉
🎉 最终检查清单
- ✅ 已安装 Prometheus 与 Grafana
- ✅ 已导入 Grafana 仪表盘(Kubernetes、Argo CD 等)
- ✅ Alertmanager 可通过 LoadBalancer 访问,已配置邮件告警
- ✅ 在 Grafana 中可见 Argo CD 应用的 CPU/RAM 指标
一切就绪! 🎉