GitLab-Gitalyチャートの使い方

gitaly サブチャートでは、Gitalyサーバーのデプロイを設定することができます。

要件

このチャートは、GitLabチャートの一部として、またはこのチャートがデプロイされているKubernetesクラスターからアクセス可能な外部サービスとして提供されているWorkhorseサービスへのアクセスに依存しています。

デザインの選択

このチャートで使っているGitalyコンテナには、GitLab Shellのコードベースも含まれています。GitalyコンテナにはGitLab Shellコンテナのコピーも含まれているので、このチャートでGitLab Shellを設定する必要があります。

設定

gitaly Chartは、外部サービスとチャート設定の2つの部分で構成されます。

GitalyはデフォルトではGitLabチャートをデプロイする際にコンポーネントとしてデプロイされます。 Gitalyを個別にデプロイする場合は、global.gitaly.enabledfalse に設定し、外部のGitalyドキュメントに記載されているように追加の設定を行う必要があります。

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

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

パラメータ デフォルト 説明
annotations   ポッド注釈
external[].hostname - "" 外部ノードのホスト名
external[].name - "" 外部ノードストレージ名
external[].port - "" 外部ノードのポート
extraContainers   追加コンテナのリスト
extraInitContainers   追加するinitコンテナのリスト
extraVolumeMounts   追加ボリュームのマウントリスト
extraVolumes   作成する追加ボリュームのリスト
extraEnv   公開する追加環境変数のリスト
gitaly.serviceName   生成されるGitalyサービスの名前。global.gitaly.serviceNameを上書きし、デフォルトは次のようになります。<RELEASE-NAME>-gitaly
image.pullPolicy Always Gitalyイメージプルポリシー
image.pullSecrets   画像リポジトリの秘密
image.repository registry.com/gitlab-org/build/cng/gitaly Gitaly 画像リポジトリ
image.tag latest Gitaly画像タグ
init.image.repository   initContainer イメージ
init.image.tag   initContainer画像タグ
internal.names[] - default 統計フルセット・ストレージの名前の並び順
service.externalPort 8075 Gitalyサービス公開ポート
service.internalPort 8075 Gitaly内部ポート
service.name gitaly ServiceオブジェクトでGitalyがビハインドしているServiceポートの名前です。
service.type ClusterIP Gitalyサービスタイプ
securityContext.fsGroup 1000 ポッドを起動するグループID
securityContext.runAsUser 1000 ポッドを起動するユーザID
tolerations [] ポッド割り当てのためのトレラベル
persistence.accessMode ReadWriteOnce Gitaly永続アクセスモード
persistence.annotations   Gitaly永続性アノテーション
persistence.enabled true Gitalyが永続性を有効にするフラグ
persistence.matchExpressions   ラベル式マッチ
persistence.matchLabels   バインドするラベルと値の一致
persistence.size 50Gi Gitaly 永続性ボリュームサイズ
persistence.storageClass   プロビジョニング用の storageClassName
persistence.subPath   Gitaly 永続ボリュームマウントパス
priorityClassName   Gitaly StatefulSet priorityClassName。
logging.level   ログレベル
logging.format json ログフォーマット
logging.sentryDsn   Sentry DSN URL - Go サーバーからの例外
logging.rubySentryDsn   Sentry DSN URL - 以下の例外が発生します。gitaly-ruby
logging.sentryEnvironment   ロギングに使用するSentry環境
ruby.maxRss   Gitaly-Ruby の常駐セットサイズ(RSS) メモリ再起動のトリガーとなるサイズ (バイト)
ruby.gracefulRestartTimeout   最大RSSを超えてから強制再起動するまでの猶予期間
ruby.restartDelay   再起動前にGitalyメモリがハイのままでなければならない時間(秒)
ruby.numWorkers   Gitaly-Rubyワーカープロセス数
shell.concurrency[]   各 RPC エンドポイントの同時実行数rpc およびmaxPerRepo
git.catFileCacheSize   git cat-file プロセスが使用するキャッシュサイズ
prometheus.grpcLatencyBuckets   Gitalyが記録するGRPCメソッド呼び出しのヒストグラムレイテンシに対応するバケット。 入力として、配列の文字列形式(例えば、"[1.0, 1.5, 2.0]")が必要です。

チャート構成例

エクストラエンバイロメント

extraEnv を使用すると、ポッド内のすべてのコンテナで追加の環境変数を公開できます。

以下はextraEnvの使用例です:

extraEnv:
  SOME_KEY: some_value
  SOME_OTHER_KEY: some_other_value

コンテナを起動すると、環境変数が公開されていることを確認できます:

env | grep SOME
SOME_KEY=some_value
SOME_OTHER_KEY=some_other_value

画像.pullSecrets

pullSecrets を使うと、非公開レジストリで認証してポッドのイメージを取り出せるようになります。

非公開レジストリとその認証方法についての詳細は、Kubernetesのドキュメントに記載されています。

以下はpullSecrets

image:
  repository: my.gitaly.repository
  tag: latest
  pullPolicy: Always
  pullSecrets:
  - name: my-secret-name
  - name: my-secondary-secret-name

こうわん

tolerations 汚染されたワーカーノードでポッドのスケジューリングが可能

以下はtolerationsの使用例です:

