Skip to content

03 高可用部署

拓扑

组件副本控制器存储
webservice (puma+workhorse)2(HPA 钉死 2/2)Deployment无状态(文件走 MinIO)
sidekiq2(HPA 钉死)Deployment无状态
gitlab-shell2(HPA 钉死)Deployment + NodePort 30022无状态
praefect2StatefulSet无状态(元数据在 PG praefect 库)
gitaly3StatefulSet各 100Gi PVC(nfs-gitlab),Praefect 三副本复制
postgresql 171Deployment (Recreate)20Gi PVC
redis 71Deployment (Recreate)5Gi PVC(AOF)
minio1Deployment (Recreate)100Gi PVC

关键设计决策(chart 10.2.2 特性)

  1. chart 10.x 不再捆绑 postgresql/redis/minio —— 外部依赖强制;按 sonarqube 惯例在 ns 内手写 Deployment(deploy/deps/)。
  2. 外部 PG/Redis 为硬性要求global.psql.host + global.psql.password.secretglobal.redis.host + auth secret,缺失则 checkConfig 直接 fail。
  3. praefect dbSecret 陷阱:shared-secrets 只在未设 global.praefect.psql.host 时生成随机密码(与真实 PG 不符)。必须预建 gitlab-praefect-dbsecret(key secret),值为 PG 用户密码;并设 xxx(默认用户是 praefect)。
  4. global.image.registry 只对 mailroom 生效!每个组件镜像需逐个覆盖 repository(见 values.yaml),另必须改 global.gitlabBase.image(所有 init 容器)、global.kubectl.imageglobal.certificates.image
  5. 10.2 默认开启 global.gatewayApi.enabled/installEnvoy —— 不用 ingress 也必须显式关闭,否则拉 docker.io envoy 镜像。
  6. 默认开启需显式关闭的项installCertmanagerprometheus.installgitlab-runner.installregistry.enabled + global.registry.enabledglobal.kas.enabledgitlab.gitlab-exporter.enabledupgradeCheck.enabled
  7. webservice 不支持指定 nodePort → 独立清单 deploy/gitlab/40-nodeport-svc.yamlgitlab-web-nodeport(NodePort 30080 → workhorse 8181,selector app=webservice,release=gitlab,gitlab.com/webservice-name=default)。
  8. 副本数没有静态 replicas 键:webservice/sidekiq/shell 由 HPA 控制,用 minReplicas: 2, maxReplicas: 2 钉死;gitaly 副本数由 global.praefect.virtualStorages[].gitalyReplicas: 3 决定。
  9. 非标准外部端口(https://ai-ear.cn:9020:chart 的 gitlab.yml 只有 host/https 无 port。用 gitlab.webservice.extraVolumes/extraVolumeMounts(字符串形式)把自建 ConfigMap gitlab-templates-override 整目录挂载到 /opt/gitlab-templates-override不能挂 /etc/——RKE2/containerd 下 init 容器无法在只读 rootfs 的 /etc 创建挂载点)。Helm post-renderer(scripts/post-render.shpost-render.py)在渲染后将 gitlab-templates-override CM 中的 gitlab.yml.erb(含 port: 9020)替换到 gitlab-webservice CM 中,避免 extraEnv 重复键导致 strategic merge patch 冲突。升级 chart 或改 global.hosts/appConfig 后必须重新生成(生成方法见 05-运维手册.md)。
  10. SSH clone URL 端口global.shell.port: 19022(公网 frps 端口),gitlab.yml ssh_port 即取此值;global.hosts.ssh: ai-ear.cn 控制 ssh_host。
  11. toolbox 备份:只要 toolbox enabled 就强制要求 gitlab.toolbox.backups.objectStorage.config.secret(即使 cron 关闭)。secret 是 s3cmd ini 格式(不是 YAML)。
  12. 对象存储用 consolidated(global.appConfig.object_store),所有类型共用 bucket gitlab(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 · GitLab

HA 演练与 praefect 状态检查见 05-运维手册.md。