首次提交:初始化项目
This commit is contained in:
131
009-基础设施/002-s3/README.md
Normal file
131
009-基础设施/002-s3/README.md
Normal 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
|
||||
```
|
||||
|
||||
注意:这会删除所有数据,请先备份重要文件。
|
||||
169
009-基础设施/002-s3/minio.yaml
Normal file
169
009-基础设施/002-s3/minio.yaml
Normal 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
|
||||
65
009-基础设施/002-s3/note.md
Normal file
65
009-基础设施/002-s3/note.md
Normal 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 只会处理完全私有的桶,不会覆盖已设置的策略
|
||||
|
||||
配置已生效,可以继续使用了!
|
||||
25
009-基础设施/002-s3/set-bucket-policy.sh
Normal file
25
009-基础设施/002-s3/set-bucket-policy.sh
Normal 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
|
||||
Reference in New Issue
Block a user