tolerations:
- key: "node_label"
  operator: "Equal"
  value: "true"
  effect: "NoSchedule"
- key: "node_label"
  operator: "Equal"
  value: "true"
  effect: "NoExecute"

コンメンタール

annotations は、Gitalyポッドに注釈を追加することができます。

以下はannotationsの使用例です:

annotations:
  kubernetes.io/example-annotation: annotation-value

優先クラス名

priorityClassName では、GitalyポッドにPriorityClassを割り当てることができます。

以下はpriorityClassNameの使用例です:

priorityClassName: persistence-enabled

外部サービス

このChartはWorkhorseのサービスに添付されているはずです。

ワークホース

workhorse:
  host: workhorse.example.com
  serviceName: webservice
  port: 8181
名称 タイプ デフォルト 説明
host 文字列   Workhorse サーバーのホスト名。これはserviceNameの代わりに省略できます。
port 整数 8181 Workhorseサーバーに接続するポート。
serviceName 文字列 webservice Workhorse サーバーをオペレーションしているservice の名前。これが存在し、host が存在しない場合、チャートはhost の値の代わりにサービスのホスト名(と現在の.Release.Name)をテンプレート化します。これは Workhorse を GitLab チャート全体の一部として使う場合に便利です。

チャート設定

以下の値は、Gitalyポッドの設定に使用されます。

注意:GitalyはWorkhorseとSidekiqサービスで認証するためにAuth Tokenを使用します。 Auth Tokenの秘密と鍵はglobal.gitaly.authToken。さらに、GitalyコンテナにはGitLab Shellのコピーがあり、設定可能ないくつかの設定があります。 ShellのauthTokenはglobal.shell.authToken

gitリポジトリの永続性

このチャートは、PersistentVolumeClaimをプロビジョニングし、対応する永続ボリュームをGitリポジトリデータ用にマウントします。 これを動作させるには、Kubernetesクラスターで利用可能な物理ストレージが必要です。 emptyDirを使いたい場合は、persistence.enabled: falseでPersistentVolumeClaimを無効にしてください。

注:Gitaly の永続性設定は、すべての Gitaly ポッドで有効な volumeClaimTemplate で使用されます。 特定のボリューム (volumeName など) を参照するための設定を含めるべきではありません。 特定のボリュームを参照する場合は、手動で PersistentVolumeClaim を作成する必要があります。
注:一度デプロイしたら、私たちの設定でこれらを変更することはできません。StatefulSetではVolumeClaimTemplate は不変です。
persistence:
  enabled: true
  storageClass: standard
  accessMode: ReadWriteOnce
  size: 50Gi
  matchLabels: {}
  matchExpressions: []
  subPath: "/data"
  annotations: {}
名称 タイプ デフォルト 説明
accessMode 文字列 ReadWriteOnce PersistentVolumeClaimで要求されたaccessModeを設定します。 詳細は「Kubernetes Access Modes Documentation」を参照してください。
enabled ブーリアン true レポデータに PersistentVolumeClaims を使用するかどうかを設定します。falseの場合、emptyDir ボリュームが使用されます。
matchExpressions 配列   バインドするボリュームを選択する際に照合するラベル条件オブジェクトの配列を受け付けます。 これはPersistentVolumeClaim selector セクションで使用します。volume のドキュメントを参照ください。
matchLabels 地図   バインドするボリュームを選択する際に照合するラベル名とラベル値のマップを受け付けます。 これはPersistentVolumeClaim selector セクションで使用します。ボリュームのドキュメントを参照してください。
size 文字列 50Gi データ永続化のために要求する最小ボリューム・サイズ。
storageClass 文字列   動的プロビジョニングのためにボリュームクレームのstorageClassNameを設定します。 未設定またはNULLの場合、デフォルトのプロビジョナーが使用されます。 ハイフンを設定すると、動的プロビジョニングは無効になります。
subPath 文字列   ボリューム・ルートではなく、マウントするボリューム内のパスを設定します。 サブパスが空の場合はルートが使用されます。
annotations 地図   動的プロビジョニングのためのVolume Claimにアノテーションを設定します。 詳細はKubernetes Annotations Documentationを参照してください。

TLSでGitalyを動かす

注:このセクションは、Helmチャートを使用してクラスター内部でGitalyを実行する場合について言及しています。 外部のGitalyインスタンスを使用しており、そのインスタンスとの通信にTLSを使用する場合は、外部のGitalyドキュメントを参照してください。

Gitalyは、TLSを介した他のコンポーネントとの通信をサポートしています。 これは、global.gitaly.tls.enabledglobal.gitaly.tls.secretNameの設定によって制御されます。 TLSを介してGitalyを実行するための手順に従ってください:

  1. Chartは、GitalyとTLSで通信するために証明書が提供されることを期待します。 この証明書は、存在するすべてのGitalyノードに適用されるべきです。 したがって、これらのGitalyノードのそれぞれのすべてのホスト名は、証明書のサブジェクト代替名(SAN) として追加されるべきです。

    使用するホスト名を知るには、task-runnerポッドの/srv/gitlab/config/gitlab.ymlファイルをチェックし、その中のrepositories.storages キーの下に指定されているさまざまなgitaly_address フィールドをチェックします。

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

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