Praefectチャート(α)を使って

caution
Praefectチャートはまだ開発中です。アルファ・バージョンは、本番使用にはまだ適していません。アップグレードには大幅な手動操作が必要になる場合があります。詳細はPraefect GAリリースエピックをご覧ください。

Praefectチャートは、HelmチャートでデプロイされたGitLabインストール内のGitalyクラスタを管理するために使用されます。

既知の制限とイシュー

  1. データベースは手動で作成する必要があります。
  2. クラスターのサイズは固定です:Gitaly Clusterは現在自動スケーリングをサポートしていません。
  3. クラスタ内のPraefectインスタンスを使用してクラスタ外のGitalyインスタンスを管理することはサポートされていません。
  4. Chartのバージョン4.8(GitLab 13.8)にアップグレードすると、リポジトリデータが失われた_ように_見えるイシューが発生します。データは失われませんが、手動での操作が必要です。

要件

このチャートはGitalyチャートを消費します。global.gitaly からの設定は、このチャートによって作成されるインスタンスを構成するために使用されます。これらの設定のドキュメントは、Gitalyチャートのドキュメントにあります。

_イン_ポート:global.gitaly.tlsglobal.praefect.tls から独立しており、別々に設定されます。

デフォルトでは、このChartは3つのGitaly Replicasを作成します。

設定

Chartはデフォルトで無効になっています。チャートの一部として有効にするには、global.praefect.enabled=true を設定します。

レプリカ

デプロイするレプリカのデフォルト数は3です。global.praefect.virtualStorages[].gitalyReplicas を希望のレプリカ数に設定することで変更できます。例えば

global:
  praefect:
    enabled: true
    virtualStorages:
    - name: default
      gitalyReplicas: 4
      maxUnavailable: 1

複数の仮想ストレージ

複数の仮想ストレージを設定することができます(Gitaly Clusterのドキュメントを参照)。例えば

global:
  praefect:
    enabled: true
    virtualStorages:
    - name: default
      gitalyReplicas: 4
      maxUnavailable: 1
    - name: vs2
      gitalyReplicas: 5
      maxUnavailable: 2

これはGitalyのリソースを2セット作成します。これには2つのGitaly StatefulSetが含まれます(仮想ストレージごとに1つ)。

管理者は、新しいリポジトリがどこに保存されるかを設定できます。

永続性

仮想ストレージごとに永続性設定を行うことができます。

global:
  praefect:
    enabled: true
    virtualStorages:
    - name: default
      gitalyReplicas: 4
      maxUnavailable: 1
      persistence:
        enabled: true
        size: 50Gi
        accessMode: ReadWriteOnce
        storageClass: storageclass1
    - name: vs2
      gitalyReplicas: 5
      maxUnavailable: 2
      persistence:
        enabled: true
        size: 100Gi
        accessMode: ReadWriteOnce
        storageClass: storageclass2

defaultReplicationFactor

defaultReplicationFactor は各仮想ストレージで設定できます。(configure replication-factorのドキュメントを参照)。

global:
  praefect:
    enabled: true
    virtualStorages:
    - name: default
      gitalyReplicas: 5
      maxUnavailable: 2
      defaultReplicationFactor: 3
    - name: secondary
      gitalyReplicas: 4
      maxUnavailable: 1
      defaultReplicationFactor: 2

マイグレーション

note
現時点では、APIを使用してグループレベルのWikiを移動することはできません。

スタンドアロンの Gitaly インスタンスから Praefect セットアップにマイグレーションする場合、global.praefect.replaceInternalGitalyfalse に設定できます。これにより、既存の Gitaly インスタンスが維持され、Praefect が管理する新しい Gitaly インスタンスが作成されます。

global:
  praefect:
    enabled: true
    replaceInternalGitaly: false
    virtualStorages:
    - name: virtualStorage2
      gitalyReplicas: 5
      maxUnavailable: 2
note
Praefectにマイグレーションする場合、Praefectの仮想ストレー ジに名前を付けることはできませんdefaultdefaultこれは、常にdefault少なくとも1つのストレージに名前が付けられている必要があるため default、Praefect以外の設定によって名前がすでに使用されているためです。

Gitaly Cluster へのマイグレーションの手順に従って、default ストレージからvirtualStorage2 にデータを移行できます。global.gitaly.internal.names の下に追加のストレージが定義されている場合は、それらのストレージからリポジトリもマイグレーションしてください。

virtualStorage2 にリポジトリがマイグレーションされた後、default というストレージが Praefect 設定に追加されている場合は、replaceInternalGitalytrue に戻すことができます。

global:
  praefect:
    enabled: true
    replaceInternalGitaly: true
    virtualStorages:
    - name: default
      gitalyReplicas: 4
      maxUnavailable: 1
    - name: virtualStorage2
      gitalyReplicas: 5
      maxUnavailable: 2

Gitaly クラスターへのマイグレーションの手順に従って、virtualStorage2 から新しく追加されたdefault ストレージにデータを移動できます。

最後に、新しいリポジトリがどこに保存されるかを設定するには、リポジトリの保存パスのドキュメントを参照してください。

データベースの作成

Praefectは独自のデータベースを使用して状態を追跡します。Praefectを機能させるためには、手動でデータベースを作成する必要があります。

