GitLab-マイグレーションチャートの使い方
migrations サブチャートは、GitLabデータベースのシード/マイグレーションを処理する単一のマイグレーションジョブを提供します。このチャートは GitLab Rails コードベースを使って実行されます。
マイグレーションの後、このジョブはデータベースのアプリケーション設定を編集してauthorized keys ファイルへの書き込みをオフにします。Chartでは、GitLab Authorized Keys APIのSSHAuthorizedKeysCommand での使用のみをサポートしています。
要件
このチャートはRedisとPostgreSQLに依存しています。RedisはGitLabチャートの一部として、PostgreSQLはこのチャートがデプロイされたKubernetesクラスターからアクセス可能な外部サービスとして提供されています。
設計の選択
migrations はチャートがデプロイされるたびに新しいマイグレーションジョブを作成します。ジョブ名の衝突を防ぐために、作成されるたびに Chart のリビジョンとランダムな英数字をジョブ名に追加します。ランダムなテキストの目的についてはこのセクションで詳しく説明します。
今のところ、ジョブが完了した後もオブジェクトとしてクラスターに残るようにしています。これはマイグレーションログを観察するためです。現在のところ、これはhelm uninstall の後でもこれらのジョブが持続することを意味します。 これはジョブ名にランダムテキストを付加する理由の1つで、同じリリース名を使用する将来のデプロイが競合を引き起こさないようにするためです。何らかの形でログシッピングができるようになれば、これらのオブジェクトの永続性を再検討することができます。
このChartで使用しているコンテナには、現在このChartでは使用していない追加の最適化があります。主に、マイグレーションがすでに最新であれば、Railsアプリケーションを起動して確認しなくても、マイグレーションの実行をすばやくスキップする機能です。この最適化にはマイグレーションのステータスを保持する必要があります。今のところこのChartでは行っていません。将来的には、マイグレーションステータスのストレージサポートをこのChartに導入する予定です。
設定
migrations Chartは、外部サービスとチャート設定の2つの部分で構成されます。
インストールのコマンドラインオプション
以下の表は、--set フラグを使用して、helm install コマンドに提供できるすべての可能なチャート設定です。
| パラメータ | 説明 | デフォルト | 
|---|---|---|
| common.labels | このChartで作成されたすべてのオブジェクトに適用される補助ラベル。 | {} | 
| image.repository | マイグレーション・イメージ・リポジトリ | registry.gitlab.com/gitlab-org/build/cng/gitlab-toolbox-ee | 
| image.tag | マイグレーション画像タグ | |
| image.pullPolicy | マイグレーションのプルポリシー | Always | 
| image.pullSecrets | 画像リポジトリのシークレット | |
| init.image.repository | initContainer 画像リポジトリ | registry.gitlab.com/gitlab-org/build/cng/gitlab-base | 
| init.image.tag | initContainer画像タグ | master | 
| init.image.containerSecurityContext | init コンテナ securityContext のオーバーライド。 | {} | 
| enabled | マイグレーション有効フラグ | true | 
| tolerations | ポッド割り当て用のトレラベル | [] | 
| annotations | ジョブ仕様の注釈 | {} | 
| podAnnotations | POB仕様の注釈 | {} | 
| podLabels | ポッドラベルの補足。セレクタには使用されません。 | |
| redis.serviceName | Redis サービス名 | redis | 
| psql.serviceName | PostgreSQLを提供するサービス名 | release-postgresql | 
| psql.password.secret | psql シークレット | gitlab-postgres | 
| psql.password.key | psql シークレット psql パスワード キー | psql-password | 
| psql.port | PostgreSQL サーバのポートを設定します。よりも優先されます。 global.psql.port | |
| resources.requests.cpu | 250m | GitLabマイグレーションの最小CPU | 
| resources.requests.memory | 200Mi | GitLab マイグレーションの最小メモリ | 
| securityContext.fsGroup | 1000 | ポッドを起動するグループID | 
| securityContext.runAsUser | 1000 | ポッドを起動するユーザーID | 
| securityContext.fsGroupChangePolicy | ボリュームの所有権と権限を変更するためのポリシー (Kubernetes 1.23 が必要) | |
| containerSecurityContext.runAsUser | コンテナが起動するコンテナsecurityContext をオーバーライドします。 | 1000 | 
| extraInitContainers | 追加コンテナのリスト | |
| extraContainers | 追加コンテナのリスト | |
| extraVolumes | 作成する追加ボリュームのリスト | |
| extraVolumeMounts | 追加ボリュームマウントのリスト | |
| extraEnv | 公開する追加環境変数のリスト | |
| extraEnvFrom | 公開する他のデータソースの追加環境変数のリスト | |
| bootsnap.enabled | RailsのBootsnapキャッシュを有効にします。 | true | 
| priorityClassName | ポッドに割り当てられる優先度クラス。 | 
Chart設定例
extraEnv
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
追加EnvFrom
extraEnvFrom を使用すると、ポッド内のすべてのコンテナで、他のデータソースからの追加の環境変数を公開することができます。
以下は、extraEnvFrom の使用例です:
extraEnvFrom:
  MY_NODE_NAME:
    fieldRef:
      fieldPath: spec.nodeName
  MY_CPU_REQUEST:
    resourceFieldRef:
      containerName: test-container
      resource: requests.cpu
  SECRET_THING:
    secretKeyRef:
      name: special-secret
      key: special_token
      # optional: boolean
  CONFIG_STRING:
    configMapKeyRef:
      name: useful-config
      key: some-string
      # optional: boolean
