2021年5月31日月曜日

Gitlab helm chart にリストアする方法

Gitlab helm chart にリストアする方法

概要

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 にログインすることができるようになります

最後に

流れとしては

  1. バックアップ
    • データバックアップ (with s3)
    • secrets.yml
  2. リストア
    • 新規 Gitlab 構築 (with s3)
    • secrets 再登録
    • データリストア
    • もろもろ再設定

という感じになるかなと思います バックアップ時に忘れずに secrets 系も取得するようにしましょう これがなくなるとデータをリストアできても Gitlab を使えなくなってしまいます

参考サイト

0 件のコメント:

コメントを投稿