使用 MinIO 作为 Object storage

此 chart 基于 stable/minio 版本 0.4.3,并从那里继承了大部分设置。

设计选择

上游 chart 相关的设计选择可以在项目的 README 中找到。

GitLab 选择更改该 chart 以简化 secret 的配置,并删除环境变量中所有 secret 的使用。GitLab 添加了 initContainer 以控制添加到 config.json 中的 secret,并在 chart 范围内添加了 enabled 标志。

该 chart 只使用一个 secret:

  • global.minio.credentials.secret:包含accesskeysecretkey 值的全局 secret,将用于对存储桶进行身份验证。

配置

我们将在下面描述配置的所有主要部分。从父 chart 配置时,这些值将是:

minio:
  init:
  ingress:
    enabled:
    apiVersion:
    tls:
      enabled:
      secretName:
    annotations:
    configureCertmanager:
    proxyReadTimeout:
    proxyBodySize:
    proxyBuffering:
  tolerations:
  persistence:  # Upstream
    volumeName:
    matchLabels:
    matchExpressions:
  serviceType:  # Upstream
  servicePort:  # Upstream
  defaultBuckets:
  minioConfig:  # Upstream

安装命令行选项

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

参数 默认值 说明
common.labels {} 应用于此 chart 创建的所有对象的补充标签。
defaultBuckets [{"name": "registry"}] MinIO 默认桶
deployment.strategy { type: Recreate } 允许配置 deployment 使用的更新策略。如果未提供,使用集群默认值。
image minio/minio MinIO 镜像
imagePullPolicy Always MinIO 镜像拉取策略
imageTag RELEASE.2017-12-28T01-21-00Z MinIO 镜像标签
minioConfig.browser on MinIO 浏览器标志
minioConfig.domain   MinIO 域名
minioConfig.region us-east-1 MinIO 区域
minioMc.image minio/mc MinIO mc 镜像
minioMc.tag latest MinIO mc 镜像标签
mountPath /export MinIO 配置文件挂载路径
persistence.accessMode ReadWriteOnce MinIO 持久化访问模式
persistence.enabled true MinIO 启用持久化标志
persistence.matchExpressions   MinIO label-expression 匹配绑定
persistence.matchLabels   MinIO label-value 匹配绑定
persistence.size 10Gi MinIO 持久卷大小
persistence.storageClass   配置的 storageClassName
persistence.subPath   MinIO 持久卷挂载路径
persistence.volumeName   MinIO 的已有持久卷名称
priorityClassName   指派给 pods 的 Priority class
pullSecrets   拉取镜像仓库的 Secrets
replicas 4 MinIO 副本数
resources.requests.cpu 250m MinIO 最小 CPU 请求
resources.requests.memory 256Mi MinIO 最小内存请求
securityContext.fsGroup 1000 在其下启动 Pod 的 Group ID
securityContext.runAsUser 1000 在其下启动 Pod 的 User ID
securityContext.fsGroupChangePolicy   更改卷的所有权和权限的策略(需要 Kubernetes 1.23)
servicePort 9000 MinIO service 端口
serviceType ClusterIP MinIO service 类型
tolerations [] 分配给 Pod 的容忍标签
jobAnnotations {} 作业 spec 的 annotations

Chart 配置示例

pullSecrets

pullSecrets 允许您对私有仓库进行身份验证,以拉取 pod 的镜像。

有关私有仓库及其身份验证方法的其它详细信息,请参见 Kubernetes 文档

下面是一个使用 pullSecrets 的例子:

image: my.minio.repository
imageTag: latest
imagePullPolicy: Always
pullSecrets:
- name: my-secret-name
- name: my-secondary-secret-name

tolerations

tolerations 允许您调度 Pod 到受污染的工作节点上。

下面是一个使用 tolerations 的例子:

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

启用子 chart

我们选择实施分区子 chart 的方式包括禁用给定部署中您可能不需要的组件的能力。因此,您应该决定的第一个设置是enabled:

默认情况下,MinIO 是开箱即用的,但不建议用于生产用途。 当你准备好禁用它时,运行 --set global.minio.enabled: false

配置 initContainer

虽然很少更改,但可以通过以下项目更改 initContainer 的表现:

init:
  image:
    repository:
    tag:
    pullPolicy: IfNotPresent
  script:

initContainer 镜像

initContainer 镜像设置与普通镜像配置一样。 默认情况下,chart 本地值留空,全局设置 global.gitlabBase.image.repository 和与当前 global.gitlabVersion 关联的镜像标签将用于填充 initContainer 镜像。 全局配置可以被 chart 本地值覆盖(例如 minio.init.image.tag)。

initContainer 脚本

