单机 Sre展示项目 详细部署方案

单机 SRE 展示项目:详细部署方案(GitLab + Harbor + Trivy + Argo Rollouts + kube-prometheus-stack + k3s)

适用环境:Ubuntu 24.04 / 32G / 200G / IP: 192.168.101.100(干净初始化机器)

0. 总览与目录

  • 容器与编排:k3s(单机)
  • 代码平台:GitLab Community Edition(容器化)
  • 制品仓库:Harbor(镜像+Helm OCI)
  • 安全扫描:Trivy(CI 集成 + Harbor 弱点扫描)
  • 发布策略:Argo Rollouts(金丝雀/蓝绿)
  • 可观测性:kube-prometheus-stack(Prometheus + Alertmanager + Grafana)

目录建议:

/opt/sre-lab/
  infra/                 # compose 与配置
  manifests/             # k8s yaml(argo rollouts 等)
  helm-values/           # helm values 覆盖
  docs/                  # 文档与截图

1. 基础准备

# 1) 系统更新
sudo apt update && sudo apt -y upgrade

# 2) 安装必要工具
sudo apt -y install curl wget git apt-transport-https ca-certificates gnupg lsb-release jq

# 3) Docker Engine(可选:若仅用 containerd 也可)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update && sudo apt -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER

# 4) 安装 k3s(单机)
curl -sfL https://get.k3s.io | sh -
# 等待就绪
sudo kubectl get node -o wide

# 5) Helm
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# 6) kubectl 自动补全(可选)
sudo apt -y install bash-completion
source /etc/bash_completion
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl >/dev/null

# 7) 目录
sudo mkdir -p /opt/sre-lab/infra /opt/sre-lab/manifests /opt/sre-lab/helm-values /opt/sre-lab/docs

2. 安装 GitLab(容器化)

采用 omnibus 镜像,单机 PoC 用 http 即可,后续可启用 https。

cat >/opt/sre-lab/infra/gitlab-compose.yml <<'YAML'
version: "3.8"
services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    container_name: gitlab
    hostname: gitlab.local
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://192.168.101.100'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
    ports:
      - "8082:80"
      - "2224:22"
    volumes:
      - ./gitlab/config:/etc/gitlab
      - ./gitlab/logs:/var/log/gitlab
      - ./gitlab/data:/var/opt/gitlab
    restart: unless-stopped
YAML

cd /opt/sre-lab/infra && docker compose -f gitlab-compose.yml up -d
# 初始化需几分钟,访问 http://192.168.101.100:8082 设置 root 密码

注册 Runner(Docker 执行器,或使用 Kubernetes 执行器后续接入 k8s):

cat >/opt/sre-lab/infra/gitlab-runner-compose.yml <<'YAML'
version: "3.8"
services:
  gitlab-runner:
    image: gitlab/gitlab-runner:alpine
    container_name: gitlab-runner
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./gitlab-runner/config:/etc/gitlab-runner
    restart: unless-stopped
YAML

docker compose -f /opt/sre-lab/infra/gitlab-runner-compose.yml up -d
# 在 GitLab UI -> Admin -> Runners 获取注册令牌
sudo docker exec -it gitlab-runner gitlab-runner register
# 选择 docker 执行器,默认镜像建议:docker:stable 或 docker:24

3. 安装 Harbor(镜像+Helm OCI)

Harbor 提供镜像与 Helm OCI 支持(可替代 ChartMuseum)。

# 1) 下载安装
cd /opt/sre-lab/infra
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-online-installer-v2.10.0.tgz
sudo tar xzf harbor-online-installer-v2.10.0.tgz
cd harbor

# 2) 生成基础配置
sudo cp harbor.yml.tmpl harbor.yml
sudo sed -i 's/hostname: reg.mydomain.com/hostname: 192.168.101.100/g' harbor.yml
sudo sed -i 's/port: 443/port: 8083/g' harbor.yml
sudo sed -i 's/^https:/#https:/g' harbor.yml
sudo sed -i 's/^  port: 443/#  port: 443/g' harbor.yml
sudo sed -i 's/^  certificate:/#  certificate:/g' harbor.yml
sudo sed -i 's/^  private_key:/#  private_key:/g' harbor.yml

# 3) 安装
sudo ./install.sh --with-trivy
# 访问 http://192.168.101.100:8083 (默认 admin / Harbor12345)

Docker/Helm 使用 Harbor:

# Docker 登录
docker login 192.168.101.100:8083 -u admin -p 'Harbor12345'
# 推送镜像
docker tag demo/web:latest 192.168.101.100:8083/library/demo-web:1.0.0
docker push 192.168.101.100:8083/library/demo-web:1.0.0

# Helm(使用 OCI)
export HELM_EXPERIMENTAL_OCI=1
helm registry login 192.168.101.100:8083 -u admin -p 'Harbor12345'
# 打包
helm package helm/demo -d dist
# 推送到 oci://
helm push dist/demo-1.0.0.tgz oci://192.168.101.100:8083/library

k3s 访问私有仓库(HTTP/自签证书请相应配置):

sudo tee /etc/rancher/k3s/registries.yaml >/dev/null <<'EOF'
mirrors:
  "192.168.101.100:8083":
    endpoint:
      - "http://192.168.101.100:8083"
EOF
sudo systemctl restart k3s