note
この手順は、付属のPostgreSQLサーバーを使用することを前提としています。独自のサーバーを使用している場合は、接続方法に若干の違いがあります。
  1. データベースインスタンスにログインしてください:

    kubectl exec -it $(kubectl get pods -l app=postgresql -o custom-columns=NAME:.metadata.name --no-headers) -- bash
    
    PGPASSWORD=$(cat $POSTGRES_POSTGRES_PASSWORD_FILE) psql -U postgres -d template1
    
  2. データベースユーザーを作成します:

    CREATE ROLE praefect WITH LOGIN;
    
  3. データベースユーザーのパスワードを設定します。

    デフォルトでは、shared-secrets ジョブがあなたのためにシークレットを生成します。

    1. パスワードを取得してください:

      kubectl get secret RELEASE_NAME-praefect-dbsecret -o jsonpath="{.data.secret}" | base64 --decode
      
    2. psql プロンプトでパスワードを設定します:

      \password praefect
      
  4. データベースを作成します:

    CREATE DATABASE praefect WITH OWNER praefect;
    

TLS経由でのPraefectの実行

Praefectは、TLS経由でクライアントとGitalyノードとの通信をサポートしています。これは、global.praefect.tls.enabledglobal.praefect.tls.secretName の設定によって制御されます。TLS経由でPraefectを実行するには、以下の手順に従ってください:

  1. Helmチャートは、PraefectとTLSで通信するために証明書が提供されることを期待します。この証明書は、存在するすべてのPraefectノードに適用する必要があります。したがって、これらの各ノードのすべてのホスト名を証明書のサブジェクト代替名((SAN) )として追加するか、ワイルドカードを使用します。

    使用するホスト名を知るには、Toolbox ポッド内のファイル/srv/gitlab/config/gitlab.yml を確認し、その中のrepositories.storages キーで指定されているさまざまなgitaly_address フィールドを確認します。

    kubectl exec -it <Toolbox Pod> -- grep gitaly_address /srv/gitlab/config/gitlab.yml
    
note
内部 Praefect ポッド用のカスタム署名付き証明書を生成するための基本スクリプトは、このリポジトリにあります。ユーザーはこのスクリプトを使用または参照して、適切な SAN 属性を持つ証明書を生成できます。
  1. 作成した証明書を使用してTLSシークレットを作成します。

    kubectl create secret tls <secret name> --cert=praefect.crt --key=praefect.key
    
  2. --set global.praefect.tls.enabled=true を渡して、Helmチャートを再デプロイします。

TLS経由でGitalyを実行する場合、各仮想ストレージにシークレットネームを提供する必要があります。

global:
  gitaly:
    tls:
      enabled: true
  praefect:
    enabled: true
    tls:
      enabled: true
      secretName: praefect-tls
    virtualStorages:
    - name: default
      gitalyReplicas: 4
      maxUnavailable: 1
      tlsSecretName: default-tls
    - name: vs2
      gitalyReplicas: 5
      maxUnavailable: 2
      tlsSecretName: vs2-tls

インストールのコマンドラインオプション

以下の表は、--set フラグを使用してhelm install コマンドに提供できるすべての可能な Chart 設定です。

パラメータデフォルト説明
共通ラベル{}このChartで作成されたすべてのオブジェクトに適用される補助ラベル。
フェイルオーバー有効trueノード障害時にPraefectがフェイルオーバーを実行するかどうか
フェイルオーバー.readonlyAfterfalseフェイルオーバー後にノードを読み取り専用モードにするかどうか
自動移行true起動時にマイグレーションを自動実行
リポジトリregistry.gitlab.com/gitlab-org/build/cng/gitaly使用するデフォルトの画像リポジトリ。PraefectはGitalyイメージの一部としてバンドルされています。
ポッドラベル{}ポッドラベルの補足。セレクタには使用されません。
ntpHostpool.ntp.orgPraefect が現在時刻を問い合わせる NTP サーバーを設定します。
サービス名praefect作成するサービス名
サービスタイプクラスタIP作成するサービスのタイプ
サービス.internalPort8075ポッドがリッスンする内部ポート番号。
service.externalPort8075クラスターでPraefectサービスが公開するポート番号。
init.リソース  
init.image  
追加EnvFrom 公開する他のデータソースの追加環境変数のリスト
ロギングレベル ログレベル
ログフォーマットjsonログのフォーマット
logging.sentryDsn Sentry DSN URL - Go サーバーからの例外
logging.sentryEnvironment ロギングに使われるSentry環境
metrics.enabledtrueメトリクスエンドポイントをスクレイピングのために利用可能にする場合
metrics.port9236メトリクス・エンドポイント・ポート
metrics.separate_database_metricstruetrueの場合、メトリクス・スクレイプはデータベース・クエリを実行しません。
metrics.path/metricsメトリクスエンドポイントパス
metrics.serviceMonitor.enabledfalsePrometheus Operatorがメトリクスのスクレイピングを管理できるようにServiceMonitorを作成する必要がある場合、これを有効にすると、prometheus.io スクレイピング注釈が削除されることに注意してください。
metrics.serviceMonitor.additionalLabels{}ServiceMonitorに追加するラベル
metrics.serviceMonitor.endpointConfig{}ServiceMonitorの追加エンドポイント設定
securityContext.runAsUser1000 
セキュリティコンテキスト.fsGroup1000 
securityContext.fsGroupChangePolicy。 ボリュームの所有権と権限を変更するためのポリシー (Kubernetes 1.23 が必要)
サービスラベル{}補足サービスラベル
ステートフルセット戦略{}ステートフルセットが使用する更新ストラテジーを設定します。