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