主题
03 高可用部署
拓扑
| 组件 | 副本 | 控制器 | 存储 |
|---|---|---|---|
| webservice (puma+workhorse) | 2(HPA 钉死 2/2) | Deployment | 无状态(文件走 MinIO) |
| sidekiq | 2(HPA 钉死) | Deployment | 无状态 |
| gitlab-shell | 2(HPA 钉死) | Deployment + NodePort 30022 | 无状态 |
| praefect | 2 | StatefulSet | 无状态(元数据在 PG praefect 库) |
| gitaly | 3 | StatefulSet | 各 100Gi PVC(nfs-gitlab),Praefect 三副本复制 |
| postgresql 17 | 1 | Deployment (Recreate) | 20Gi PVC |
| redis 7 | 1 | Deployment (Recreate) | 5Gi PVC(AOF) |
| minio | 1 | Deployment (Recreate) | 100Gi PVC |
关键设计决策(chart 10.2.2 特性)
- chart 10.x 不再捆绑 postgresql/redis/minio —— 外部依赖强制;按 sonarqube 惯例在 ns 内手写 Deployment(
deploy/deps/)。 - 外部 PG/Redis 为硬性要求:
global.psql.host+global.psql.password.secret、global.redis.host+ auth secret,缺失则 checkConfig 直接 fail。 - praefect dbSecret 陷阱:shared-secrets 只在未设
global.praefect.psql.host时生成随机密码(与真实 PG 不符)。必须预建gitlab-praefect-dbsecret(keysecret),值为 PG 用户密码;并设xxx(默认用户是 praefect)。 global.image.registry只对 mailroom 生效!每个组件镜像需逐个覆盖 repository(见 values.yaml),另必须改global.gitlabBase.image(所有 init 容器)、global.kubectl.image、global.certificates.image。- 10.2 默认开启
global.gatewayApi.enabled/installEnvoy—— 不用 ingress 也必须显式关闭,否则拉 docker.io envoy 镜像。 - 默认开启需显式关闭的项:
installCertmanager、prometheus.install、gitlab-runner.install、registry.enabled+global.registry.enabled、global.kas.enabled、gitlab.gitlab-exporter.enabled、upgradeCheck.enabled。 - webservice 不支持指定 nodePort → 独立清单
deploy/gitlab/40-nodeport-svc.yaml建gitlab-web-nodeport(NodePort 30080 → workhorse 8181,selectorapp=webservice,release=gitlab,gitlab.com/webservice-name=default)。 - 副本数没有静态 replicas 键:webservice/sidekiq/shell 由 HPA 控制,用
minReplicas: 2, maxReplicas: 2钉死;gitaly 副本数由global.praefect.virtualStorages[].gitalyReplicas: 3决定。 - 非标准外部端口(https://ai-ear.cn:9020):chart 的 gitlab.yml 只有 host/https 无 port。用
gitlab.webservice.extraVolumes/extraVolumeMounts(字符串形式)把自建 ConfigMapgitlab-templates-override整目录挂载到/opt/gitlab-templates-override(不能挂/etc/——RKE2/containerd 下 init 容器无法在只读 rootfs 的/etc创建挂载点)。Helm post-renderer(scripts/post-render.sh→post-render.py)在渲染后将gitlab-templates-overrideCM 中的gitlab.yml.erb(含port: 9020)替换到gitlab-webserviceCM 中,避免extraEnv重复键导致 strategic merge patch 冲突。升级 chart 或改 global.hosts/appConfig 后必须重新生成(生成方法见 05-运维手册.md)。 - SSH clone URL 端口:
global.shell.port: 19022(公网 frps 端口),gitlab.ymlssh_port即取此值;global.hosts.ssh: ai-ear.cn控制 ssh_host。 - toolbox 备份:只要 toolbox enabled 就强制要求
gitlab.toolbox.backups.objectStorage.config.secret(即使 cron 关闭)。secret 是 s3cmd ini 格式(不是 YAML)。 - 对象存储用 consolidated(
global.appConfig.object_store),所有类型共用 bucketgitlab(connection secret 为 fog YAML,path_style: true必需)。
部署步骤
bash
export KUBECONFIG=~/.kube/config-122.31
bash scripts/deploy.sh或分步:
bash
KCTL=../jenkins/tools/kubectl
$KCTL create namespace gitlab
# 1. SC nfs-gitlab
helm install gitlab-nfs-provisioner oci://192.168.122.156:30000/charts/nfs-subdir-external-provisioner \
--version 4.0.18 --plain-http -n gitlab -f deploy/nfs-provisioner-values.yaml
# 2. secrets + 依赖
$KCTL apply -f deploy/deps/00-secrets.yaml
$KCTL apply -f deploy/deps/10-postgres.yaml -f deploy/deps/20-redis.yaml -f deploy/deps/30-minio.yaml
$KCTL -n gitlab wait --for=condition=ready pod -l app=postgres --timeout=600s # 首次 initdb 慢(NFS fsync)
$KCTL apply -f deploy/deps/31-minio-buckets-job.yaml
# 3. gitlab(使用 post-renderer 注入 port: 9020 到 webservice CM)
$KCTL apply -f deploy/gitlab/30-gitlab-yml-override-cm.yaml
helm install gitlab oci://192.168.122.156:30000/charts/gitlab --version 10.2.2 --plain-http \
-n gitlab -f deploy/gitlab/values.yaml --timeout 15m \
--post-renderer ./scripts/post-render.sh
$KCTL apply -f deploy/gitlab/40-nodeport-svc.yaml验证
bash
$KCTL -n gitlab get pods # webservice×2 sidekiq×2 shell×2 praefect×2 gitaly×3 + deps 全 Ready
$KCTL -n gitlab get secret gitlab-initial-root-password -o jsonpath='{.data.password}' | base64 -d; echo
curl -s http://192.168.122.31:30080/users/sign_in | grep -o '<title>[^<]*' # Sign in · GitLabHA 演练与 praefect 状态检查见 05-运维手册.md。