从 Terraform 到 GitOps:构建一个端到端 DevOps 平台,包含 11 个微服务

发布: (2026年1月15日 GMT+8 08:18)
8 min read
原文: Dev.to

Source: Dev.to

本文涵盖

  • 我如何使用 Terraform 部署跳板机
  • 我如何使用 Ansible 配置跳板机
  • 额外奖励: 在构建此项目时实时监控您的 AWS 成本(使用 AWS CostWatch

适用对象

  • 免费层用户
  • 任何想要在自己的笔记本终端上运行所有操作的人

附加功能:实时监控您的 AWS 成本(AWS CostWatch)

您无需任何服务器——只需使用笔记本电脑的终端。

逐步操作

  1. 克隆代码库

    git clone https://github.com/vsaraths/AWS-Cost-Watch.git
    cd AWS-Cost-Watch
  2. 安装依赖

    pip install boto3 rich sqlite-utils
  3. 配置 AWS 凭证

    验证您已经拥有凭证:

    aws sts get-caller-identity

    如果尚未配置凭证:

    aws configure

    按提示提供以下信息:

    • Access Key ID(访问密钥 ID)
    • Secret Access Key(秘密访问密钥)
    • Default region name(默认区域名称)
    • Default output format(默认输出格式,选填)
  4. 运行 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 CLIaws configure
3创建 S3 后端terraform apply(在 s3-buckets 目录)
3.1(可选)构建 VPCterraform apply(在 network 目录)
4启动跳板机terraform apply(在 ec2-jumphost 目录)
5SSH 与 Jenkinsssh …cat …/initialAdminPassword

如有需要,可自行调整任意命令(例如添加 -var 参数,或使用不同的后端)以适配您的环境。祝部署顺利!

Jenkins – 安装与流水线设置

步骤 6 – 安装 Jenkins 插件

  1. 导航: Jenkins Dashboard → Manage Jenkins → Plugins
  2. 安装 所需插件(例如 GitDockerKubernetesPipeline 等)。
  3. 安装完成后,重启 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
带参数构建 → ACTIONcreate-eks-cluster

8.2 创建 Elastic Container Registry (ECR)

设置
作业类型Pipeline (Multibranch)
分支指定符*/main
带参数构建 → ACTIONcreate-ecr

使用以下命令验证仓库:

aws ecr describe-repositories --region us-east-1

8.3 构建并推送 Docker 镜像到 ECR

为每个微服务创建单独的流水线作业(或一个多分支作业)。使用下表为每个服务定义 ACTION 参数。

服务构建参数 (ACTION)
emailservicebuild-emailservice
checkoutservicebuild-checkoutservice
recommendationservicebuild-recommendationservice
frontendbuild-frontend
paymentservicebuild-paymentservice
productcatalogservicebuild-productcatalogservice
cartservicebuild-cartservice
loadgeneratorbuild-loadgenerator
currencyservicebuild-currencyservice
shippingservicebuild-shippingservice
adservicebuild-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.

回顾

  1. 使用 CostWatch 实时监控 AWS 成本
  2. 使用 Terraform + Ansible 部署可复用的跳板机
  3. 配置 Jenkins,包括所需插件、凭证以及针对 EKS、ECR 和所有微服务的流水线。
  4. 在跳板机上安装 Argo CD,用于管理 GitOps 部署。

按照这些步骤,你将获得一个可重复、易调试且可投入生产的 DevOps 基础。祝构建愉快!

测试 Pod(如有必要)

kubectl get nodes

13.5 – 列出所有 ArgoCD 资源

输出已省略。

13.6 – 使用 LoadBalancer 暴露 ArgoCD Server

13.6.1 – 编辑 ArgoCD Server Service

  1. 找到 ArgoCD Server Service 的清单文件(例如 argocd-server-svc.yaml)。

  2. 查找并替换以下行:

    Original snippet

    type: ClusterIP   # '
        send_resolved: true

    Updated snippet

    type: LoadBalancer

    注意: send_resolved: true 行属于 Alertmanager 配置,应该从 ArgoCD Service 清单中删除。

  3. 应用更改

    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

现在您可以访问 PrometheusGrafana,并在 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 指标

一切就绪! 🎉

Back to Blog

相关文章

阅读更多 »