一、前言
minio的部署有幾種方式,分別是單節點單磁盤,單節點多磁盤,多節點多磁盤三種方式,本次部署使用多節點多磁盤的方式進行部署,minio集群多節點部署最低要求需要4個節點,集群擴容時也是要求擴容的節點為4的倍數才能更好的發揮minio的性能,使用minio集群可以更好的實現高可用,在minio集群還有n/2節點存活時minio集群依然可讀但不可寫,在minio集群還有n/2+1節點存活時minio集群依然可讀可寫
二、部署
創建minio 服務yaml文件的存儲目錄
mkdir /opt/minio? && cd /opt/minio
這里使用nfs作為minio的存儲,其實最好還是單獨掛載磁盤作為minio的存儲更好,用nfs作為minio的存儲,相當于存儲還是有單點的問題,單獨掛載磁盤可以在k8s的每個工作節點分配磁盤的存儲路徑再使用pv作為存儲塊,這樣就能避免存儲的單點問題,這里就是用nfs網絡存儲作為pv存儲塊的存儲
vi pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-pv0
spec:storageClassName: minio-pv #指定動態存儲卷的類型或類別,當pvc使用該類別時,可以自動綁定屬于該類別的pvcapacity:storage: 100Gi #存儲大小accessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retain #配置回收模式,配置為刪除pv不自動刪除存儲路徑中的數據nfs: #使用nfs存儲path: /volume2/k8s-data/minio/minio-pv0 #nfs存儲路徑,這里使用4個不同的nfs路徑,模擬4個單獨的存儲磁盤server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-pv1
spec:storageClassName: minio-pv capacity:storage: 100GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:path: /volume2/k8s-data/minio/minio-pv1server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-pv2
spec:storageClassName: minio-pv capacity:storage: 100GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:path: /volume2/k8s-data/minio/minio-pv2server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-pv3
spec:storageClassName: minio-pv capacity:storage: 100GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:path: /volume2/k8s-data/minio/minio-pv3server: 10.1.13.99
使用setafulset的方式部署minio集群,因為每個minio是有狀態的應用,每個節點都存著數據,這里再說一下使用的是pvc模板的方式去綁定創建好的pv,也可以使用動態pv,使用pvc模板,然后去動態的自動創建pv綁定
vi setafulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:name: minionamespace: minio
spec:podManagementPolicy: "Parallel" #并行啟動pod,不配置的話模式是按順序啟動pod,minio、nacos都需要配置并行啟動serviceName: minio #指定Headless Service的名稱,這個服務的作用是為每個Pod創建一個獨立的DNS記錄,使其能夠通過該DNS記錄進行唯一標識和訪問replicas: 4selector:matchLabels:app: miniotemplate:metadata:labels:app: miniospec:affinity: #親和性配置可忽略,我這里是為了分配到固定的節點上nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: appoperator: Invalues:- miniocontainers:- name: minioimage: minio/minioimagePullPolicy: IfNotPresentenv: #配置變量,配置minio集群的賬戶密碼,密碼不能少于8位數- name: MINIO_ROOT_USERvalue: admin- name: MINIO_ROOT_PASSWORDvalue: 12345678args: #定義minio集群配置,定義每個節點- server- "http://minio-{0...3}.minio.minio.svc.cluster.local/data"# - "http://minio-{4...7}.minio.minio.svc.cluster.local/data"- --console-address- ":5000"ports:- name: tcp-9000containerPort: 9000protocol: TCP- name: http-5000containerPort: 5000protocol: TCPvolumeMounts: #配置數據目錄- name: datamountPath: /datatolerations: #配置污點,我這里是為了能在master節點上分配pod- key: node-role.kubernetes.io/control-planeoperator: Existseffect: NoSchedulevolumeClaimTemplates: #使用定義pvc模板,去自動創建pvc- metadata:name: dataspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "minio-pv" #配置存儲類型的名稱,這里配置和上面pv配置的名稱一致,就會自動綁定關于此存儲類型名稱的pvresources:requests:storage: 100Gi
配置service,使得外部能訪問minio集群
vi service.yaml
kind: Service
apiVersion: v1
metadata:name: minionamespace: miniolabels:app: minio
spec:type: NodePortports:- name: http-9000protocol: TCPport: 9000nodePort: 30004targetPort: 9000- name: http-5000protocol: TCPport: 5000nodePort: 30002targetPort: 5000selector:app: minio
創建命名空間
kubectl create namespace minio
創建各yaml服務
kubectl apply -f pv.yaml
kubectl apply -f setafulset.yaml
kubectl apply -f service.yaml
查看各服務是否正常
kubectl get all -n minio
kubectl get pv?
?
kubectl get pvc -n minio
?查看minio web
http://10.1.60.119:30002
輸入配置setafulset時定義的用戶名和密碼
?
可以看到minio集群顯示4個節點均正常
?
?創建bucket上傳文件后進行節點損壞實驗
?
這里就不展示實驗的過程了, 直接講述實驗的結果,本minio集群一共四個節點,當存活節點只剩下n/2時即2個節點,minio的bucket只能讀取文件,不能上傳文件,當存活節點剩下n/2+1時,minio的bucket可以進行正常的讀取文件、上傳文件,可以自行做實驗嘗試
注意:minio集群部署后如果刪除了pvc和pv重新創建,會導致pod重新隨機綁定一個pvc和pv,pod隨機綁定pvc后minio集群會出現問題,會報錯掛載磁盤信息不正確,如果要解決的話,需要刪除該pv掛載路徑下原來的數據,所以一般不要動pvc和pv,因為setafulset的特性只刪除pod,pod會自動綁定原來的pvc,即使把整個setafulset刪除重新創建也是會綁定原來的pvc,就不會導致集群出現問題
minio集群節點對等擴容
minio集群的擴容需要提前創建好需要擴容的pv個數,再更改setafulset配置,關于minio的擴容需要是4的倍數,這樣才能更好的發揮minio集群的特性以便最好地利用 Erasure Code,并提供最佳的冗余和容錯性,這是因為 Erasure Code 將數據分為數據塊和冗余塊,并將它們分布在不同的節點上,確保了數據的可靠性和冗余,另外使用對等擴容后,minio的集群原來的節點和新加入的加點會分成兩部分,兩部分不互相同步數據,當數據上傳到bucket時,minio會根據算法去判斷該數據存在哪一部分節點上
vi pv.yaml
apiVersion: v1 #在之前的pv配置后面加上以下pv配置
kind: PersistentVolume
metadata:name: minio-pv4
spec:storageClassName: minio-pv #定義了存儲類型capacity:storage: 100GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:path: /volume2/k8s-data/minio/minio-pv4server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-pv5
spec:storageClassName: minio-pv #定義了存儲類型capacity:storage: 100GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:path: /volume2/k8s-data/minio/minio-pv5server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-pv6
spec:storageClassName: minio-pv #定義了存儲類型capacity:storage: 100GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:path: /volume2/k8s-data/minio/minio-pv6server: 10.1.13.99
---
apiVersion: v1
kind: PersistentVolume
metadata:name: minio-pv7
spec:storageClassName: minio-pv #定義了存儲類型capacity:storage: 100GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:path: /volume2/k8s-data/minio/minio-pv7server: 10.1.13.99
vi setafulset
apiVersion: apps/v1
kind: StatefulSet
metadata:name: minionamespace: minio
spec:podManagementPolicy: "Parallel" #平行啟動pod,不配置的話模式是按順序啟動podserviceName: minioreplicas: 8 #更改pod數量selector:matchLabels:app: miniotemplate:metadata:labels:app: miniospec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: appoperator: Invalues:- miniocontainers:- name: minioimage: minio/minioimagePullPolicy: IfNotPresentenv:- name: MINIO_ROOT_USERvalue: admin- name: MINIO_ROOT_PASSWORDvalue: Zyh@022759args:- server- "http://minio-{0...3}.minio.minio.svc.cluster.local/data"- "http://minio-{4...7}.minio.minio.svc.cluster.local/data" #增加minio集群配置- --console-address- ":5000"ports:- name: tcp-9000containerPort: 9000protocol: TCP- name: http-5000containerPort: 5000protocol: TCPvolumeMounts:- name: datamountPath: /datatolerations:- key: node-role.kubernetes.io/control-planeoperator: Existseffect: NoSchedulevolumeClaimTemplates:- metadata:name: dataspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "minio-pv"resources:requests:storage: 100Gi
執行yaml文件加載配置
kubectl apply -f pv.yaml
kubectl apply -f setafulset.yaml
執行完成后minio集群就會擴容成8節點集群,關于數據會隨機分配到兩部分節點上存儲,可以自行做實驗驗證