如何使用Sealos 构建SpringCloud项目CI/CD流水线

19 阅读2分钟

引言

在云原生时代,CI/CD流水线是保障微服务持续交付的核心能力。本文将基于Sealos云操作系统,结合SpringCloud项目,详解如何构建从代码提交到生产环境的全自动化部署流水线。通过GitLab CI与ArgoCD的深度集成,实现多环境一致性部署、快速回滚和可视化监控。


一、环境准备

1.1 Sealos集群部署

# 部署Kubernetes基础集群
sealos run ghcr.io/labring/sealos/kubernetes:v1.28.15 \
  --masters 192.168.0.2,192.168.0.3 \
  --nodes 192.168.0.4,192.168.0.5 -p 'your-ssh-passwd'

# 部署网络插件
sealos run ghcr.io/labring/sealos/cilium:v1.17.1

# 部署证书管理
sealos run ghcr.io/labring/sealos/cert-manager:v1.14.6

注:需提前配置好SSH免密登录环境

1.2 ArgoCD部署

# deploy/base/argocd/install.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: argocd
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/argoproj/argo-helm
    targetRevision: main
    chart: argo-cd
    helm:
      values: |
        server:
          service:
            type: ClusterIP
  destination:
    server: https://kubernetes.default.svc
    namespace: argocd
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

二、流水线设计

2.1 GitLab CI配置

# .gitlab-ci.yml
stages:
  - build
  - test
  - deploy-dev
  - deploy-staging
  - deploy-prod

variables:
  DOCKER_HOST: tcp://docker:2375
  KUBECONFIG: /etc/deploy/.kube/config

build:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHORT_SHA} .
    - docker push ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHORT_SHA}

test:
  stage: test
  image: maven:3.8.6
  script:
    - mvn clean test -Dspring.profiles.active=test

deploy-dev:
  stage: deploy-dev
  image: bitnami/kubectl:latest
  script:
    - kubectl config set-cluster sealos --server=${K8S_DEV_SERVER}
    - kubectl config set-credentials dev-admin --token=${DEV_TOKEN}
    - kubectl set image deployment/springcloud-demo-1 springcloud-demo= ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHORT_SHA} -n dev
  only:
    - dev

2.2 ArgoCD应用清单

# deploy/applications/springcloud-dev.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: springcloud-dev
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://gitlab.com/myorg/springcloud-demo.git
    targetRevision: dev
    path: deploy/overlays/dev
  destination:
    server: https://kubernetes.default.svc
    namespace: dev
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

三、多环境部署策略

3.1 命名空间隔离

# 创建环境命名空间
kubectl create namespace dev --labels=env=development
kubectl create namespace staging --labels=env=staging
kubectl create namespace prod --labels=env=production

3.2 蓝绿部署配置

# deploy/overlays/prod/rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: springcloud-demo
spec:
  replicas: 3
  strategy:
    blueGreen:
      activeService: springcloud-demo-active
      previewService: springcloud-demo-preview
      autoPromotionEnabled: false
      autoPromotionSeconds: 30
  template:
    spec:
      containers:
      - name: springcloud-demo
        image: registry.gitlab.com/myorg/springcloud-demo:latest

3.3 金丝雀发布策略

# deploy/overlays/prod/canary.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: springcloud-demo-canary
spec:
  replicas: 5
  strategy:
    canary:
      steps:
      - setWeight: 20
      - pause: {duration: 5m}
      - setWeight: 50
      - pause: {duration: 5m}
      - setWeight: 100

四、监控与告警

4.1 ArgoCD通知配置

# deploy/base/argocd/notifications.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: argocd-notifications
  annotations:
    notifications.argoproj.io/subscribe.on-sync-succeeded.slack: #prod-alerts
    notifications.argoproj.io/subscribe.on-sync-failed.slack: #prod-alerts

4.2 健康检查配置

# deploy/overlays/prod/healthchecks.yaml
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: production
spec:
  destinations:
  - namespace: prod
    server: https://kubernetes.default.svc
  syncWindows:
  - applications:
    - '*'
    kind: allow
    schedule: '* * * * *'
    duration: 1h

五、SpringCloud项目适配

5.1 Kubernetes资源清单

# deploy/manifests/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: springcloud-demo
spec:
  selector:
    app: springcloud-demo
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

5.2 配置中心集成

# config-server/config-repo/application-prod.yml
spring:
  cloud:
    config:
      server:
        git:
          uri: https://gitlab.com/myorg/config-repo
          search-paths: '{application}/{profile}'

通过Sealos与GitLab CI/ArgoCD的深度集成,我们构建了一套完整的SpringCloud项目CI/CD流水线。该方案实现了从代码提交到生产部署的全自动化,支持多环境隔离和智能发布策略。