阿里的云的 OSS 并不是完全版本的 AWS S3 兼容。

我们如果需要用 S3 协议访问 OSS,就比较麻烦了。

所以搭建一个 minio 来做网关,代理OSS,minio 是基本兼容S3的,所以这样曲线救国,通过 S3 协议访问 minio 来访问最后端的 OSS

这里还有一段故事:

Minio 中间有一版是支持 oss 的,但是后来 oss 改了协议,所以现在的最新版本 minio 反而是不支持代理 oss 的,我们必须手动作出镜像,放到镜像库里,然后阿里 ACK 再使用

首先去下载那一版直接支持oss的

wget http://dl.minio.org.cn/server/minio/release/linux-amd64/archive/minio.RELEASE.2020-04-15T19-42-18Z 

chmod 755 minio.RELEASE.2020-04-15T19-42-18Z 

这个文件比较宝贵,给个本地备份链接下载:

minio.RELEASE.2020-04-15T19-42-18Z

然后在当前目录编辑 Dockerfile ,因为 K8S 和 OSS 同一地域,所以用 OSS 私网域名:

FROM alpine:3.12 

RUN apk add --update bash && rm -rf /var/cache/apk/*  

COPY minio.RELEASE.2020-04-15T19-42-18Z /data/minio.RELEASE.2020-04-15T19-42-18Z  

ENV MINIO_ACCESS_KEY=LTAI5tFFTbsxxxxxuLb  
ENV MINIO_SECRET_KEY=t78PyGnHZilxxxxxdxBCjvNgtVC5Y  

WORKDIR /data  
EXPOSE 9000  

CMD ["/data/minio.RELEASE.2020-04-15T19-42-18Z","gateway","oss","http://oss-cn-shanghai-internal.aliyuncs.com"] 
# CMD /bin/sh -c "while true; do echo hi; sleep 10; done"

注意上面,MINIO_ACCESS_KEY 和 MINIO_SECRET_KEY 对应的是阿里云 OSS的 AccessKey ID 和 AccessKey Secret

打开阿里云网址,新建AccessKey ID 和 AccessKey Secret ,注意这东西只能看见一次,之后再也不能明文看了,所以第一次务必保存好!!!

https://ram.console.aliyun.com/manage/ak

image-20211126094340872

然后还有 Dockerfile 的最后一行,八戒的习惯是保留一个死循环 shell,如果镜像 CMD 有问题,无法启动,就换成这个先启动,然后再进去调试。(经常有什么库错、链接搞不好需要修改)

docker build -t registry.cn-shanghai.aliyuncs.com/rendoumi/minio .

然后 push 上去

docker push registry.cn-shanghai.aliyuncs.com/rendoumi/minio

编写好Deployment和svc,如果想公开还可以写 ingress 向外暴露,自己公司用还是 port-forward 更安全

---
apiVersion: apps/v1 
kind: Deployment 
metadata: 
  name: minio-deploy 
  labels: 
    app: minio 
spec: 
  replicas: 1 
  selector: 
    matchLabels: 
      app: minio 
  template: 
    metadata: 
      labels: 
        app: minio 
    spec: 
      containers: 
      - name: minio 
        image: registry.cn-shanghai.aliyuncs.com/rendoumi/minio:latest 
        ports: 
        - containerPort: 9000 
---
apiVersion: v1  
kind: Service  
metadata:  
 name: minio-svc  
 labels:  
   app: minio  
spec:  
 ports:  
 - name: http  
   protocol: TCP  
   port: 9000  
   targetPort: 9000  
 selector:  
   app: minio  
 type: ClusterIP 

然后开转发:

kubectl port-forward svc/minio-svc 9000:9000 &

用浏览器访问 http://localhost:9000 就可以了,还得输入一遍密码

image-20211126095040380

这样就可以看到 OSS 的所有桶了

image-20211126095433603

Minio的官方命令行客户端是 mc,使用方法如下:

wget https://dl.min.io/client/mc/release/linux-amd64/mc 
chmod 755 mc 

./mc alias set minio http://minio-svc:9000 MINIO_ACCESS_KEY 和 MINIO_SECRET_KEY 

./mc ls minio 

minio 跑在容器外进行 OSS 代理的方法,注意不同地方,OSS 的域名改为公网的了:

#!/bin/sh
export MINIO_ACCESS_KEY=LTAI5tFFTbsxxxxxuLb 
export MINIO_SECRET_KEY=t78PyGnHZilxxxxxdxBCjvNgtVC5Y 
nohup ./minio.RELEASE.2020-04-15T19-42-18Z gateway oss http://oss-cn-shanghai.aliyuncs.com >/dev/null 2>&1 &