使用 MinIO 作为对象存储

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

此 chart 基于 stable/minio 0.4.3,因此继承了绝大多数设置。

设计选择#

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

极狐GitLab 选择更改该 chart 以简化密钥的配置,并删除环境变量中所有密钥的使用。极狐GitLab 添加了 initContainer 来控制将密钥填充到 config.json 中,并添加了一个 chart 范围内的 enabled 标志。

此 chart 仅使用一个密钥:

  • global.minio.credentials.secret: 一个全局密钥,包含将用于存储桶认证的 accesskeysecretkey 值。

配置#

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

yaml
1minio: 2 init: 3 ingress: 4 enabled: 5 apiVersion: 6 tls: 7 enabled: 8 secretName: 9 annotations: 10 configureCertmanager: 11 proxyReadTimeout: 12 proxyBodySize: 13 proxyBuffering: 14 tolerations: 15 persistence: # 上游 16 volumeName: 17 matchLabels: 18 matchExpressions: 19 serviceType: # 上游 20 servicePort: # 上游 21 defaultBuckets: 22 minioConfig: # 上游

安装命令行选项#

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

参数默认值描述
common.labels{}应用于此 chart 创建的所有对象的补充标签。
init.containerSecurityContext.allowPrivilegeEscalationfalseinitContainer 特定:控制进程是否可以获得比其父进程更多的权限
init.containerSecurityContext.runAsNonRoottrueinitContainer 特定:控制容器是否以非 root 用户运行
init.containerSecurityContext.capabilities.drop[ "ALL" ]initContainer 特定:移除容器的 Linux 能力
defaultBuckets[{"name": "registry"}]MinIO 默认存储桶
deployment.strategy{ type: Recreate }允许配置部署使用的更新策略
imageminio/minioMinIO 映像
imagePullPolicyAlwaysMinIO 映像拉取策略
imageTagRELEASE.2017-12-28T01-21-00ZMinIO 映像标签
minioConfig.browseronMinIO 浏览器标志
minioConfig.domainMinIO 域
minioConfig.regionus-east-1MinIO 区域
minioMc.imageminio/mcMinIO mc 映像
minioMc.taglatestMinIO mc 映像标签
mountPath/exportMinIO 配置文件挂载路径
persistence.accessModeReadWriteOnceMinIO 持久性访问模式
persistence.enabledtrueMinIO 启用持久性标志
persistence.matchExpressionsMinIO 标签表达式匹配以绑定
persistence.matchLabelsMinIO 标签值匹配以绑定
persistence.size10GiMinIO 持久性卷大小
persistence.storageClass用于配置的 MinIO storageClassName
persistence.subPathMinIO 持久性卷挂载路径
persistence.volumeNameMinIO 现有持久性卷名称
priorityClassName分配给 pod 的优先级类
pullSecrets映像仓库的密钥
resources.requests.cpu250mMinIO 请求的最小 CPU
resources.requests.memory256MiMinIO 请求的最小内存
securityContext.fsGroup1000启动 pod 的组 ID
securityContext.runAsUser1000启动 pod 的用户 ID
securityContext.fsGroupChangePolicy更改卷的所有权和权限的策略(需要 Kubernetes 1.23)
securityContext.seccompProfile.typeRuntimeDefault使用的 seccomp 配置文件
containerSecurityContext.runAsUser1000允许覆盖启动容器时使用的特定安全上下文
containerSecurityContext.allowPrivilegeEscalationfalse控制 Gitaly 容器的进程是否可以获得比其父进程更多的权限
containerSecurityContext.runAsNonRoottrue控制容器是否以非 root 用户运行
containerSecurityContext.capabilities.drop[ "ALL" ]移除 Gitaly 容器的 Linux 能力
serviceAccount.automountServiceAccountTokenfalse指示默认的 ServiceAccount 访问令牌是否应该挂载到 pod 中
servicePort9000MinIO 服务端口
serviceTypeClusterIPMinIO 服务类型
tolerations[]pod 分配的容忍标签
jobAnnotations{}作业规范的注释

Chart 配置示例#

pullSecrets#

pullSecrets 允许您认证到私有仓库以拉取 pod 的映像。

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

以下是 pullSecrets 的示例用法:

yaml
1image: my.minio.repository 2imageTag: latest 3imagePullPolicy: Always 4pullSecrets: 5- name: my-secret-name 6- name: my-secondary-secret-name

serviceAccount#

此部分控制是否应将默认的 ServiceAccount 访问令牌挂载到 pod 中。

