使用 GitLab-Migrations Chart
migrations
子 chart 提供了一个单一的迁移 Job,用于处理播种/迁移 GitLab 数据库。 该 chart 使用 GitLab Rails 代码库运行。
迁移后,此作业还会编辑数据库中的应用程序设置以关闭对授权密钥文件的写入。在 chart 中,我们仅支持将 GitLab 授权密钥 API 与 SSH AuthorizedKeysCommand
一起使用,而不支持写入授权密钥文件。
要求
该 chart 依赖于 Redis 和 PostgreSQL,作为完整 GitLab chart 的一部分或作为可从该图表部署到的 Kubernetes 集群访问的外部服务提供。
设计选择
每次部署 chart 时,migrations
都会创建一个新的迁移 Job。为了防止 job 名称冲突,我们在每次创建 job 名称时附加 chart 版本和随机字母数字值。本节将进一步描述随机文本的用途。
现在,我们还让 job 在完成后作为对象保留在集群中。 这样我们就可以观察迁移日志。目前,这意味着即使在 helm uninstall
之后,这些 job 仍然存在。 这是我们将随机文本附加到 Job 名称的原因之一,以便将来使用相同版本名称的部署不会导致冲突。 一旦我们有了某种形式的日志传送,我们就可以重新审视这些对象的持久化。
此 chart 中使用的容器具有一些我们当前未在此 chart 中使用的额外优化。主要是能够快速跳过正在运行的迁移(如果它们已经是最新的),而无需启动 rails 应用程序进行检查。 这种优化需要我们持久化迁移状态。 我们目前没有在此 chart 中这样做。 将来,我们将在此 chart 中引入对迁移状态的存储支持。
配置
migrations
chart 配置为两部分:外部服务和 chart 设置。
安装命令行选项
下表包含可以使用 --set
标志提供给 helm install
命令的所有可能的 chart 配置
参数 | 说明 | 默认值 |
---|---|---|
common.labels
| 应用于此 chart 创建的所有对象的补充标签。 | {}
|
image.repository
| Migrations 镜像仓库 | registry.gitlab.com/gitlab-org/build/cng/gitlab-toolbox-ee
|
image.tag
| Migrations 镜像标签 | |
image.pullPolicy
| Migrations 拉取策略 | Always
|
image.pullSecrets
| 镜像仓库使用的 Secrets | |
init.image
| initContainer 镜像 | busybox
|
init.tag
| initContainer 镜像标签 | latest
|
enabled
| Migrations 启用标记 | true
|
tolerations
| 分配给 Pod 的容忍标签 | []
|
annotations
| job 区段的 annotation | {}
|
podLabels
| 补充 Pod 标签。 不会用于选择器。 | |
redis.serviceName
| Redis service 名称 | redis
|
psql.serviceName
| 提供 PostgreSQL 的 Service 名称 | release-postgresql
|
psql.password.secret
| psql secret | gitlab-postgres
|
psql.password.key
| psql secret 中保存 psql 密码的 key | psql-password
|
psql.port
| 设置 PostgreSQL 服务器端口。优先于 global.psql.port
| |
resources.requests.cpu
| GitLab Migrations 最小 CPU | 250m
|
resources.requests.memory
| GitLab Migrations 最小内存 | 200Mi
|
securityContext.fsGroup
| 在其下启动 Pod 的 Group ID | 1000
|
securityContext.runAsUser
| 在其下启动 Pod 的 User ID | 1000
|
extraInitContainers
| 包含的额外 init 容器列表 | |
extraContainers
| 包含的额外容器列表 | |
extraVolumes
| 要创建的附加卷列表 | |
extraVolumeMounts
| 要添加的附加挂载卷列表 | |
extraEnv
| 要暴露的附加环境变量列表 | |
bootsnap.enabled
| 为 Rails 启用 Bootsnap 缓存 | true
|
Chart 配置示例
extraEnv
extraEnv
允许您在 Pod 的所有容器中暴露额外的环境变量。
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
image.pullSecrets
pullSecrets
允许您对私有仓库进行身份验证,以拉取 pod 的镜像。
有关私有仓库及其身份验证方法的其它详细信息,请参见 Kubernetes 文档。
下面是一个使用 pullSecrets
的例子:
image:
repository: my.migrations.repository
pullPolicy: Always
pullSecrets:
- name: my-secret-name
- name: my-secondary-secret-name
外部服务
Redis
redis:
host: redis.example.com
serviceName: redis
port: 6379
sentinels:
- host: sentinel1.example.com
port: 26379
password:
secret: gitlab-redis
key: redis-password
host
要使用的数据库的 Redis 服务器的主机名。可以省略并使用 serviceName
代替。如果使用 Redis Sentinels,则需要将 host
属性设置为 sentinel.conf
中指定的集群名称。
serviceName
正在操作 Redis 数据库的 service
的名称。 如果它存在,而 host
不存在,chart 将服务的主机名(和当前的 .Release.Name
)作为模板代替 host
值。当使用 Redis 作为整个 GitLab chart 的一部分时,这很方便。默认值为 redis
。
port
连接到 Redis 服务器的端口。 默认为6379
。
password
Redis 的 password
属性有两个子键:
-
secret
定义了要拉取的 KubernetesSecret
的名称 -
key
定义了包含密码的上述 secret 中的 key 名称。
sentinels
sentinels
属性允许连接到 Redis HA 集群。
子键描述每个 Sentinel 连接。
-
host
定义了 Sentinel 服务的主机名 -
port
定义了到达 Sentinel 服务的端口号,默认为26379
注意:目前 Redis Sentinel 只支持已经脱离 GitLab chart 单独部署的 Sentinel。因此,应使用 redis.install=false
禁用通过 GitLab chart 的 Redis 部署。
在部署 GitLab chart 之前,需要手动创建包含 Redis 密码的 Secret。
PostgreSQL
psql:
host: psql.example.com
serviceName: pgbouncer
port: 5432
database: gitlabhq_production
username: gitlab
preparedStatements: false
password:
secret: gitlab-postgres
key: psql-password
host
要使用的数据库的 PostgreSQL 服务器的主机名。 如果postgresql.install=true
(默认非生产)可以省略。
serviceName
操作 PostgreSQL 数据库的服务的名称。如果它存在,若 host
不存在,chart 将服务的主机名作为模板代替 host
值。
port
连接到 PostgreSQL 服务器的端口。默认为5432
。
database
要在 PostgreSQL 服务器上使用的数据库的名称。默认为gitlabhq_production
。
preparedStatements
与 PostgreSQL 服务器通信时是否应使用 preparedStatements。 默认为false
。
username
用于对数据库进行身份验证的用户名。默认为gitlab
。
password
PostgreSQL 的 password
属性有两个子键:
-
secret
定义了要拉取的 KubernetesSecret
的名称。 -
key
定义了包含密码的上述 secret 中的 key 名称。