首次提交:初始化项目

This commit is contained in:
fei
2026-02-05 00:11:05 +08:00
commit 26eaf8110b
171 changed files with 17105 additions and 0 deletions

View File

@@ -0,0 +1,131 @@
# MinIO S3 对象存储部署
## 功能特性
- ✅ MinIO 对象存储服务
- ✅ 自动 SSL 证书(通过 Caddy
- ✅ 自动设置新存储桶为公开只读权限
- ✅ Web 管理控制台
- ✅ S3 兼容 API
## 部署前准备
### 1. 修改配置
编辑 `minio.yaml`,替换以下内容:
**域名配置3 处):**
- `s3.u6.net3w.com` → 你的 S3 API 域名
- `console.s3.u6.net3w.com` → 你的控制台域名
**凭证配置4 处):**
- `MINIO_ROOT_USER: "admin"` → 你的管理员账号
- `MINIO_ROOT_PASSWORD: "adminks.."` → 你的管理员密码(建议至少 8 位)
**架构配置1 处):**
- `linux-arm64` → 根据你的 CPU 架构选择:
- ARM64: `linux-arm64`
- x86_64: `linux-amd64`
### 2. 配置 DNS
将域名解析到你的服务器 IP
```
s3.yourdomain.com A your-server-ip
console.s3.yourdomain.com A your-server-ip
```
### 3. 配置 Caddy
在 Caddy 配置中添加(如果使用 Caddy 做 SSL
```
s3.yourdomain.com {
reverse_proxy traefik.kube-system.svc.cluster.local:80
}
console.s3.yourdomain.com {
reverse_proxy traefik.kube-system.svc.cluster.local:80
}
```
## 部署步骤
```bash
# 1. 部署 MinIO
kubectl apply -f minio.yaml
# 2. 检查部署状态
kubectl get pods -n minio
# 3. 查看日志
kubectl logs -n minio -l app=minio -c minio
kubectl logs -n minio -l app=minio -c policy-manager
```
## 访问服务
- **Web 控制台**: https://console.s3.yourdomain.com
- **S3 API 端点**: https://s3.yourdomain.com
- **登录凭证**: 使用你配置的 MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD
## 自动权限策略
新创建的存储桶会在 30 秒内自动设置为 **公开只读download** 权限:
- ✅ 任何人可以下载文件(无需认证)
- ✅ 上传/删除需要认证
如需保持某个桶为私有,在控制台手动改回 PRIVATE 即可。
## 存储配置
默认使用 50Gi 存储空间,修改方法:
编辑 `minio.yaml` 中的 PersistentVolumeClaim
```yaml
resources:
requests:
storage: 50Gi # 修改为你需要的大小
```
## 故障排查
### Pod 无法启动
```bash
kubectl describe pod -n minio <pod-name>
```
### 查看详细日志
```bash
# MinIO 主容器
kubectl logs -n minio <pod-name> -c minio
# 策略管理器
kubectl logs -n minio <pod-name> -c policy-manager
```
### 检查 Ingress
```bash
kubectl get ingress -n minio
```
## 架构说明
```
用户 HTTPS 请求
Caddy (SSL 终止)
↓ HTTP
Traefik (路由)
MinIO Service
├─ MinIO 容器 (9000: API, 9001: Console)
└─ Policy Manager 容器 (自动设置桶权限)
```
## 卸载
```bash
kubectl delete -f minio.yaml
```
注意:这会删除所有数据,请先备份重要文件。

View File

@@ -0,0 +1,169 @@
apiVersion: v1
kind: Namespace
metadata:
name: minio
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: minio-data
namespace: minio
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
storageClassName: local-path
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: minio
namespace: minio
spec:
replicas: 1
selector:
matchLabels:
app: minio
template:
metadata:
labels:
app: minio
spec:
containers:
- name: minio
image: minio/minio:latest
command:
- /bin/sh
- -c
- minio server /data --console-address ":9001"
ports:
- containerPort: 9000
name: api
- containerPort: 9001
name: console
env:
- name: MINIO_ROOT_USER
value: "admin"
- name: MINIO_ROOT_PASSWORD
value: "adminks.."
- name: MINIO_SERVER_URL
value: "https://s3.u6.net3w.com"
- name: MINIO_BROWSER_REDIRECT_URL
value: "https://console.s3.u6.net3w.com"
volumeMounts:
- name: data
mountPath: /data
livenessProbe:
httpGet:
path: /minio/health/live
port: 9000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /minio/health/ready
port: 9000
initialDelaySeconds: 10
periodSeconds: 5
- name: policy-manager
image: alpine:latest
command:
- /bin/sh
- -c
- |
# 安装 MinIO Client
wget https://dl.min.io/client/mc/release/linux-arm64/mc -O /usr/local/bin/mc
chmod +x /usr/local/bin/mc
# 等待 MinIO 启动
sleep 10
# 配置 mc 客户端
mc alias set myminio http://localhost:9000 ${MINIO_ROOT_USER} ${MINIO_ROOT_PASSWORD}
echo "Policy manager started. Monitoring buckets..."
# 持续监控并设置新桶的策略
while true; do
# 获取所有存储桶
mc ls myminio 2>/dev/null | awk '{print $NF}' | sed 's/\///' | while read -r BUCKET; do
if [ -n "$BUCKET" ]; then
# 检查当前策略
POLICY_OUTPUT=$(mc anonymous get myminio/${BUCKET} 2>&1)
# 如果是私有的(包含 "Access permission for" 且不包含 "download"
if echo "$POLICY_OUTPUT" | grep -q "Access permission for" && ! echo "$POLICY_OUTPUT" | grep -q "download"; then
echo "Setting download policy for bucket: ${BUCKET}"
mc anonymous set download myminio/${BUCKET}
fi
fi
done
sleep 30
done
env:
- name: MINIO_ROOT_USER
value: "admin"
- name: MINIO_ROOT_PASSWORD
value: "adminks.."
volumes:
- name: data
persistentVolumeClaim:
claimName: minio-data
---
apiVersion: v1
kind: Service
metadata:
name: minio
namespace: minio
spec:
type: ClusterIP
ports:
- port: 9000
targetPort: 9000
name: api
- port: 9001
targetPort: 9001
name: console
selector:
app: minio
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minio-api
namespace: minio
spec:
ingressClassName: traefik
rules:
- host: s3.u6.net3w.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: minio
port:
number: 9000
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minio-console
namespace: minio
spec:
ingressClassName: traefik
rules:
- host: console.s3.u6.net3w.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: minio
port:
number: 9001

View File

@@ -0,0 +1,65 @@
1. MinIO 配置已更新
- MINIO_SERVER_URL: https://s3.u6.net3w.com
- MINIO_BROWSER_REDIRECT_URL: https://console.s3.u6.net3w.com
2. MinIO 日志确认
API: https://s3.u6.net3w.com
WebUI: https://console.s3.u6.net3w.com
3. 访问测试通过
- https://s3.u6.net3w.com - 正确重定向到 Console不再显示端口号
- https://console.s3.u6.net3w.com - 直接访问 Console
访问方式:
- Web 控制台: https://console.s3.u6.net3w.com
- S3 API 端点: https://s3.u6.net3w.com
- 登录凭证:
- 用户名: admin
- 密码: adminks..
配置文件位置:
- MinIO: /home/fei/k3s/009-基础设施/002-s3/minio.yaml
- Caddy: /home/fei/k3s/caddy-ssl-deployment.yaml
所有服务已正常运行,可以开始使用 MinIO 对象存储了!
不如固定桶名?
在对象存储的使用习惯中“频繁创建桶”其实是一种反模式Anti-pattern
建议方案:创建一个名为 public-assets 的固定桶,并将其设为 download 权限。
管理方式:不同的业务或用户,通过 文件夹Prefix 来区分,例如 public-assets/user1/public-assets/user2/。
结果:你只需要在部署 Pod 时设置一次权限,之后所有上传到该桶下的文件自动就能下载。
配置完成: ─
从日志可以看到:
Policy manager started. Monitoring buckets...
Setting download policy for bucket: test
Access permission for `myminio/test` is set to `download`
功能说明:
1. 自动检测 - 每 30 秒扫描一次所有存储桶
2. 自动设置 - 发现私有PRIVATE存储桶时自动设置为 download公开只读
3. 已处理 - 你的 test 存储桶已自动设置为公开只读权限
权限效果:
- ✅ 任何人都可以下载文件(无需认证)
- ✅ 上传/删除需要认证Access Key + Secret Key
测试方法:
# 现在可以直接访问 test 桶中的文件(无需认证)
curl https://s3.u6.net3w.com/test/your-file.txt
后续使用:
- 新创建的任何存储桶都会在 30 秒内自动设置为公开只读
- 如果需要保持某个桶为私有,可以在 Web 控制台手动改回 PRIVATE
- Policy manager 只会处理完全私有的桶,不会覆盖已设置的策略
配置已生效,可以继续使用了!

View File

@@ -0,0 +1,25 @@
#!/bin/sh
# 自动为新创建的存储桶设置 download公开只读策略
# 配置 mc 客户端
mc alias set myminio http://localhost:9000 ${MINIO_ROOT_USER} ${MINIO_ROOT_PASSWORD}
# 持续监控并设置新桶的策略
while true; do
# 获取所有存储桶
BUCKETS=$(mc ls myminio 2>/dev/null | awk '{print $NF}' | sed 's/\///')
for BUCKET in $BUCKETS; do
# 检查当前策略
CURRENT_POLICY=$(mc anonymous get myminio/${BUCKET} 2>/dev/null | grep -o "download\|upload\|public" || echo "none")
# 如果策略为 none私有则设置为 download
if [ "$CURRENT_POLICY" = "none" ]; then
echo "Setting download policy for bucket: ${BUCKET}"
mc anonymous set download myminio/${BUCKET}
fi
done
# 每 30 秒检查一次
sleep 30
done