目录

Helm安装的gitlab备份恢复实践

环境

一套现有且正在使用的gitlab,版本:14.8.4,helm repo版本:5.8.4

备份

helm部署的gitlab的备份方式与传统二进制的方式略有不同。

通过gitlab-toolbox容器来进行备份,操作如下:

1
2
3
4
5
# 查询toolbox容器ID
kubectl get pods -lrelease=RELEASE_NAME,app=toolbox

# 执行备份命令
kubectl exec <Toolbox pod name> -it -- backup-utility

访问minio,查看gitlab-backups这个bucket,下面生成了一个文件

../images/gitlab-1.png

恢复

同样通过gitlab-toolbox进行恢复,命令如下:

1
2
3
4
5
6
7
8
# 查询toolbox容器id
kubectl get pods -lrelease=RELEASE_NAME,app=toolbox

# 通过自身的minio文件进行恢复
kubectl exec <Toolbox pod name> -it -- backup-utility --restore -t <timestamp>_<version>

# 通过远程minio进行恢复
kubectl exec <Toolbox pod name> -it -- backup-utility --restore -f <URL>

恢复完成后,可进入web,可以使用备份的账号密码登录进入,通常会碰到这些问题,例如:

  1. /admin/runners页面不可访问,也就是配置runner的主配置页面,还有迁移过来后,某些项目的CICD流水线详情进不去,返回页面提示500,通常是因为备份时,gitlab刚刚好有人在运行流水线,将部分时效性的key-value写入了数据库,被我们备份过来了,现在这些数据成了脏数据,影响了我们恢复的数据的正常使用,解决办法如下:

    进入pgsql控制台:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    # 进入toolbox容器
    kubectl exec -it <toolbox-containerID> bash
    
    # 14.1以及之前版本,进入控制台,14.2执行该命令可以获取用户密码,14.2需要输入密码
    gitlab-rails dbconsole
    
    # 14.2以及之后版本,进入控制台
    gitlab-rails dbconsole --database main
    
    # 执行sql
    SELECT * FROM public."ci_group_variables";
    SELECT * FROM public."ci_variables";
    DELETE FROM ci_group_variables;
    DELETE FROM ci_variables;
    UPDATE projects SET runners_token = null, runners_token_encrypted = null;
    UPDATE namespaces SET runners_token = null, runners_token_encrypted = null;
    UPDATE application_settings SET runners_registration_token_encrypted = null;
    UPDATE application_settings SET encrypted_ci_jwt_signing_key = null;
    UPDATE ci_runners SET token = null, token_encrypted = null;
    UPDATE ci_builds SET token = null, token_encrypted = null;
    TRUNCATE web_hooks CASCADE;
    

    此时/admin/runners页面恢复。

  2. runner全部离线,或者runner的pod无法running,通常是因为备份恢复后,重新生成了runner注册码,老的注册码失效了,恢复操作如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    # 1. admin/runners页面上找到新的共享runner令牌。
    # 2. 查找存储在 Kubernetes 中的现有 runner 令牌 Secret 的名称.
    kubectl get secrets | grep gitlab-runner-secret
    # 3. 删除现有的secret
    kubectl delete secret <runner-secret-name>
    # 4. 使用两个密钥(runner-registration-token使用您的共享令牌和一个空的runner-token) 创建新密钥
    kubectl create secret generic <runner-secret-name> --from-literal=runner-registration-token=<new-shared-runner-token> --from-literal=runner-token=""
    # 5. 删除pod
    kubectl delete pod gitlab-gitlab-runner