gitlab-ci-notify EKS 极简部署与验证

gitlab-ci-notify EKS 极简部署与验证运维手册
本方案采用 PVC 源码挂载 + 官方 Node 镜像 + Higress 共享网关 架构,无需自建 Dockerfile 与私有镜像仓库,无需新建 VPC 或外部 LoadBalancer,资源与集群其他业务物理隔离。
一、完整部署清单(YAML)
1. 基础服务清单 (gitlab-notify-app.yaml)
包含 Namespace、持久化存储卷(PVC)、应用 Deployment 以及内部通信 Service。

apiVersion: v1
kind: Namespace
metadata:
  name: gitlab-notify
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: gitlab-notify-code-pvc
  namespace: gitlab-notify
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gitlab-ci-notify
  namespace: gitlab-notify
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gitlab-ci-notify
  template:
    metadata:
      labels:
        app: gitlab-ci-notify
    spec:
      volumes:
        - name: code-storage
          persistentVolumeClaim:
            claimName: gitlab-notify-code-pvc
      containers:
        - name: notify-server
          image: node:20-alpine
          workingDir: /app
          ports:
            - containerPort: 3001
          volumeMounts:
            - name: code-storage
              mountPath: /app
          # 首次创建时先休眠,等待拷贝源码;后续通过 patch 切换为正式启动命令
          command: ["sh", "-c", "sleep 86400"]
---
apiVersion: v1
kind: Service
metadata:
  name: gitlab-ci-notify-svc
  namespace: gitlab-notify
spec:
  type: ClusterIP
  ports:
    - port: 3001
      targetPort: 3001
  selector:
    app: gitlab-ci-notify

2. 网关路由清单 (gitlab-notify-ingress.yaml)
复用集群现有的 Higress 网关与证书:

YAML

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: gitlab-ci-notify-ingress
  namespace: gitlab-notify
  annotations:
    kubernetes.io/ingress.class: "higress"
spec:
  ingressClassName: higress
  tls:
    - hosts:
        - notify.abcdefg.com
      secretName: abcdefg-cf
  rules:
    - host: notify.abcdefg.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: gitlab-ci-notify-svc
                port:
                  number: 3001


二、部署与初始化操作流程

1.应用基础资源与复制证书 Secret:

在 Mac 本地终端执行:

Bash

# 1. 创建 Namespace、PVC、Deployment、Service
kubectl apply -f gitlab-notify-app.yaml

# 2. 将全局证书 Secret 复制至当前命名空间
kubectl get secret abcdefg-cf -n higress-system -o yaml \
  | sed 's/namespace: higress-system/namespace: gitlab-notify/' \
  | kubectl apply -n gitlab-notify -f -

# 3. 创建 Ingress 路由规则
kubectl apply -f gitlab-notify-ingress.yaml

验证成功标准:执行 kubectl get pod,pvc,ingress -n gitlab-notify,看到 Pod 处于 Running 状态,PVC 处于 Bound 状态,Ingress 的 PORTS 列显示 80, 443。

2.打包本地项目并传入 PVC:

在本地 gitlab-ci-notify 代码根目录下执行:

Bash

# 1. 本地打包源码与配置(排除 git、本地缓存与日志,保留 config.js 和 .env)
tar --exclude='.git' --exclude='node_modules' --exclude='logs' -czvf app.tar.gz .

# 2. 获取 Pod 实例名
POD_NAME=$(kubectl get pod -n gitlab-notify -l app=gitlab-ci-notify -o jsonpath="{.items[0].metadata.name}")

# 3. 上传代码压缩包到 Pod 挂载的 PVC 目录
kubectl cp app.tar.gz gitlab-notify/$POD_NAME:/app/app.tar.gz

验证成功标准:执行 kubectl exec -n gitlab-notify $POD_NAME -- ls -lh /app/app.tar.gz,确认文件已正常写入持久盘。

3.解压并安装生产依赖:

在容器内解压文件并借助 corepack 与 pnpm-lock.yaml 一键安装依赖(预设跳过交互确认):

Bash

kubectl exec -it -n gitlab-notify $POD_NAME -- sh -c \
  "export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 && cd /app && tar -xzvf app.tar.gz && rm app.tar.gz && corepack enable && pnpm install --frozen-lockfile"

