チャートを使用したPraefect
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab Self-Managed
- ステータス: 実験的機能
Praefectチャートはまだ開発中です。この実験的なバージョンは、まだ本番環境での使用には適していません。移行には、大幅な手作業が必要になる場合があります。詳細については、Praefect GAリリースをご覧ください。
Praefectチャートは、HelmチャートでデプロイされたGitLabインスタンス内のGitaly Cluster (Praefect)を管理するために使用されます。
既知の問題
- データベースは手動で作成する必要があります。
- クラスターサイズは固定されています: Gitaly Cluster (Praefect)はオートスケールをサポートしていません。
- クラスター内のPraefectインスタンスを使用してクラスター外のGitalyインスタンスを管理することはサポートされていません。
要件
このチャートは、Gitalyチャートを使用します。global.gitalyの設定は、このチャートによって作成されたインスタンスを設定するために使用されます。これらの設定のドキュメントは、Gitalyチャートドキュメントにあります。
重要: global.gitaly.tlsはglobal.praefect.tlsから独立しています。これらは個別に設定されます。
デフォルトでは、このチャートは3つのGitalyレプリカを作成します。
設定
このチャートはデフォルトで無効になっています。チャートデプロイの一部として有効にするには、global.praefect.enabled=trueを設定します。
レプリカ:
デプロイするレプリカのデフォルトの数は3です。これは、目的のレプリカ数でglobal.praefect.virtualStorages[].gitalyReplicasを設定することで変更できます。例:
global:
praefect:
enabled: true
virtualStorages:
- name: default
gitalyReplicas: 4
maxUnavailable: 1複数の仮想ストレージ
複数の仮想ストレージを設定できます(Gitaly Cluster (Praefect)ドキュメントを参照)。例:
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: storageclass2defaultReplicationFactor
defaultReplicationFactorは、各仮想ストレージで設定できます(レプリケーション係数を設定するドキュメントを参照)。
global:
praefect:
enabled: true
virtualStorages:
- name: default
gitalyReplicas: 5
maxUnavailable: 2
defaultReplicationFactor: 3
- name: secondary
gitalyReplicas: 4
maxUnavailable: 1
defaultReplicationFactor: 2Praefectへの移行
グループWikiはAPIを使用しても移動できません。
スタンドアロンのGitalyインスタンスからPraefectセットアップに移行する場合、global.praefect.replaceInternalGitalyをfalseに設定できます。これにより、新しいPraefectで管理されるGitalyインスタンスが作成されている間、既存のGitalyインスタンスが確実に保持されます。
global:
praefect:
enabled: true
replaceInternalGitaly: false
virtualStorages:
- name: virtualStorage2
gitalyReplicas: 5
maxUnavailable: 2Praefectに移行する場合、Praefectの仮想ストレージにdefaultという名前を付けることはできません。これは、常に少なくとも1つのストレージにdefaultという名前が付けられている必要があるため、名前はPraefect以外の設定ですでに使用されているためです。
Gitaly Cluster (Praefect)への移行の手順に従って、defaultストレージからvirtualStorage2にデータを移動できます。global.gitaly.internal.namesで追加のストレージが定義されている場合は、それらのストレージからリポジトリを移行してください。
リポジトリがvirtualStorage2に移行された後、Praefect設定でdefaultという名前のストレージが追加されている場合は、replaceInternalGitalyをtrueに戻すことができます。
global:
praefect:
enabled: true
replaceInternalGitaly: true
virtualStorages:
- name: default
gitalyReplicas: 4
maxUnavailable: 1
- name: virtualStorage2
gitalyReplicas: 5
maxUnavailable: 2Gitaly Cluster (Praefect)への移行の手順に再度従うと、必要に応じてvirtualStorage2から新しく追加されたdefaultストレージにデータを移動できます。
最後に、新しいリポジトリの保存場所を設定するには、リポジトリストレージパスのドキュメントを参照してください。
データベースの作成
Praefectは、独自のデータベースを使用して状態を追跡します。Praefectが機能するためには、これを手動で作成する必要があります。
これらの手順では、バンドルされたPostgreSQLサーバーを使用していることを前提としています。独自のサーバーを使用している場合は、接続方法に多少のバリエーションがあります。
データベースインスタンスにログインします:
kubectl exec -it $(kubectl get pods -l app.kubernetes.io/name=postgresql -o custom-columns=NAME:.metadata.name --no-headers) -- bashPGPASSWORD=$(echo $POSTGRES_POSTGRES_PASSWORD) psql -U postgres -d template1データベースユーザーを作成します:
CREATE ROLE praefect WITH LOGIN;データベースユーザーのパスワードを設定します。
デフォルトでは、
shared-secretsジョブはシークレットを生成します。パスワードをフェッチします:
kubectl get secret RELEASE_NAME-praefect-dbsecret -o jsonpath="{.data.secret}" | base64 --decodepsqlプロンプトでパスワードを設定します:\password praefect
データベースを作成します:
CREATE DATABASE praefect WITH OWNER praefect;
TLS経由でのPraefectの実行
Praefectは、TLS経由でクライアントおよびGitalyノードとの通信をサポートします。これは、global.praefect.tls.enabledとglobal.praefect.tls.secretNameの設定によって制御されます。TLS経由でPraefectを実行するには、次の手順に従います:
Helmチャートは、TLS経由でPraefectと通信するために証明書が提供されることを想定しています。この証明書は、存在するすべての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
内部Praefectポッド用のカスタム署名証明書を生成するための基本的なスクリプトは、このリポジトリにあります。ユーザーは、そのスクリプトを使用して、適切なSAN属性を持つ証明書を生成できます。
作成した証明書を使用してTLSシークレットを作成します。
kubectl create secret tls <secret name> --cert=praefect.crt --key=praefect.key--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インストールコマンドラインオプション
以下の表に、helm installコマンドラインに--setフラグを使用して指定できるすべてのチャートの設定を示します。
| パラメータ | デフォルト | 説明 |
|---|---|---|
| common.labels | {} | このチャートによって作成されたすべてのオブジェクトに適用される補助ラベル。 |
| failover.enabled | はい | Praefectがノード障害時にフェイルオーバーを実行するかどうか |
| failover.readonlyAfter | いいえ | フェイルオーバー後にノードが読み取り専用モードになるかどうか |
| autoMigrate | はい | 起動時に移行を自動的に実行する |
| image.repository | registry.gitlab.com/gitlab-org/build/cng/gitaly | 使用するデフォルトのイメージリポジトリ。Praefectは、Gitalyイメージの一部としてバンドルされています |
| podLabels | {} | 補助ポッドラベル。セレクターには使用されません。 |
| ntpHost | pool.ntp.org | 現在の時刻についてPraefectが要求する必要があるNTPサーバーを設定します。 |
| service.name | praefect | 作成するサービスの名前 |
| service.type | ClusterIP | 作成するサービスの種類 |
| service.internalPort | 8075 | Praefectポッドがリッスンする内部ポート番号 |
| service.externalPort | 8075 | Praefectサービスがクラスターで公開するポート番号 |
| init.resources | ||
| init.image | ||
init.containerSecurityContext.allowPrivilegeEscalation | false | initコンテナ固有: プロセスがプロセスよりも多くの特権を取得できるかどうかを制御します |
init.containerSecurityContext.runAsNonRoot | true | initコンテナ固有: コンテナを非rootユーザーで実行するかどうかを制御します |
init.containerSecurityContext.capabilities.drop | [ "ALL" ] | initコンテナ固有: コンテナのLinuxケイパビリティを削除します |
| extraEnvFrom | 公開する他のデータソースからの追加の環境変数のリスト | |
| logging.level | ログレベル | |
| logging.format | json | ログ形式 |
| logging.sentryDsn | Sentry DSN URL - Goサーバーからの例外 | |
| logging.sentryEnvironment | ログに使用するSentry環境変数 | |
metrics.enabled | true | メトリクスエンドポイントをスクレイプために利用できるようにするかどうか |
metrics.port | 9236 | メトリクスエンドポイントポート |
metrics.separate_database_metrics | true | trueの場合、メトリクスのスクレイプはデータベースクエリを実行しません。falseに設定するとパフォーマンスの問題が発生する可能性があります |
metrics.path | /metrics | メトリクスエンドポイント |
metrics.serviceMonitor.enabled | false | メトリクスのスクレイプを管理するためにPrometheusオペレーターを有効にするためにServiceMonitorを作成する場合は、これを有効にするとprometheus.ioスクレイプ注釈が削除されることに注意してください |
affinity | {} | ポッド割り当てのアフィニティルール |
metrics.serviceMonitor.additionalLabels | {} | ServiceMonitorに追加する追加のラベル |
metrics.serviceMonitor.endpointConfig | {} | ServiceMonitorの追加エンドポイント設定 |
| securityContext.runAsUser | 1,000 | |
| securityContext.fsGroup | 1,000 | |
| securityContext.fsGroupChangePolicy | ボリュームの所有権と権限を変更するためのポリシー(Kubernetes 1.23が必要です) | |
securityContext.seccompProfile.type | RuntimeDefault | 使用するSeccompプロファイル |
containerSecurityContext.allowPrivilegeEscalation | false | コンテナのプロセスがプロセスよりも多くの特権を取得できるかどうかを制御します |
containerSecurityContext.runAsNonRoot | true | コンテナを非rootユーザーで実行するかどうかを制御します |
containerSecurityContext.capabilities.drop | [ "ALL" ] | GitalyコンテナのLinuxケイパビリティを削除します |
serviceAccount.annotations | {} | ServiceAccount注釈 |
serviceAccount.automountServiceAccountToken | false | デフォルトのServiceAccountアクセストークンをポッドにマップするかどうかを示します |
serviceAccount.create | false | ServiceAccountを作成するかどうかを示します |
serviceAccount.enabled | false | ServiceAccountを使用するかどうかを示します |
serviceAccount.name | ServiceAccountの名前。設定されていない場合、チャートのフルネームが使用されます | |
| serviceLabels | {} | 補助サービスラベル |
| statefulset.strategy | {} | statefulsetが利用する更新戦略を設定できます |
serviceAccount
このセクションでは、ServiceAccountを作成するかどうか、およびデフォルトのアクセストークンをポッドにマップするかどうかを制御します。
| 名前 | 型 | デフォルト | 説明 |
|---|---|---|---|
annotations | マップ | {} | ServiceAccount注釈。 |
automountServiceAccountToken | ブール値 | false | デフォルトのServiceAccountアクセストークンをポッドにマウントするかどうかを制御します。これは、特定のサイドカーが正常に機能するために必要という場合(Istioなど)を除き、有効にしないようにしてください。 |
create | ブール値 | false | ServiceAccountを作成するかどうかを示します。 |
enabled | ブール値 | false | ServiceAccountを使用するかどうかを示します。 |
name | 文字列 | ServiceAccountの名前。設定されていない場合、チャートのフルネームが使用されます。 |
affinity
詳細については、affinityを参照してください。