4. 安装 kube-prometheus-stack(监控)

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# values 最小化覆盖(Grafana 使用 3001 端口通过 NodePort 暴露)
cat >/opt/sre-lab/helm-values/kps-values.yaml <<'YAML'
grafana:
  service:
    type: NodePort
    nodePort: 30001
  adminPassword: admin123
prometheus:
  service:
    type: NodePort
    nodePort: 30000
YAML

helm upgrade --install kps prometheus-community/kube-prometheus-stack \
  -n monitoring --create-namespace \
  -f /opt/sre-lab/helm-values/kps-values.yaml

# 访问 Grafana: http://192.168.101.100:30001  用户/密码:admin/admin123
# 访问 Prometheus: http://192.168.101.100:30000

5. 安装 Argo Rollouts(金丝雀/蓝绿)

kubectl create namespace argo-rollouts || true
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
# UI(Dashboard)可选安装:
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/dashboard-install.yaml
kubectl -n argo-rollouts port-forward svc/argo-rollouts-dashboard 3100:3100 # 本地查看

示例 Rollout(以 demo-web 为例):

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: demo-web
  namespace: dev
spec:
  replicas: 3
  strategy:
    canary:
      steps:
        - setWeight: 20
        - pause: {duration: 60}
        - setWeight: 50
        - pause: {duration: 120}
      trafficRouting:
        nginx: {}
  selector:
    matchLabels: { app: demo-web }
  template:
    metadata: { labels: { app: demo-web } }
    spec:
      containers:
        - name: web
          image: 192.168.101.100:8083/library/demo-web:1.0.0
          ports:
            - containerPort: 8080

注意:需使用 Ingress-NGINX 或支持的 LB 作为流量路由(k3s 可安装 ingress-nginx):

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx -n ingress-nginx --create-namespace

6. CI:GitLab CI 集成 Trivy + Helm OCI + 部署到 K8s

.gitlab-ci.yml 示例(Docker 执行器):

stages: [build, scan, package, deploy]

variables:
  DOCKER_HOST: tcp://docker:2375/
  DOCKER_TLS_CERTDIR: ""
  IMAGE: 192.168.101.100:8083/library/demo-web:${CI_COMMIT_SHORT_SHA}

build:
  stage: build
  image: docker:24
  services: ["docker:24-dind"]
  script:
    - docker login 192.168.101.100:8083 -u "$HARBOR_USER" -p "$HARBOR_PASS"
    - docker build -t $IMAGE .
    - docker push $IMAGE

scan:
  stage: scan
  image: aquasec/trivy:latest
  script:
    - trivy image --exit-code 0 --severity HIGH,CRITICAL $IMAGE
    - trivy image --exit-code 1 --severity CRITICAL $IMAGE || (echo "CRITICAL 漏洞阻断" && exit 1)

package:
  stage: package
  image: alpine/helm:3.13.2
  script:
    - export HELM_EXPERIMENTAL_OCI=1
    - helm registry login 192.168.101.100:8083 -u "$HARBOR_USER" -p "$HARBOR_PASS"
    - helm lint helm/demo
    - helm package helm/demo -d dist
    - helm push dist/*.tgz oci://192.168.101.100:8083/library
  artifacts:
    paths: [dist]

.deploy_template: &deploy
  stage: deploy
  image:
    name: bitnami/kubectl:1.30
    entrypoint: [""]
  script:
    - kubectl config use-context default

deploy_dev:
  <<: *deploy
  environment: { name: dev }
  script:
    - *deploy.script
    - helm upgrade --install demo-web helm/demo \
        --namespace dev --create-namespace \
        --set image.repository=${IMAGE%:*} \
        --set image.tag=${CI_COMMIT_SHORT_SHA}

deploy_prod:
  <<: *deploy
  environment: { name: prod }
  only:
    - /^release\/.+$/
  script:
    - *deploy.script
    - helm upgrade --install demo-web helm/demo \
        --namespace prod --create-namespace \
        --set image.repository=${IMAGE%:*} \
        --set image.tag=${CI_COMMIT_SHORT_SHA}

Kubeconfig 提供给 Runner:可将 /etc/rancher/k3s/k3s.yaml 内容保存为 GitLab 变量(masked, protected)或挂载到 Runner 容器。

7. Ingress 与 HTTPS(可选但推荐)

  • 为 GitLab、Harbor、Grafana 等分配域名(如内网 DNS 或 hosts)。
  • 使用 ingress-nginx + cert-manager 自动签发自签证书或内部 CA。

8. 验证与演示

  • GitLab 提交 MR → 主干合并触发:构建→Trivy 扫描→推镜像到 Harbor→推 Helm OCI→部署到 dev。
  • 观察 kube-prometheus-stack 指标与 Grafana 面板;
  • release/x.y.z 分支触发 prod;
  • 使用 Argo Rollouts 逐步放量→验证→如异常回滚。

9. 备份与维护

  • GitLab:备份 /opt/sre-lab/infra/gitlab/{config,logs,data}
  • Harbor:备份 /opt/sre-lab/infra/harbor 目录与后端存储
  • k3s:/etc/rancher/k3s、重要命名空间的 PV(如有)
  • 定期更新:helm upgrade 与镜像升级;Trivy 数据库自动更新

本方案落地后,你将获得:

  • GitLab 统一代码与 CI 平台;
  • Harbor 统一镜像与 Helm OCI 制品管理;
  • Trivy 在 CI 与 Harbor 侧的漏洞把关;
  • Argo Rollouts 金丝雀/蓝绿发布;
  • kube-prometheus-stack 统一可观测性。