橡树议会紧急召开。狐狸菲菲拍桌:"松鼠的存粮数据又丢了!我们需要私有化存储方案!"
猫头鹰奥利振翅而起:"MinIO符合S3标准,分布式架构可横向扩展。"他在树皮上画出拓扑图,"就像我们鸟巢的分层结构。"
树懒萨姆慢吞吞举起树皮笔记:"本地Docker部署只需一分钟。"他展示终端日志,"9000端口API,9001管理界面,挂载磁盘就能用。"
猎狗戴夫龇牙:"我测试过穿透攻击,数据加密可靠。"他甩出测试报告,"多租户权限控制比狐狸的树洞还严实。"
菲菲舔舔爪子:"客户端SDK兼容Java,上传下载像摘浆果一样简单。"她投影出控制台界面,"十分钟就能建好存储桶。"
月光下,四位长老碰触前爪达成决议。次日黎明,MinIO集群在森林数据中心启动,首个存储桶"data"开始接收松鼠的库存数据。当第一份备份成功写入时,连夜枭都吹起了口哨——这次,森林的数据终于安全了。
私有化交付场景,需要有一个对象存储的组件,对文件进行统一的管理。
minio是一个不错的选择。符合S3标准。
一分钟启动指令:
docker run --name minio --publish 9009:9000 --publish 9001:9001
--volume /data:/data --env MINIO_DEFAULT_BUCKETS='data,conf'
--env MINIO_FORCE_NEW_KEYS="yes" --env MINIO_ACCESS_KEY="carter"
--env MINIO_SECRET_KEY="Carter123!" --restart=always -d bitnami/minio:2022.3.5
Plain Text
启动日志:
$ docker logs -f minio 06:18:49.99 06:18:49.99 Welcome to the Bitnami minio
container 06:18:49.99 Subscribe to project updates by watching
https://github.com/bitnami/bitnami-docker-minio 06:18:49.99 Submit
issues and feature requests at https://github.com/bitnami/bitnami-docker-minio/issues
06:18:49.99 06:18:50.00 INFO ==> ** Starting MinIO setup **minio 06:18:50.01 INFO ==>
Starting MinIO in background...minio 06:18:55.03 INFO ==> Adding local Minio host to 'mc'
configuration...minio 06:18:55.06 INFO ==> Creating default buckets...Bucket created
successfully `local/cycube`.Bucket created successfully `local/cycubedev`.minio 06:18:55.21
INFO ==> Stopping MinIO... 06:18:56.27 INFO ==> ** MinIO setup finished! **
minio 06:18:56.28 INFO
==> ** Starting MinIO **WARNING: MINIO_ACCESS_KEY and MINIO_SECRET_KEY are deprecated.
Please use MINIO_ROOT_USER and MINIO_ROOT_PASSWORDAPI: http://172.17.0.7:9000
http://127.0.0.1:9000
Console: http://172.17.0.7:9001 http://127.0.0.1:9001
Documentation: https://docs.min.io
Plain Text
9000端口是api端口,9001是后台管理系统端口;
更多配置:
配置 | 用途 |
---|---|
--volume /data:/data --env | 挂载磁盘到容器 |
--env MINIO_HTTP_TRACE=/opt/bitnami/minio/log/minio.log | 指定http的日志输出目录 |
MINIO_DEFAULT_BUCKETS='cycube_local,cycube_dev' | 启动即创建的bucket |
访问控制后台:
主页:
文件挂载 10.10.1.24的nas盘,通过hostpath方式挂载到容器:
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: minio
spec:
replicas: 1
serviceName: svc-minio
selector:
matchLabels:
name: minio
template:
metadata:
labels:
name: minio
spec:
nodeSelector:
node: node24
imagePullSecrets:
- name: ali-sh2-cycube-images-mid
volumes:
- name: miniopv-icourt
hostPath:
path: /data/dev/minio/
type: DirectoryOrCreate
containers:
- name: minio
image: registry.cn-shanghai.aliyuncs.com/cycube/mid:bitnami-minio-2022.3.5
imagePullPolicy: IfNotPresent
volumeMounts:
- name: miniopv-icourt
mountPath: "/data"
subPath: "minio-dev"
env:
- name: MINIO_DEFAULT_BUCKETS
value: "data,config"
- name: MINIO_ROOT_USER
value: "carter"
- name: MINIO_ROOT_PASSWORD
value: "Carter123!"
resources:
limits:
cpu: 500m
memory: 1024Mi
requests:
cpu: 250m
memory: 512Mi
ports:
- name: minioadmin
containerPort: 9001
protocol: TCP
- name: minioapi
containerPort: 9000
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
labels:
app: minio
name: svc-minio
spec:
ports:
- name: minioadmin
port: 9001
targetPort: 9001
protocol: TCP
- name: minioapi
port: 9000
targetPort: 9000
protocol: TCP
selector:
name: minio
sessionAffinity: None
---
apiVersion: v1
kind: Service
metadata:
name: svc-minio-n
spec:
ports:
- name: minioadmin-port
port: 9001
protocol: TCP
targetPort: 9001
selector:
name: minio
sessionAffinity: None
type: NodePort
访问地址: 通过nodePort方式访问,或者通过nginx转发:
# Proxy requests to the bucket "photos" to MinIO server running on port 9000
location /photos/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_connect_timeout 300;
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://localhost:9000;
}
# Proxy any other request to the application server running on port 9001
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_connect_timeout 300;
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://localhost:9001;
}
客户端上传下载测试:
package com.joysky.joycode.lib.code.tool;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import java.util.UUID;
import org.apache.http.entity.ContentType;
import org.xmlpull.v1.XmlPullParserException;
import io.minio.MinioClient;
import io.minio.errors.MinioException;
public class FileUploader {
private static final String bucketName = "data";
public static final String fileName ="/data/son1.jpg";
public static void main(String[] args) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException {
try {
// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象
MinioClient minioClient = new MinioClient("http://lifcHost:9009", "carte", "Carter123!");
// 检查存储桶是否已经存在
boolean isExist = minioClient.bucketExists("carter");
if(isExist) {
System.out.println("Bucket already exists.");
} else {
// 创建一个名为asiatrip的存储桶,用于存储照片的zip文件。
minioClient.makeBucket("carter");
}
// 使用putObject上传一个文件到存储桶中。
minioClient.putObject("carter", UUID.randomUUID().toString()+".jpeg",new FileInputStream(new File("D:\\data\\son1.jpg")),"image/jpg");
System.out.println("/home/user/Photos/asiaphotos.zip is successfully uploaded as asiaphotos.zip to `asiatrip` bucket.");
} catch(MinioException e) {
System.out.println("Error occurred: " + e);
}
}
}
上传效果:
通过docker和k8s方式部署了minio, 并使用java的sdk完成了上传的操作。
https://hub.docker.com/r/bitnami/minio docker官方镜像
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。