画像.pullSecrets
pullSecrets を使用すると、非公開レジストリで認証してポッドのイメージをプルできるようになります。
非公開レジストリとその認証方法の詳細については、Kubernetesのドキュメントを参照してください。
以下は、pullSecrets の使用例です:
image:
  repository: my.migrations.repository
  pullPolicy: Always
  pullSecrets:
  - name: my-secret-name
  - name: my-secondary-secret-nameこのChartのCommunity Editionを使用する場合
デフォルトでは、HelmチャートはGitLabのEnterprise Editionを使用します。必要であれば、代わりに Community Edition を使うこともできます。両者の違いについてはこちらをご覧ください。
コミュニティ版を使うには、image.repository をregistry.gitlab.com/gitlab-org/build/cng/gitlab-toolbox-ce
外部サービス
Redis
redis:
  host: redis.example.com
  serviceName: redis
  port: 6379
  sentinels:
    - host: sentinel1.example.com
      port: 26379
  password:
    secret: gitlab-redis
    key: redis-passwordホスト
使用するデータベースの Redis サーバーのホスト名。これはserviceName の代わりに省略することもできます。 Redis Sentinels を使用する場合は、host 属性にsentinel.conf で指定したクラスター名を設定する必要があります。
サービス名
Redisデータベースをオペレーションしているservice 。これが存在し、host が存在しない場合、Chart はhost の値の代わりにサービスのホスト名(および現在の.Release.Name)をテンプレート化します。これはRedisをGitLabチャート全体の一部として使うときに便利です。これはデフォルトでredis
ポート
Redisサーバに接続するポート。デフォルトは6379 です。
パスワード
Redisのpassword 属性には2つのサブキーがあります:
- 
secretKubernetesSecretからプルする名前を定義します。
- 
keyは、パスワードを含む上記の秘密のキーの名前を定義します。
センチネル
sentinels 属性は Redis HA クラスターへの接続を許可します。サブキーは各Sentinel接続を説明します。
- 
hostはSentinelサービスのホスト名を定義します。
- 
portSentinelサービスに到達するポート番号を定義します。26379
_Note:_現在のRedis Sentinelサポートは、GitLabチャートとは別にデプロイされたSentinelのみをサポートしています。そのため、GitLabチャートを通してのRedisのデプロイは、redis.install=false で無効にする必要があります。Redisのパスワードを含むシークレットは、GitLabチャートをデプロイする前に手動で作成する必要があります。
PostgreSQL
psql:
  host: psql.example.com
  serviceName: pgbouncer
  port: 5432
  database: gitlabhq_production
  username: gitlab
  preparedStatements: false
  password:
    secret: gitlab-postgres
    key: psql-password
ホスト
使用するデータベースがある PostgreSQL サーバのホスト名。postgresql.install=true の場合は省略可能です(デフォルトは non-production)。
サービス名
PostgreSQLデータベースをオペレーションしているサービスの名前です。これが存在し、かつhost 存在しない場合、Chartは hostこの値のhost 代わりにサービスのホスト名をテンプレート化 hostします。
ポート
PostgreSQLサーバに接続するポート。デフォルトは5432 です。
データベース
PostgreSQLサーバで使用するデータベースの名前です。デフォルトはgitlabhq_production です。
preparedStatements
PostgreSQLサーバと通信する際に準備された文を使用するかどうか。デフォルトはfalse です。
ユーザー名
データベースを認証するユーザ名。デフォルトはgitlab
パスワード
PostgreSQLのpassword 属性にはサブキーがあります:
- 
secretKubernetesSecretからプルする名前を定義します。
- 
keyは、パスワードを含む上記の秘密のキーの名前を定義します。
