使用极狐GitLab-Migrations chart

  • Tier: 基础版, 专业版, 旗舰版
  • Offering: 私有化部署

migrations 子chart 提供了一个单一的迁移 Job,用于处理极狐GitLab 数据库的初始化/迁移。该chart 使用极狐GitLab Rails 代码库运行。

迁移完成后,此 Job 还会编辑数据库中的应用程序设置,以关闭写入授权密钥文件。在chart 中,我们仅支持使用 SSH AuthorizedKeysCommand 的极狐GitLab Authorized Keys API,而不是支持写入授权密钥文件。

要求#

此chart 依赖于 Redis 和 PostgreSQL,可以作为完整极狐GitLab chart 的一部分,或者作为可从部署此chart 的 Kubernetes 集群中访问的外部服务提供。

设计选择#

每次安装chart ,或使用新 chart 版本appVersion 或对任何值的更改升级chart 时,migrations chart 都会创建一个新的迁移 Job

使用 helm installhelm upgrade 安装和升级此chart 时,此chart 创建的 Jobs 将保留在集群中,直到下次chart 升级为止。这样我们可以观察迁移日志。一旦我们有某种形式的日志传输,我们可以重新审视这些对象的持久性。

如果使用 helm templatekubectl apply 或类似工具生成的清单进行部署,则旧的迁移 Job 对象不会从集群中删除。

此chart 中使用的容器有一些额外的优化,我们目前未在此处使用。主要是能够快速跳过已经是最新的迁移,而无需启动 Rails 应用程序进行检查。此优化要求我们持久化迁移状态。我们目前没有在此chart 中执行此操作。未来我们将为此chart 引入迁移状态的存储支持。

配置#

migrations chart 分为两个部分进行配置:外部服务和chart 设置。

安装命令行选项#

下表包含所有可以通过 --set 标志提供给 helm install 命令的可能chart 配置。

参数描述默认值
common.labels应用于此chart 创建的所有对象的补充标签{}
image.repository迁移镜像库registry.gitlab.com/gitlab-org/build/cng/gitlab-toolbox-ee
image.tag迁移镜像标签
image.pullPolicy迁移拉取策略Always
image.pullSecrets镜像库的密钥
init.image.repositoryinitContainer 镜像库registry.gitlab.com/gitlab-org/build/cng/gitlab-base
init.image.taginitContainer 镜像标签master
init.image.containerSecurityContextinit 容器 securityContext 重写{}
init.containerSecurityContext.allowPrivilegeEscalationinitContainer 特定:控制进程是否可以获得比其父进程更多的权限false
init.containerSecurityContext.runAsNonRootinitContainer 特定:控制容器是否以非 root 用户身份运行true
init.containerSecurityContext.capabilities.dropinitContainer 特定:移除容器的 Linux 功能[ "ALL" ]
enabled迁移启用 FLAGtrue
tolerationsPod 分配的容忍标签[]
affinityPod 分配的亲和性规则{}
annotationsJob 规范的注释{}
podAnnotationsPod 规范的注释{}
podLabels补充 Pod 标签。不会用于选择器。
redis.serviceNameRedis 服务名称redis
psql.serviceName提供 PostgreSQL 的服务名称release-postgresql
psql.password.secretpsql 密钥gitlab-postgres
psql.password.keypsql 密钥中的 psql 密码键psql-password
psql.port设置 PostgreSQL 服务器端口。优先于 global.psql.port
resources.requests.cpu极狐GitLab 迁移的最小 CPU250m
resources.requests.memory极狐GitLab 迁移的最小内存200Mi
securityContext.fsGroup启动 pod 的组 ID1000
securityContext.runAsUser启动 pod 的用户 ID1000
securityContext.fsGroupChangePolicy更改卷的所有权和权限的策略(需要 Kubernetes 1.23)
securityContext.seccompProfile.type使用的 Seccomp 配置文件RuntimeDefault
containerSecurityContext.runAsUser重写启动容器的 securityContext1000
containerSecurityContext.allowPrivilegeEscalation控制容器进程是否可以获得比其父进程更多的权限false
containerSecurityContext.runAsNonRoot控制容器是否以非 root 用户身份运行true
containerSecurityContext.capabilities.drop移除 Gitaly 容器的 Linux 功能[ "ALL" ]
serviceAccount.annotationsServiceAccount 注释{}
serviceAccount.automountServiceAccountToken指示是否应在 pods 中挂载默认的 ServiceAccount 访问令牌false
serviceAccount.create指示是否应创建 ServiceAccountfalse
serviceAccount.enabled指示是否使用 ServiceAccountfalse
serviceAccount.nameServiceAccount 的名称。如果未设置,则使用完整chart 名称
extraInitContainers要包括的额外初始化容器列表
extraContainers包含要包括的容器列表的多行文本样式字符串
extraVolumes要创建的额外卷列表
extraVolumeMounts要进行的额外卷挂载列表
extraEnv要公开的额外环境变量列表
extraEnvFrom要从其他数据源公开的额外环境变量列表
priorityClassName分配给 pods 的优先级类

