通过operator的方式在k8s中部署minio
MinIO 提供高性能、兼容 S3 的对象存储,原生于 Kubernetes文档URL:https://min.io/docs/minio/kubernetes/upstream/operations/installation.html版本说明 - 服务版本说明 - 测试工具。
minio-operator部署指南
概述
MinIO 提供高性能、兼容 S3 的对象存储,原生于 Kubernetes
文档URL:https://min.io/docs/minio/kubernetes/upstream/operations/installation.html
版本说明 - 服务
名称 | 版本 | 描述 |
---|---|---|
console | v0.19.0 | 租户控制台 |
operator | v4.4.25 | minio-operator |
minio | RELEASE.2022-06-20T23-13-45Z | minio server |
busybox | busybox:1.33.1 | 初始化日志api服务 |
postgres | library/postgres:13 | 数据库服务 |
版本说明 - 测试工具
名称 | 版本 | 描述 |
---|---|---|
kubectl-minio | v4.4.25 | kubectl minio 插件(初始化operator、管理租户) |
mc | RELEASE.2022-07-06T14-54-36Z | minio客户端管理工具 |
依赖服务
名称 | 版本 | 描述 |
---|---|---|
kubernetes | 1.19.x | k8s集群 |
RKE集群说明
- rke集群的kubelet服务是基于docker部署,因此无法操作宿主机文件系统,所以需要将抽象成PV资源的hostpath挂载至kubelet
- rke集群默认没有指定集群范围签名的CA机构,但是由于minio-operator初始化时会生成csr并向api请求tls认证,如果没有指定签名的CA机构,csr请求将不会被处理且minio-operator将无法正常初始化完成,所以需要在kube-controller服务启动参数中指定集群签名的CA机构
需要在rke 的cluster.yaml文件中按需填写以下配置
services:
kubelet:
extra_binds:
- "<hostPath>:<hostPath>"
kube-controller:
extra_args:
cluster-signing-cert-file: /etc/kubernetes/ssl/kube-ca.pem
cluster-signing-key-file: /etc/kubernetes/ssl/kube-ca-key.pem
配置
初始化minio-opeator
minio-operator初始化后会启动两个pod,其中operator为minio的控制器,而console则为多租户管理程序
#kubectl-minio拷贝至可搜寻路径并赋予执行权限
#拷贝kubectl-minio文件至目标目标时,名称需要保持一致
cp tools/kubectl-minio /usr/local/bin/ && chmod +x /usr/local/bin/kubectl-minio
#查看插件版本以确认该插件是否可用
kubectl minio version
#初始化operator,指定operator、console的镜像版本,默认会创建minio-operator名称空间并在该空间安装operator资源
kubectl minio init --image=reg.chebai.org/icospaas/minio/operator:v4.4.25 \
--console-image=reg.chebai.org/icospaas/minio/console:v0.19.0
#查看operator安装状态
kubectl get all -n minio-operator
访问operator-console
#该命令会创建operator console的代理,并生成jwt token用于登录
kubectl minio proxy -n minio-operator
可正常登录则说明operator已经初始化完成且处于可用状态
Storage Class
创建一个自定义的StorageClass供minio租户的PV使用,minio租户要求volumeBindingMode设置为WaitForFirstConsumer
#创建存储类资源
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: node-local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
Persistent Volume
tenant_pv
- pv需要绑定k8s节点上的路径目录作为存储资源
- 目录需要为空,且挂载的磁盘容量需要满足pv请求资源的要求
- 如节点上没有所需的请求资源,则需要额外挂载磁盘
- pv的容量需要提前规划,详情可以先查看Create Tenant.volumes下的内容
- pv的数量取决于需要多少个volume
创建前需要根据需求替换pv.yaml文件中的name、storage、path、values字段的值
#创建pv资源
apiVersion: v1
kind: PersistentVolume
metadata:
name: node1-volume-01 #根据需求指定pv名称
spec:
capacity:
storage: 80Gi #根据需求修改存储大小
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: node-local-storage
local:
path: /minio/data1 #拥有volume的文件路径
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1 #选择拥有当前资源需求的节点
log_pv
创建5Gi的PV给tenant log服务所使用
#创建pv资源并根据实际需求修改log_pv.yaml文件name、path、values字段的值
apiVersion: v1
kind: PersistentVolume
metadata:
name: minio-log-pv #根据租户名称修改该值
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: minio-log-storage
local:
path: /minio/data1 #拥有volume的文件路径
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1 #选择拥有当前资源需求的节点
Create Tenant
租户需要和namespace进行绑定,然后在namespace下初始化minio集群,而这一整体被称之为一个租户(tenant)
volumes
创建租户前需要提前规划所需总容量以及volume个数(volume个数推荐>=4),可以根据总容量和volume个数来计算单个pv的容量,计算公式如下
**总容量 / 磁盘数量 = 单个PV的容量 **
提示:valume >= 4 才能拥有erasure code(纠删码)的功能
servers
根据集群实际规模或者servers配置来决定一个server绑定多少个volume
sample:
–servers 4 --volumes 4 则每个server绑定一个volume
–servers 2 --volumes 4 则每个server绑定两个volume
初始化minio集群
#创建名称空间
kubectl create ns <namespace>
#初始化租户(servers、volumes、capacity值根据实际需求进行填写)
kubectl minio tenant create <tenant-name> \
--servers 4 --volumes 4 \
--capacity 320Gi \ #320Gi为假设需要的存储资源,由于volumes为4,那么 320Gi / 4 即得出单个pv为80Gi,一共则需要4个80Gi的pv
--storage-class node-local-storage \
--audit-logs-storage-class minio-log-storage \
--namespace <namespace> \
--image reg.chebai.org/icospaas/minio/minio:RELEASE.2022-06-20T23-13-45Z \
--audit-logs-image reg.chebai.org/icospaas/minio/operator:v4.4.25 \
--audit-logs-pg-init-image reg.chebai.org/icospaas/minio/busybox:1.33.1 \
--audit-logs-pg-image reg.chebai.org/icospaas/minio/postgres:13
-
创建后会返回当前租户的根鉴权信息,需妥善保管
-
通过kubectl get svc -n <namespace> 查看svc信息,其中minio用于集群内应用所使用,console则用于web端管理,如需集群外访问,可基于ingress来实现
创建租户console ingress
#根据需求修改./ingress/tenant_minio_console.yaml中的namespace、host、nginx.ingress.kubernetes.io/proxy-body-size、service.name字段的值 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: console namespace: <namespace> annotations: nginx.ingress.kubernetes.io/proxy-body-size: <100m> nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/ssl-passthrough: "true" spec: ingressClassName: "nginx" rules: - host: <domain> http: paths: - backend: service: name: <svc_name> port: number: 9443 path: / pathType: Prefix
创建租户minio ingress
#根据需求修改namaspace、host、nginx.ingress.kubernetes.io/proxy-body-size字段的值 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: minio namespace: <namespace> annotations: nginx.ingress.kubernetes.io/proxy-body-size: <100m> nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/ssl-passthrough: "true" spec: ingressClassName: "nginx" rules: - host: <domain> http: paths: - backend: service: name: minio port: number: 443 path: / pathType: Prefix
测试
登录Operator console查看租户状态
#创建operator-console ingress,且根据需求修改ingress.yaml文件中host、nginx.ingress.kubernetes.io/proxy-body-size字段的值
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: console
namespace: minio-operator
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: <100m>
spec:
ingressClassName: "nginx"
rules:
- host: <domain>
http:
paths:
- backend:
service:
name: console
port:
number: 9090
path: /
pathType: Prefix
本地访问
#在访问客户端上增加hosts记录 || dns服务器增加解析记录
<address> <domain>
#获取console控制台token,获取到token后请及时终止该proxy
kubectl minio proxy -n minio-operator
通过域名访问operator console服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HXyE6RQa-1682316250106)(images/console.png)]
冒烟测试
minio-operator在初始化集群时是基于k8s的ca自签的证书且无法通过校验,所以mc操作租户minio时需要加上–insecure
#将mc工具添加至可搜寻路径并赋予执行权限
cp tools/mc /usr/local/sbin && chmod +x /usr/local/sbin/mc
#添加minio cluster信息(集群内endpoint为svc的地址、集群外endpoint则为ingress的域名)
mc alias set minio1 <endpoint> <key> <secretKey> --insecure
#创建bucket
mc mb minio1/test --insecure
#上传文件至test bucket
mc cp ./kubectl-minio minio1/test --insecure
#查看test bucket中的文件
mc ls minio1/test --insecure
清理
清理minio租户
kubectl minio tenant delete <tenent_name> -n <namespace>
清理minio-operator
kubectl minio delete
更多推荐
所有评论(0)