名称类型默认值描述
automountServiceAccountTokenBooleanfalse控制默认的 ServiceAccount 访问令牌是否应挂载到 pod 中。除非某些 sidecars 需要正常工作(例如 Istio),否则不应启用此选项。

tolerations#

tolerations 允许您在标记的工作节点上调度 pod

以下是 tolerations 的示例用法:

yaml
1tolerations: 2- key: "node_label" 3 operator: "Equal" 4 value: "true" 5 effect: "NoSchedule" 6- key: "node_label" 7 operator: "Equal" 8 value: "true" 9 effect: "NoExecute"

启用子 chart#

我们选择实现划分子 chart 的方法包括禁用您可能不希望在给定部署中使用的组件的能力。因此,您应该首先决定的设置是 enabled:

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

配置 initContainer#

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

yaml
1init: 2 image: 3 repository: 4 tag: 5 pullPolicy: IfNotPresent 6 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。

名称类型默认值描述
apiVersionString用于 apiVersion 字段的值。
annotationsString该字段完全匹配 Kubernetes Ingress 的标准 annotations
enabledBooleanfalse控制是否为支持的服务创建 Ingress 对象的设置。当 false 时,使用 global.ingress.enabled 设置。
configureCertmanagerBoolean切换 Ingress 注释 cert-manager.io/issueracme.cert-manager.io/http01-edit-in-place。有关更多信息,请参阅 极狐GitLab Pages 的 TLS 要求
tls.enabledBooleantrue当设置为 false 时,您将禁用 MinIO 的 TLS。这主要在您无法在 Ingress 级别使用 TLS 终止时有用,例如,当您在 Ingress 控制器前面有一个 TLS 终止代理时。
tls.secretNameString包含 MinIO URL 的有效证书和密钥的 Kubernetes TLS Secret 的名称。如果未设置,则使用 global.ingress.tls.secretName

配置映像#

imageimageTagimagePullPolicy 的默认值在上游文档中记录。

持久性#

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

persistence 的行为在上游文档中记录。

极狐GitLab 添加了一些项目:

yaml
persistence: volumeName: matchLabels: matchExpressions:
名称类型默认值描述
volumeNameStringfalse提供 volumeName 时,PersistentVolumeClaim 将使用按名称提供的 PersistentVolume,而不是动态创建 PersistentVolume。这会覆盖上游行为。
matchLabelsMaptrue接受标签名称和标签值的 Map,以在选择要绑定的卷时进行匹配。这用于 PersistentVolumeClaimselector 部分。请参阅 卷文档
matchExpressionsArray接受标签条件对象的数组,以在选择要绑定的卷时进行匹配。这用于 PersistentVolumeClaimselector 部分。请参阅 卷文档

defaultBuckets#

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

yaml
1defaultBuckets: 2 - name: public 3 policy: public 4 purge: true 5 - name: private 6 - name: public-read 7 policy: download
名称类型默认值描述
nameString创建的存储桶的名称。提供的值应符合 AWS 存储桶命名规则,这意味着它应符合 DNS 并且仅包含字符 a-z,0-9 和 -(连字符),字符串长度在 3 到 63 个字符之间。name 属性对于所有条目是_必需的_。
policynonepolicy 的值控制 MinIO 上存储桶的访问策略。policy 属性不是必需的,默认值是 none。关于匿名访问,可能的值是:none(没有匿名访问),download(匿名只读访问),upload(匿名只写访问)或 public(匿名读/写访问)。
purgeBooleanpurge 属性提供了一种在安装时强制删除任何现有存储桶的方法。此功能仅在为 persistence 的 volumeName 属性使用预先存在的 PersistentVolume 时才会生效。如果您使用动态创建的 PersistentVolume,这将没有有价值的效果,因为它仅在 chart 安装时发生,并且新创建的 PersistentVolume 中将没有数据。此属性不是必需的,但您可以指定此属性的值为 true,以便强制删除存储桶 mc rm -r --force

安全上下文#

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

服务类型和端口#

这些在上游文档中记录,其关键总结是:

yaml
1## 将 MinIO 服务暴露为集群外部可访问(LoadBalancer 服务) 2## 或从集群内部访问它(ClusterIP 服务)。设置服务类型和端口以提供它。 3## 参考:http://kubernetes.io/docs/user-guide/services/ 4## 5serviceType: LoadBalancer 6servicePort: 9000

该 chart 不期望为 type: NodePort,因此不要这样设置。

上游项目#

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

  • resources
  • nodeSelector
  • minioConfig

关于 minioConfig 设置的进一步解释可以在 MinIO 通知文档中找到。这包括有关在存储桶对象被访问或更改时发布通知的详细信息。