chart 配置示例#

extraEnv#

extraEnv 允许您在 pods 中的所有容器中公开额外的环境变量。

以下是 extraEnv 的一个示例用法:

yaml
extraEnv: SOME_KEY: some_value SOME_OTHER_KEY: some_other_value

当容器启动时,您可以确认环境变量已被公开:

shell
env | grep SOME SOME_KEY=some_value SOME_OTHER_KEY=some_other_value

extraEnvFrom#

extraEnvFrom 允许您从其他数据源在 pods 中的所有容器中公开额外的环境变量。

以下是 extraEnvFrom 的一个示例用法:

yaml
1extraEnvFrom: 2 MY_NODE_NAME: 3 fieldRef: 4 fieldPath: spec.nodeName 5 MY_CPU_REQUEST: 6 resourceFieldRef: 7 containerName: test-container 8 resource: requests.cpu 9 SECRET_THING: 10 secretKeyRef: 11 name: special-secret 12 key: special_token 13 # optional: boolean 14 CONFIG_STRING: 15 configMapKeyRef: 16 name: useful-config 17 key: some-string 18 # optional: boolean

image.pullSecrets#

pullSecrets 允许您进行身份验证以从私有镜像仓库中提取 pod 的镜像。

有关私有镜像仓库及其身份验证方法的更多详细信息,请参阅 Kubernetes 文档

以下是 pullSecrets 的一个示例用法:

YAML
1image: 2 repository: my.migrations.repository 3 pullPolicy: Always 4 pullSecrets: 5 - name: my-secret-name 6 - name: my-secondary-secret-name

serviceAccount#

此部分控制是否应创建 ServiceAccount 以及是否应在 pods 中挂载默认访问令牌。

名称类型默认值描述
annotationsMap{}ServiceAccount 注释。
automountServiceAccountTokenBooleanfalse控制是否应在 pods 中挂载默认 ServiceAccount 访问令牌。除非某些 sidecars 需要此功能才能正常工作(例如 Istio),否则不应启用此功能。
createBooleanfalse指示是否应创建 ServiceAccount。
enabledBooleanfalse指示是否使用 ServiceAccount。
nameStringServiceAccount 的名称。如果未设置,则使用完整chart 名称。

affinity#

有关更多信息,请参阅 affinity

使用此chart 的基础版#

默认情况下,Helm chart 使用极狐GitLab 企业版。如果需要,您也可以使用基础版。了解有关两者之间区别的更多信息。

外部服务#

Redis#

YAML
1redis: 2 host: redis.example.com 3 serviceName: redis 4 port: 6379 5 sentinels: 6 - host: sentinel1.example.com 7 port: 26379 8 password: 9 secret: gitlab-redis 10 key: redis-password

host#

Redis 服务器的主机名,使用的数据库。可以省略此项而代之以 serviceName。如果使用 Redis 哨兵,host 属性需要设置为 sentinel.conf 中指定的集群名称。

serviceName#

操作 Redis 数据库的 service 名称。如果此项存在且 host 不存在,chart 将在 host 值处模板化服务(和当前 .Release.Name)的主机名。这在将 Redis 作为整体极狐GitLab chart 的一部分时非常方便。默认值为 redis

port#

连接到 Redis 服务器的端口。默认为 6379

password#

Redis 的 password 属性有两个子键:

  • secret 定义要从中提取的 Kubernetes Secret 的名称
  • key 定义上述 secret 中包含密码的键的名称。

sentinels#

sentinels 属性允许连接到 Redis HA 集群。子键描述每个哨兵连接。

  • host 定义哨兵服务的主机名
  • port 定义到达哨兵服务的端口号,默认为 26379

NOTE: 当前的 Redis 哨兵支持仅支持从极狐GitLab chart 中单独部署的哨兵。因此,通过极狐GitLab chart 的 Redis 部署应通过 redis.install=false 禁用。在部署极狐GitLab chart 之前,需要手动创建包含 Redis 密码的 Secret。

PostgreSQL#

yaml
1psql: 2 host: psql.example.com 3 serviceName: pgbouncer 4 port: 5432 5 database: gitlabhq_production 6 username: gitlab 7 preparedStatements: false 8 password: 9 secret: gitlab-postgres 10 key: psql-password

host#

PostgreSQL 服务器的主机名,使用的数据库。如果 postgresql.install=true(默认非生产环境),则可以省略此项。

serviceName#

操作 PostgreSQL 数据库的服务名称。如果此项存在且 host 不存在,chart 将在 host 值处模板化服务的主机名。

port#

连接到 PostgreSQL 服务器的端口。默认为 5432

database#

在 PostgreSQL 服务器上使用的数据库名称。默认为 gitlabhq_production

preparedStatements#

与 PostgreSQL 服务器通信时是否应使用准备好的语句。默认为 false

username#

用于验证数据库的用户名。默认为 gitlab

password#

PostgreSQL 的 password 属性有两个子键:

  • secret 定义要从中提取的 Kubernetes Secret 的名称
  • key 定义上述 secret 中包含密码的键的名称。