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
相关产品推荐
相关产品推荐

