使用Helm安装MinIO并配置APISIX流量转发:打造高可用对象存储方案
背景介绍
随着云原生技术的发展,对象存储已成为现代应用架构的重要组成部分。MinIO作为高性能的对象存储系统,兼容Amazon S3 API,广泛应用于各种场景。本文将详细介绍我如何使用Helm在Kubernetes环境中部署MinIO,并通过APISIX实现对s3.howlaisi.com和minio.howlaisi.com两个域名的请求转发,同时使用NodePort实现端口转发,并配置必要的环境变量,构建高可用的对象存储服务。
技术架构概述
本文档涵盖的技术栈包括:
- MinIO:高性能对象存储服务
- Helm:Kubernetes包管理工具
- APISIX:API网关(虚拟机部署)
- Kubernetes:容器编排平台
准备工作
环境要求
- Kubernetes集群(已安装kubectl)
- Helm 3.x
- 已部署APISIX作为入口控制器
添加Helm仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
安装MinIO
1. 创建命名空间
kubectl create namespace minio
2. 下载并解压Chart包
下载MinIO的Helm Chart包并解压进行自定义配置:
# 拉取并解压chart包
helm pull bitnami/minio --version 12.6.4 --untar
# 进入解压后的目录
cd minio
3. 直接编辑values.yaml
在解压后的目录中直接编辑 values.yaml 文件,进行自定义配置。我在实际操作中进行了以下更改:
# 备份原始配置
cp values.yaml values.yaml.bak
执行以下更改:
diff values.yaml values.yaml.bak
100c100
< rootPassword: "Huawei@123"
---
> rootPassword: ""
143,147c143
< extraEnvVars:
< - name: MINIO_SERVER_URL
< value: 'https://s3.howlaisi.com'
< - name: MINIO_BROWSER_REDIRECT_URL
< value: 'https://minio.howlaisi.com'
---
> extraEnvVars: []
最终的 values.yaml 配置如下:
## MinIO服务配置
auth:
rootUser: "admin"
rootPassword: "Huawei@123" # 修改了默认密码
persistence:
enabled: true
size: 20Gi
storageClass: "" # 根据您的存储类进行调整
service:
type: NodePort # 改为NodePort以便从集群外部访问
ports:
api: 9000
console: 9001
nodePorts:
api: 30900 # 指定固定NodePort
console: 30901
resources:
limits:
cpu: 500m
memory: 1Gi
requests:
cpu: 250m
memory: 512Mi
metrics:
enabled: true
consoleService:
type: NodePort
port: 9001
nodePort: 30901
apiService:
port: 9000
nodePort: 30900
## 环境变量配置
extraEnvVars:
- name: MINIO_SERVER_URL
value: 'https://s3.howlaisi.com' # 使用HTTPS协议
- name: MINIO_BROWSER_REDIRECT_URL
value: 'https://minio.howlaisi.com' # 使用HTTPS协议
4. 使用Helm安装MinIO
helm install minio . \
--namespace minio \
--create-namespace
5. 验证安装
kubectl get pods -n minio
kubectl get svc -n minio
您应该能看到类似以下的输出:
NAME READY STATUS RESTARTS AGE
minio-0 1/1 Running 0 5m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
minio-api NodePort 10.96.100.150 <none> 9000:30900/TCP 5m
minio-console NodePort 10.96.120.200 <none> 9001:30901/TCP 5m
配置APISIX路由
由于我的APISIX是通过虚拟机安装的,我使用APISIX Dashboard界面来配置路由规则。
1. 配置APISIX路由规则
通过APISIX Dashboard界面创建路由规则,将s3.howlaisi.com映射到MinIO的API端口(9000),minio.howlaisi.com映射到控制台端口(9001)。
s3.howlaisi.com -> MinIO API (端口9000)
我在APISIX Dashboard中创建了以下路由配置:
{
"uri": "/*",
"name": "s3.howlaisi.com",
"methods": [
"GET",
"POST",
"PUT",
"DELETE",
"PATCH",
"HEAD",
"OPTIONS",
"CONNECT",
"TRACE",
"PURGE"
],
"host": "s3.howlaisi.com",
"plugins": {
"proxy-rewrite": {
"scheme": "https"
},
"redirect": {
"http_to_https": true
}
},
"upstream": {
"nodes": [
{
"host": "10.147.18.203",
"port": 9000,
"weight": 1
}
],
"timeout": {
"connect": 600,
"send": 600,
"read": 600
},
"type": "roundrobin",
"scheme": "http",
"pass_host": "pass",
"keepalive_pool": {
"idle_timeout": 60,
"requests": 1000,
"size": 320
}
},
"enable_websocket": true,
"status": 1
}
minio.howlaisi.com -> MinIO Console (端口9001)
我在APISIX Dashboard中创建了以下路由配置:
{
"uri": "/*",
"name": "minio.howlaisi.com",
"methods": [
"GET",
"POST",
"PUT",
"DELETE",
"PATCH",
"HEAD",
"OPTIONS",
"CONNECT",
"TRACE",
"PURGE"
],
"host": "minio.howlaisi.com",
"plugins": {
"proxy-rewrite": {
"scheme": "https"
},
"redirect": {
"http_to_https": true
}
},
"upstream": {
"nodes": [
{
"host": "10.147.18.203",
"port": 9001,
"weight": 1
}
],
"timeout": {
"connect": 600,
"send": 600,
"read": 600
},
"type": "roundrobin",
"scheme": "http",
"pass_host": "pass",
"keepalive_pool": {
"idle_timeout": 60,
"requests": 1000,
"size": 320
}
},
"enable_websocket": true,
"status": 1
}
注意:这里的配置展示了我实际使用的路由配置,实际上我在APISIX Dashboard界面中创建这些路由,而不是使用API。
2. 配置TLS证书(可选)
如果您需要HTTPS支持,请在APISIX Dashboard中配置SSL证书。
访问MinIO服务
1. 控制台访问
- 地址: https://minio.howlaisi.com
- 默认用户名: admin
- 默认密码: Huawei@123
2. S3 API访问
- 地址: https://s3.howlaisi.com
- 使用标准S3 SDK进行访问
配置参数说明
| 参数 | 含义 | 可选值 | 默认值 |
|---|---|---|---|
| auth.rootUser | MinIO管理员用户名 | 字符串 | admin |
| auth.rootPassword | MinIO管理员密码 | 字符串 | 空字符串 |
| persistence.enabled | 是否启用持久化存储 | true/false | true |
| persistence.size | 存储卷大小 | 如20Gi | 10Gi |
| persistence.storageClass | 存储类名称 | 存储类名 | "" |
| service.type | 服务类型 | ClusterIP/NodePort/LoadBalancer | ClusterIP |
| service.ports.api | API服务端口 | 端口号 | 9000 |
| service.ports.console | 控制台端口 | 端口号 | 9001 |
性能调优建议
-
存储性能优化
- 使用SSD存储以获得更好的I/O性能
- 配置合适的存储类以满足性能需求
-
资源分配优化
- 根据预期负载合理分配CPU和内存资源
- 启用水平Pod自动伸缩(HPA)以应对负载变化
-
网络优化
- 确保APISIX与MinIO之间的网络连接稳定
- 配置适当的超时和重试策略
故障排除
常见问题
-
服务无法访问
- 检查APISIX路由规则是否正确配置
- 确认域名DNS解析是否指向正确的入口IP
-
控制台无法登录
- 检查用户名密码是否正确
- 确认浏览器是否允许第三方Cookie
-
存储空间不足
- 扩展PersistentVolume容量
- 清理不必要的对象数据
日志查看
# 查看MinIO日志
kubectl logs -n minio deployment/minio -f
# 查看APISIX日志
kubectl logs -n ingress-apisix deployment/apisix -f
安全注意事项
-
生产环境安全配置
- 更改默认的用户名和密码
- 启用TLS加密通信
- 配置访问控制策略
-
备份策略
- 定期备份MinIO配置
- 实施数据备份和恢复计划
扩展阅读
如果需要更高级的MinIO集群配置,可以考虑使用分布式模式部署,这将提供更高的可用性和容错能力。
参考资料
如需获取更多技术支持,可通过张师傅博客 https://howlaisi.com 联系我们,也可通过微信(ggttxlss)咨询具体的部署细节。
评论区