验证成功标准:执行 kubectl exec -n gitlab-notify $POD_NAME -- ls -la /app,看到 node_modules 目录已生成,且包含 config.js、bin、modes 等完整目录结构。

4.切换为正式启动命令:

通过 patch 将容器从休眠状态切换为运行 Webhook 启动脚本:

Bash

kubectl patch deployment gitlab-ci-notify -n gitlab-notify --patch '
spec:
  template:
    spec:
      containers:
      - name: notify-server
        command: ["node", "bin/webhook-server.js"]
'

验证成功标准:执行 kubectl logs -n gitlab-notify -l app=gitlab-ci-notify -f,终端打印出 GitLab Webhook 服务监听端口: 3001。


三、全链路验证与排查命令
1. 验证集群内部网络与端口映射(Port-Forward)
在 Mac 上本地直连后端 Pod 测试基础响应:

# 建立临时端口转发
kubectl port-forward svc/gitlab-ci-notify-svc 3001:3001 -n gitlab-notify

# 另起终端测试健康状态(应返回 HTTP 404 或应用标准响应,非连接拒绝)
curl -I http://127.0.0.1:3001/

2. 验证 Higress 网关层 Envoy 证书加载
验证网关底层是否已将该域名证书挂载至内存监听器:

HIGRESS_POD=$(kubectl get pod -n higress-system -l app=higress-gateway -o jsonpath="{.items[0].metadata.name}")
kubectl exec -n higress-system $HIGRESS_POD -c higress-gateway -- curl -s http://127.0.0.1:15000/certs | grep -i abcdefg

判定:输出中包含证书链及到期信息,说明 TLS 监听已绑定。
3. 验证公网 HTTPS 握手与 API 路由
在 Mac 终端测试实际请求入口:

curl -v -X POST https://notify.abceefg.com/gitlab-webhook \  -H "Content-Type: application/json" \  -d '{}'

判定:

  • 握手显示 SSL connection using TLSv... 正常通过。
  • 响应头返回 server: cloudflare 与 x-powered-by: Express。
  • 同时 Pod 日志(kubectl logs -n gitlab-notify -l app=gitlab-ci-notify --tail=10)输出接收到请求的记录。

4. 验证是否产生多余负载均衡器

kubectl get svc -A | grep LoadBalancer

判定:全集群仅保持原有网关 Service,gitlab-notify 命名空间内仅有 ClusterIP,未产生新的外部 LB 实例。
四、日常维护与配置热更新
如果后续需要修改配置(例如变更 config.js 规则或更新 .env 变量):

POD_NAME=$(kubectl get pod -n gitlab-notify -l app=gitlab-ci-notify -o jsonpath="{.items[0].metadata.name}")

# 1. 直接覆盖指定配置文件到 PVC
kubectl cp config.js gitlab-notify/$POD_NAME:/app/config.js

# 2. 平滑重启 Pod 重新加载配置
kubectl rollout restart deployment gitlab-ci-notify -n gitlab-notify

# 3. 跟踪启动日志
kubectl logs -n gitlab-notify -l app=gitlab-ci-notify -f

Read more

GitLab 升级迁移排查与修复手册

GitLab升级迁移排查与修复手册 本手册总结了在升级GitLab过程中,因历史脏数据约束冲突、数据库Advisory咨询锁阻塞,或后台批处理迁移(Batched Background Migrations,简称BBM)挂起导致db:migrate失败、容器启动循环或Web页面无法访问时的完整命令排查流程与核心注意事项。 目录 一、核心排查与修复命令流程 阶段一:清理数据库死锁与卡顿连接 阶段二:修复历史脏数据(以namespaces.state约束为例) 阶段三:处理后台批处理迁移(BBM)挂起与收尾 阶段四:恢复常规迁移与服务重构 阶段五:健康检查与系统验证 二、关键运维注意事项 1.数据库操作层面 2.后台批处理迁移(BBM)层面 3.容器与服务运维层面  一、核心排查与修复命令流程 阶段一:清理数据库死锁与卡顿连接 当迁移抛出ActiveRecord::ConcurrentMigrationError或提示锁等待超时时,需要清理后台残留的Advisory锁。 #终止所有非当前会话的advisory锁 docker exec -it

By GM Brian