You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitOps场景下Gitlab-IaC-k8s-WebApp端到端架构及落地咨询

组件关联逻辑梳理
  • Docker:把Web应用打包成可移植的容器镜像,是整个部署链路的「应用载体」,后续所有部署动作都围绕这个镜像展开。
  • Terraform:作为基础设施即代码(IaC)工具,负责从0到1搭建底层资源——比如在AWS/GCP创建VPC、EKS/GKE集群节点、负载均衡等,最终输出一个可用的K8s集群。
  • Kubernetes (K8s):容器编排平台,负责调度、管理集群上的容器镜像,是应用运行的「操作系统」。
  • Flux:GitOps工具,核心作用是把Git仓库里的K8s部署清单(Deployment、Service等)同步到K8s集群,实现「以Git为唯一可信数据源」的部署管控,还能监听镜像仓库的新版本,自动触发应用更新。

整体协作链路:Docker打包应用镜像 → Terraform搭建K8s集群 → Flux将Git中的部署清单同步到集群,拉取镜像并运行应用。

宏观视角推荐阅读
  • 官方核心文档:
    • Terraform官方入门指南:聚焦IaC核心思想与云基础设施编排逻辑
    • Kubernetes官方Concepts文档:理清K8s核心组件的协作模式
    • Flux官方GitOps Guide:理解GitOps的核心流程与工具链定位
  • 经典书籍:
    • 《Kubernetes in Action》:从应用部署到集群运维,覆盖K8s全链路逻辑
    • 《Terraform: Up & Running》:系统讲解IaC落地思路与云厂商适配方案
    • 《GitOps Cookbook》:结合实战案例梳理GitOps与K8s、IaC的协同模式
GitLab CI + Terraform + AWS EKS + Flux + WebApp 全流程Hello World示例

1. 项目结构

├── .gitlab-ci.yml          # GitLab流水线配置
├── terraform/              # 基础设施代码目录
│   ├── main.tf             # 创建EKS集群、VPC等资源
│   ├── variables.tf        # Terraform变量定义
│   └── outputs.tf          # 输出K8s集群kubeconfig
├── k8s-manifests/          # K8s应用部署清单
│   ├── deployment.yaml     # WebApp Deployment
│   └── service.yaml        # WebApp Service
├── flux/                   # Flux配置目录
│   └── flux-bootstrap.yml  # Flux引导配置
└── webapp/                 # 示例Web应用
    ├── Dockerfile
    └── main.py             # 简单Hello World Python应用

2. WebApp代码与Dockerfile

webapp/main.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello GitOps World!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

webapp/Dockerfile

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir flask
COPY main.py .
EXPOSE 8080
CMD ["python", "main.py"]

3. Terraform配置(创建AWS EKS核心片段)

terraform/main.tf

provider "aws" {
  region = var.aws_region
}

module "eks" {
  source  = "terraform-aws-modules/eks/aws"
  version = "~> 19.0"

  cluster_name    = var.cluster_name
  cluster_version = "1.27"
  subnets         = module.vpc.private_subnets
  vpc_id          = module.vpc.vpc_id

  worker_groups = [
    {
      instance_type = "t3.medium"
      asg_max_size  = 2
    }
  ]
}

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "~> 5.0"

  name = "${var.cluster_name}-vpc"
  cidr = "10.0.0.0/16"

  azs             = slice(data.aws_availability_zones.available.names, 0, 3)
  private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
}

data "aws_availability_zones" "available" {}

4. GitLab CI流水线配置(.gitlab-ci.yml)

stages:
  - build-image
  - provision-infra
  - bootstrap-flux
  - deploy-app

# 构建并推送Docker镜像到GitLab容器仓库
build-image:
  stage: build-image
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t $CI_REGISTRY_IMAGE/webapp:latest webapp/
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker push $CI_REGISTRY_IMAGE/webapp:latest

# 使用Terraform创建EKS集群
provision-infra:
  stage: provision-infra
  image: hashicorp/terraform:latest
  script:
    - cd terraform
    - terraform init
    - terraform plan -out=plan.tfplan
    - terraform apply -auto-approve plan.tfplan
    - terraform output kubeconfig > ../kubeconfig
  artifacts:
    paths:
      - kubeconfig
    expire_in: 1h

# 引导Flux同步Git仓库到K8s集群
bootstrap-flux:
  stage: bootstrap-flux
  image: ghcr.io/fluxcd/flux-cli:latest
  script:
    - export KUBECONFIG=$(pwd)/kubeconfig
    - flux bootstrap gitlab --owner=$CI_PROJECT_NAMESPACE --repository=$CI_PROJECT_NAME --branch=main --path=flux --token-auth
    - flux create source git webapp-repo --url=$CI_REPOSITORY_URL --branch=main --interval=1m
    - flux create kustomization webapp-deploy --source=webapp-repo --path="./k8s-manifests" --prune=true --interval=1m

# 验证应用部署状态
deploy-app:
  stage: deploy-app
  image: bitnami/kubectl:latest
  script:
    - export KUBECONFIG=$(pwd)/kubeconfig
    - kubectl wait deployment/webapp --for=condition=available --timeout=5m
    - kubectl get pods

5. K8s应用清单(k8s-manifests/deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webapp
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: $CI_REGISTRY_IMAGE/webapp:latest
        ports:
        - containerPort: 8080

内容的提问来源于stack exchange,提问作者til

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:00:41