概要
Gitlabをself hostedで立てていて、1つのサーバーでGitlab registryも有効にして使っている場合、コンテナイメージがストレージを圧迫してGitlabが動かなくなってしまうことがある。
これを回避する方法としては、registryのストレージを外部(S3)に置く方法と、もう1つサーバーを立てて、そちらにGitlab registryを分散稼働する方法がある。
お手軽なのは前者だが、あえて後者でやってみた(やってみたかった)らちょっとてこずったので躓きポイントの記録。
前提
- dockerで動かしている
- ローカルのドメインでhttpsで立てている
公式の手順の確認
見るのは ここ
registryノードとgitlabノードの設定すべき項目が書かれているが、デフォルト云々で設定しなくてよさそうに見えて設定が必要なものがあったりするので注意が必要。
設定しなくても良いものと足りないところを補うと
registry node (registry.sample.local)
# Disable unneeded services
gitlab_workhorse['enable'] = false
puma['enable'] = false
sidekiq['enable'] = false
redis['enable'] = false
gitlab_kas['enable'] = false
gitaly['enable'] = false
# Configure registry settings
gitlab_rails['registry_host'] = 'registry.sample.local'
registry['enable'] = true
registry['registry_http_addr'] = '0.0.0.0:5000'
registry['token_realm'] = 'https://gitlab.sample.local'
registry['database'] = {
'enabled' => true,
}
# Configure registry nginx settings
registry_nginx['enable'] = true
registry_nginx['listen_port'] = 443
registry_nginx['listen_https'] = true
公式との相違点
- nginxの無効化をしない(httpsの為)
registry_nginxの部分、gitlab_rails['registry_host'] - postgresの無効化をしない(どのぐらい使ってるか分かるようにする為、registryメタデータ データベースを有効にしたい)
registry['database']の部分
dockerはこんな感じで、やることは基本的にgitlabノード単体で立てていた時と同じ
services:
web:
image: 'gitlab/gitlab-ce:18.6.1-ce.0'
restart: always
container_name: 'registry'
hostname: 'registry.sample.local'
ports:
- '80:80'
- '443:443'
volumes:
- './config:/etc/gitlab'
- './logs:/var/log/gitlab'
- './data:/var/opt/gitlab'
- './ssl:/etc/gitlab/ssl'
- './trusted-certs:/etc/gitlab/trusted-certs'
- ./trusted-certsにはローカルドメインのルート証明書を入れる
(ノード間をhttpsで通信する為) - ./ssl にはこのサーバーの証明書と秘密鍵を入れる
(registry.sample.local.crt と registry.sample.local.key という風に名前を合わせておくと設定が省ける) - ./config には gitlabノードの gitlab-secrets.json を取って来て入れる
gitlab node (gitlab.sample.local)
# registry_external_url = 'xxx'
gitlab_rails['registry_enabled'] = true
gitlab_rails['registry_host'] = 'registry.sample.local'
gitlab_rails['registry_port'] = '443'
gitlab_rails['registry_api_url'] = 'https://registry.sample.local'
公式との相違点
- registry_external_urlの無効化
動作確認
適当にプロジェクト作ってCIで
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
- docker push $CI_REGISTRY_IMAGE/hoge
とかやってpushできるか
docker login registry.sample.local
docker pull registry.sample.local/hoge
とかやってpullできるか
プロジェクトの「deploy」「Container registry」で見れるか
厄介だった点
- nginxまわり
- やり始めた時点のバージョン(18.5)のバグでregistryメタデータ保存ができなかった(18.6で修正)