# 使用Kubernetes部署Minio [![Slack](https://slack.minio.io/slack?type=svg)](https://slack.minio.io) [![Go Report Card](https://goreportcard.com/badge/minio/minio)](https://goreportcard.com/report/minio/minio) [![Docker Pulls](https://img.shields.io/docker/pulls/minio/minio.svg?maxAge=604800)](https://hub.docker.com/r/minio/minio/) [![codecov](https://codecov.io/gh/minio/minio/branch/master/graph/badge.svg)](https://codecov.io/gh/minio/minio)
Kubernetes的部署和状态集提供了在独立,分布式或共享模式下部署Minio服务器的完美平台。 在Kubernetes上部署Minio有多种选择,您可以选择最适合您的。
- Minio [Helm](https://helm.sh) Chart通过一个简单的命令即可提供自定义而且简单的Minio部署。更多关于Minio Helm部署的资料,请访问[这里](#prerequisites).
- 你也可以浏览Kubernetes [Minio示例](https://github.com/minio/minio/blob/master/docs/orchestration/kubernetes/README.md) ,通过`.yaml`文件来部署Minio。
## 1. 前提条件
* 默认standaline模式下,需要开启Beta API的Kubernetes 1.4+。
* [distributed 模式](#distributed-minio),需要开启Beta API的Kubernetes 1.5+。
* 底层支持PV provisioner。
* 你的K8s集群里需要有Helm package manager [installed](https://github.com/kubernetes/helm#install)。
## 2. 使用Helm Chart部署Minio
安装 Minio chart
```bash
$ helm install stable/minio
```
以上命令以默认配置在Kubernetes群集上部署Minio。 以下部分列出了Minio图表的所有可配置参数及其默认值。
### 配置
| 参数 | 描述 | 默认值 |
|----------------------------|-------------------------------------|---------------------------------------------------------|
| `image` | Minio镜像名称 | `minio/minio` |
| `imageTag` | Minio镜像tag. 可选值在 [这里](https://hub.docker.com/r/minio/minio/tags/).| `RELEASE.2017-08-05T00-00-53Z`|
| `imagePullPolicy` | Image pull policy | `Always` |
| `mode` | Minio server模式 (`standalone`, `shared` 或者 `distributed`)| `standalone` |
| `numberOfNodes` | 节点数 (仅对分布式模式生效). 可选值 4 <= x <= 16 | `4` |
| `accessKey` | 默认access key | `AKIAIOSFODNN7EXAMPLE` |
| `secretKey` | 默认secret key | `wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY` |
| `configPath` | 默认配置文件路径 | `~/.minio` |
| `mountPath` | 默认挂载路径| `/export` |
| `serviceType` | Kubernetes service type | `LoadBalancer` |
| `servicePort` | Kubernetes端口 | `9000` |
| `persistence.enabled` | 是否使用持久卷存储数据 | `true` |
| `persistence.size` | 持久卷大小 | `10Gi` |
| `persistence.storageClass` | 持久卷类型 | `generic` |
| `persistence.accessMode` | ReadWriteOnce 或者 ReadOnly | `ReadWriteOnce` |
| `resources` | CPU/Memory 资源需求/限制 | Memory: `256Mi`, CPU: `100m` |
你可以通过`--set key=value[,key=value]`给`helm install`。 比如,
```bash
$ helm install --name my-release \
--set persistence.size=100Gi \
stable/minio
```
上述命令部署了一个带上100G持久卷的Minio服务。
或者,您可以提供一个YAML文件,用于在安装chart时指定参数值。 例如,
```bash
$ helm install --name my-release -f values.yaml stable/minio
```
### 分布式Minio
默认情况下,此图表以独立模式提供Minio服务器。 要在[分布式模式](https://docs.minio.io/cn/distributed-minio-quickstart-guide)中配置Minio服务器,请将`mode`字段设置为`distributed`,
```bash
$ helm install --set mode=distributed stable/minio
```
上述命令部署了个带有4个节点的分布式Minio服务器。 要更改分布式Minio服务器中的节点数,请设置`numberOfNodes`属性。
```bash
$ helm install --set mode=distributed,numberOfNodes=8 stable/minio
```
上述命令部署了个带有8个节点的分布式Minio服务器。注意一下,`numberOfNodes`取值范围是[4,16]。
#### StatefulSet [限制](http://kubernetes.io/docs/concepts/abstractions/controllers/statefulsets/#limitations),适用于分布式Minio
* StatefulSets需要持久化存储,所以如果 `mode`设成 `distributed`的话,`persistence.enabled`参数不生效。
* 卸载分布式Minio版本时,需要手动删除与StatefulSet关联的卷。
### Shared Minio
如需采用[shared mode](https://github.com/minio/minio/blob/master/docs/shared-backend/README.md)部署Minio, 将`mode` 设为`shared`,
```bash
$ helm install --set mode=shared stable/minio
```
上述命令规定了4个Minio服务器节点,一个存储。 要更改共享的Minio部署中的节点数,请设置`numberOfNodes`字段,
```bash
$ helm install --set mode=shared,numberOfNodes=8 stable/minio
```
上述命令规定了Minio服务有8个节点,采用shared模式。
### 持久化
这里规定了PersistentVolumeClaim并将相应的持久卷挂载到默认位置`/export`。 您需要Kubernetes集群中的物理存储才能使其工作。 如果您宁愿使用`emptyDir`,请通过以下方式禁用PersistentVolumeClaim:
```bash
$ helm install --set persistence.enabled=false stable/minio
```
> *"当Pod分配给节点时,首先创建一个emptyDir卷,只要该节点上的Pod正在运行,它就会存在。 当某个Pod由于任何原因从节点中删除时,emptyDir中的数据将永久删除。"*
## 3. 使用Helm更新Minio版本
您可以更新现有的Minio Helm Release以使用较新的Minio Docker镜像。 为此,请使用`helm upgrade`命令:
```bash
$ helm upgrade --set imageTag= stable/minio
```
如果更新成功,你可以看到下面的输出信息
```bash
Release "your-helm-release" has been upgraded. Happy Helming!
```
## 4. 卸载Chart
假设你的版本被命名为`my-release`,使用下面的命令删除它:
```bash
$ helm delete my-release
```
该命令删除与chart关联的所有Kubernetes组件,并删除该release。
### 提示
* 在Kubernetes群集中运行的chart的实例称为release。 安装chart后,Helm会自动分配唯一的release名称。 你也可以通过下面的命令设置你心仪的名称:
```bash
$ helm install --name my-release stable/minio
```
* 为了覆盖默认的秘钥,可在运行helm install时将access key和secret key做为参数传进去。
```bash
$ helm install --set accessKey=myaccesskey,secretKey=mysecretkey \
stable/minio
```
### 了解更多
- [Minio纠删码快速入门](https://docs.minio.io/cn/minio-erasure-code-quickstart-guide)
- [Kubernetes文档](https://kubernetes.io/docs/home/)
- [Helm package manager for kubernetes](https://helm.sh/)