initContainer 被传递以下内容:

  • 包含安装在/config 中的认证项的秘密,通常是 accesskeysecretkey
  • 包含 config.json 模板的 ConfigMap 和包含要使用 sh 执行的脚本的 configure,安装在 /config 中。
  • 安装在/minioemptyDir 将被传递到守护进程的容器。

initContainer 应该使用 /config/configure 脚本,向 /minio/config.json 填入完整的配置。当 minio-config 容器完成该任务时,/minio 目录将传递给 minio 容器,并用于向 MinIO 服务器提供 config.json

配置 Ingress

以下设置控制 MinIO Ingress。

名称 类型 默认值 说明
annotations String   此字段与 Kubernetes Ingress 的标准 annotations 完全匹配。
configureCertmanager Boolean false 切换 Ingress annotation cert-manager.io/issueracme.cert-manager.io/http01-edit-in-place。获取更多信息请查看 GitLab Pages 的 TLS 要求.
enabled Boolean   控制是否为支持它们的服务创建 Ingress 对象的设置。 如果未设置,则使用 global.ingress.enabled 设置。
tls.enabled Boolean   当设置为 false 时,将禁用 Registry 子 chart 的 TLS,主要用于无法在 ingress-level 使用 TLS 终止的情况,例如在 Ingress Controller 之前有 TLS 终止代理时。
tls.secretName String   Kubernetes TLS Secret 的名称,其中包含 registry URL 的有效证书和密钥。如果未设置,则使用 global.ingress.tls.secretName

配置镜像

imageimageTagimagePullPolicy 默认值记录于上游文档

持久化

此 chart 提供了一个 PersistentVolumeClaim 并将相应的持久卷安装到默认位置 /export。您需要 Kubernetes 集群中有可用的物理存储才能使其工作。如果您更愿意使用 emptyDir,请通过以下方式禁用 PersistentVolumeClaimpersistence.enabled: false

persistence 的表现已记录在上游文档

GitLab 添加了以下几项:

persistence:
  volumeName:
  matchLabels:
  matchExpressions:
名称 类型 默认值 说明
volumeName String false 当提供 volumeName 时,PersistentVolumeClaim 将使用提供的 PersistentVolume 名称,而不是动态创建 PersistentVolume。此处会覆盖上游。
matchLabels Map true 在选择要绑定的卷时,接受要匹配的标签名称和标签值的映射。 这用于PersistentVolumeClaimselector部分。请参阅卷文档
matchExpressions Array   在选择要绑定的卷时,接受要匹配的标签条件对象数组,用于PersistentVolumeClaimselector部分。请参阅卷文档

defaultBuckets

defaultBuckets 提供了一种在安装时,在 MinIO pod 上自动创建存储桶的机制。此属性包含一组配置项,每一项最多具有三个属性:namepolicypurge

defaultBuckets:
  - name: public
    policy: public
    purge: true
  - name: private
  - name: public-read
    policy: download
名称 类型 默认值 说明
name String   创建的存储桶的名称。提供的值应符合 AWS 存储桶命名规则,这意味着它应符合 DNS 且仅包含字符 az 、0-9 和 –(连字符),符合长度介于 3 到 63 个字符之间的字符串。 所有条目都_需要_ name 属性。
policy   none policy 的值控制着 MinIO 上存储桶的访问策略。 policy 属性不是必需的,默认值为 none。 关于匿名访问,可能的值为:none(无匿名访问)、download(匿名只读访问)、upload(匿名只写访问)或public(匿名读/写访问)。
purge Boolean   purge 属性用于在安装时强制移除任何现有的存储桶。 这仅在对持久化的 volumeName 属性使用预先存在的 PersistentVolume 时起作用。如果您使用动态创建的 PersistentVolume,此参数没有任何价值,因为它只会在 chart 安装时发生,并且刚刚创建的 PersistentVolume 中将没有数据。 此属性不是必需的,但您可以使用 true 值指定此属性,以便使用强制 mc rm -r --force 清除存储桶。

Security Context

这些选项允许控制使用哪个 user 和/或 group 来启动 pod。

更深入的安全上下文信息请参考官方 Kubernetes文档

Service 类型和端口

以下是上游文档,关键摘要是:

## Expose the MinIO service to be accessed from outside the cluster (LoadBalancer service).
## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it.
## ref: http://kubernetes.io/docs/user-guide/services/
##
serviceType: LoadBalancer
servicePort: 9000

chart 不应使用 type: NodePort,所以不要设置它。

上游配置项

上游文档的以下内容也完全适用于该 chart:

  • resources
  • nodeSelector
  • minioConfig

minioConfig 设置的进一步说明可以参考 MinIO 通知文档,包括有关在访问或更改存储桶对象时发布通知的详细信息。