概要
Gitlab helm chart を使って別の Gitlab から取得したバックアップデータをリストアしてみました 流れやポイントなどを紹介します
環境
- helm v3.5.2
- k8s v1.20.1
- Gitlab 13.12.0
データのバックアップ
Gitlab のバックアップ機能を使えば OK です 過去に紹介しているので以下の記事を参考にバックアップデータを取得してください
なお今回バックアップファイルはクラウドストレージに配置していることを想定しています
リストアする際も同じバケットからバックアップファイルを取得してリストアします
# s3cmd ls s3://backups
2021-05-27 01:14 339169280 s3://backups/1622077898_2021_05_27_13.12.0-ee_gitlab_backup.tar
secrets.yml の作成
データのバックアップの他にシークレット情報もバックアップしておきます helm chart 環境であれば以下のコマンドで取得しておきましょう
kubectl get secrets gitlab-rails-secret -n gitlab -o jsonpath="{.data['secrets\.yml']}" | base64 --decode > secrets.yaml
新規で Gitlab を構築する
今回は helm chart で構築した Gitlab に対してリストアします 各自の環境に合わせて values.yaml を作成してデプロイしましょう giltab namespace 配下にデプロイします
- helm install gitlab gitlab/gitlab --namespace gitlab --timeout 600s -f values.yaml
過去の記事を参考にしても OK です ポイントとしてはバックアップを取得したバージョンとリストアする Gitlab のバージョンは可能な限り同一バージョンにしましょう
マイナーバージョンくらいであれば違っていても問題ないかなと思います
secrets を再登録する
新規の Gitlab の構築が完了したらリストアしていきます まずは先程バックした secrets.yml を k8s に secret として登録します
- kubectl delete secrets gitlab-rails-secret -n gitlab
- kubectl create secret generic gitlab-rails-secret -n gitlab --from-file=secrets.yml=/path/to/secrets.yaml
Pod を再作成する
登録した secret 情報を使用する Pod を再作成します
- kubectl delete pods -lapp=sidekiq,release=gitlab -n gitlab
- kubectl delete pods -lapp=webservice,release=gitlab -n gitlab
- kubectl delete pods -lapp=task-runner,release=gitlab -n gitlab
rollout restart しても良いと思います 再作成できるまで待ちましょう
クラウドストレージからバックアップデータを取得してリストアする
ではバックアップしたデータをリストアします バックアップ時同様に task-runner を使います
- kubectl exec gitlab-task-runner-57467bf498-j2lzq -n gitlab -it – backup-utility --restore -t 1622077898_2021_05_27_13.12.0-ee
「1622077898_2021_05_27_13.12.0-ee」の部分はバックアップ時に作成された tar ファイルの前半のファイル名を指定します 冒頭で記載しているバックアップファイルのタイムスタンプ部分とバージョン部分だけを指定すればそのバックアップファイルを指定のバケットから取得してリストアしてくれます
バケットの指定は Gitlab 起動時に values.yml で指定します
また今回は s3 を使っていますが tar ファイルを単純に http でアクセスできる場所に配置しても OK です その場合は直接 URL を指定すればそこからバックアップファイルをダウンロードしてリストアしてくれます
エラーなく最後までデータが取り込まれれば成功です が、まだこの時点ではログインできないません
注意事項: バックアップファイルが大きい場合はストレージに余裕がないと失敗する
バックアップファイルは一度 Gitlab のローカルストレージにダウンロードされます なのでダウンロードファイル分のローカルストレージ or PVC が消費されます
事前にバックアップファイル分のストレージ容量が空いていることを確認してからリストアしてください
ERROR: must be owner of extension pg_trgm
リストア時にデータベースのマイグレーションが走ります 自分は上記のエラーが発生しましたが問題なくリストアできました Gitlab のバージョンが同一であれば同じ PostgreSQL が k8s 上にデプロイされるはずですが外部の PostgreSQL を使っている場合は注意してください
# kubectl exec -it $(kubectl get pods -n gitlab -l app=postgresql -o custom-columns=NAME:.metadata.name --no-headers) -n gitlab -- bash
Defaulting container name to gitlab-postgresql.
Use 'kubectl describe pod/gitlab-postgresql-0 -n gitlab' to see all of the containers in this pod.
I have no name!@gitlab-postgresql-0:/$ PGPASSWORD=$(cat $POSTGRES_POSTGRES_PASSWORD_FILE) psql -U postgres -d gitlabhq_production
psql (11.9)
Type "help" for help.gitlabhq_production=# \dx
List of installed extensions
Name | Version | Schema | Description
------------+---------+------------+-------------------------------------------------------------------
btree_gist | 1.5 | public | support for indexing common datatypes in GiST
pg_trgm | 1.4 | public | text similarity measurement and index searching based on trigrams
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(3 rows)
gitlab-runner の再登録
もし gitlab-runner を使っている場合はトークンが再生成されているためランナーの再登録が必要になります 今回は gitlab-runnner は使っていないので省略しますがもしランナーを使っている場合はこちらを参考に再登録してください
アプリの設定を再設定する
ロギングなど内部の処理で使われる値をリセットする必要があります task-runner 内にあるリセットスクリプトを実行すれば OK です
- kubectl exec gitlab-task-runner-57467bf498-j2lzq -n gitlab -it – /srv/gitlab/bin/rails runner -e production /scripts/custom-instance-setup
Disabling authorized keys write in the database.
Enabling incremental logging of CI jobs.
Disabling access to disk storage for GitLab Pages
Registering OAuth applications.
となれば成功です
パスワードのリセット
Gitlab の root ユーザの初期パスワードをリセットします
もし root ユーザのパスワードを初期パスワードからすでに変更している場合は実施する必要はありません
もし gitlab-initial-root-password
を使ってログインしている場合は必ず実施しましょう
kubectl get secret gitlab-gitlab-initial-root-password -n gitlab -ojsonpath='{.data.password}' | base64 --decode ; echo
でまず現在のパスワードをメモしておきます そして rails コマンドを使って直接変更します
kubectl exec gitlab-webservice-default-67bb769fc8-8dmbn -n gitlab -it -- bash
git@gitlab-webservice-default-67bb769fc8-8dmbn:/$ /srv/gitlab/bin/rails runner "user = User.first; user.password='xxx'; user.password_confirmation='xxx'; user.save!"
xxx の部分をメモしておいたパスワードに置き換えてから実行してください これで上記コマンドで取得できるパスワードで Gitlab にログインすることができるようになります
最後に
流れとしては
- バックアップ
- データバックアップ (with s3)
- secrets.yml
- リストア
- 新規 Gitlab 構築 (with s3)
- secrets 再登録
- データリストア
- もろもろ再設定
という感じになるかなと思います バックアップ時に忘れずに secrets 系も取得するようにしましょう これがなくなるとデータをリストアできても Gitlab を使えなくなってしまいます