• minio集群部署(k8s内)


    一、前言

    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

    1. apiVersion: v1
    2. kind: PersistentVolume
    3. metadata:
    4. name: minio-pv0
    5. spec:
    6. storageClassName: minio-pv #指定动态存储卷的类型或类别,当pvc使用该类别时,可以自动绑定属于该类别的pv
    7. capacity:
    8. storage: 100Gi #存储大小
    9. accessModes:
    10. - ReadWriteOnce
    11. persistentVolumeReclaimPolicy: Retain #配置回收模式,配置为删除pv不自动删除存储路径中的数据
    12. nfs: #使用nfs存储
    13. path: /volume2/k8s-data/minio/minio-pv0 #nfs存储路径,这里使用4个不同的nfs路径,模拟4个单独的存储磁盘
    14. server: 10.1.13.99
    15. ---
    16. apiVersion: v1
    17. kind: PersistentVolume
    18. metadata:
    19. name: minio-pv1
    20. spec:
    21. storageClassName: minio-pv
    22. capacity:
    23. storage: 100Gi
    24. accessModes:
    25. - ReadWriteOnce
    26. persistentVolumeReclaimPolicy: Retain
    27. nfs:
    28. path: /volume2/k8s-data/minio/minio-pv1
    29. server: 10.1.13.99
    30. ---
    31. apiVersion: v1
    32. kind: PersistentVolume
    33. metadata:
    34. name: minio-pv2
    35. spec:
    36. storageClassName: minio-pv
    37. capacity:
    38. storage: 100Gi
    39. accessModes:
    40. - ReadWriteOnce
    41. persistentVolumeReclaimPolicy: Retain
    42. nfs:
    43. path: /volume2/k8s-data/minio/minio-pv2
    44. server: 10.1.13.99
    45. ---
    46. apiVersion: v1
    47. kind: PersistentVolume
    48. metadata:
    49. name: minio-pv3
    50. spec:
    51. storageClassName: minio-pv
    52. capacity:
    53. storage: 100Gi
    54. accessModes:
    55. - ReadWriteOnce
    56. persistentVolumeReclaimPolicy: Retain
    57. nfs:
    58. path: /volume2/k8s-data/minio/minio-pv3
    59. server: 10.1.13.99

    使用setafulset的方式部署minio集群,因为每个minio是有状态的应用,每个节点都存着数据,这里再说一下使用的是pvc模板的方式去绑定创建好的pv,也可以使用动态pv,使用pvc模板,然后去动态的自动创建pv绑定

    vi setafulset.yaml

    1. apiVersion: apps/v1
    2. kind: StatefulSet
    3. metadata:
    4. name: minio
    5. namespace: minio
    6. spec:
    7. podManagementPolicy: "Parallel" #并行启动pod,不配置的话模式是按顺序启动pod,minio、nacos都需要配置并行启动
    8. serviceName: minio #指定Headless Service的名称,这个服务的作用是为每个Pod创建一个独立的DNS记录,使其能够通过该DNS记录进行唯一标识和访问
    9. replicas: 4
    10. selector:
    11. matchLabels:
    12. app: minio
    13. template:
    14. metadata:
    15. labels:
    16. app: minio
    17. spec:
    18. affinity: #亲和性配置可忽略,我这里是为了分配到固定的节点上
    19. nodeAffinity:
    20. requiredDuringSchedulingIgnoredDuringExecution:
    21. nodeSelectorTerms:
    22. - matchExpressions:
    23. - key: app
    24. operator: In
    25. values:
    26. - minio
    27. containers:
    28. - name: minio
    29. image: minio/minio
    30. imagePullPolicy: IfNotPresent
    31. env: #配置变量,配置minio集群的账户密码,密码不能少于8位数
    32. - name: MINIO_ROOT_USER
    33. value: admin
    34. - name: MINIO_ROOT_PASSWORD
    35. value: 12345678
    36. args: #定义minio集群配置,定义每个节点
    37. - server
    38. - "http://minio-{0...3}.minio.minio.svc.cluster.local/data"
    39. # - "http://minio-{4...7}.minio.minio.svc.cluster.local/data"
    40. - --console-address
    41. - ":5000"
    42. ports:
    43. - name: tcp-9000
    44. containerPort: 9000
    45. protocol: TCP
    46. - name: http-5000
    47. containerPort: 5000
    48. protocol: TCP
    49. volumeMounts: #配置数据目录
    50. - name: data
    51. mountPath: /data
    52. tolerations: #配置污点,我这里是为了能在master节点上分配pod
    53. - key: node-role.kubernetes.io/control-plane
    54. operator: Exists
    55. effect: NoSchedule
    56. volumeClaimTemplates: #使用定义pvc模板,去自动创建pvc
    57. - metadata:
    58. name: data
    59. spec:
    60. accessModes: [ "ReadWriteOnce" ]
    61. storageClassName: "minio-pv" #配置存储类型的名称,这里配置和上面pv配置的名称一致,就会自动绑定关于此存储类型名称的pv
    62. resources:
    63. requests:
    64. storage: 100Gi

    配置service,使得外部能访问minio集群

    vi service.yaml

    1. kind: Service
    2. apiVersion: v1
    3. metadata:
    4. name: minio
    5. namespace: minio
    6. labels:
    7. app: minio
    8. spec:
    9. type: NodePort
    10. ports:
    11. - name: http-9000
    12. protocol: TCP
    13. port: 9000
    14. nodePort: 30004
    15. targetPort: 9000
    16. - name: http-5000
    17. protocol: TCP
    18. port: 5000
    19. nodePort: 30002
    20. targetPort: 5000
    21. selector:
    22. 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

    1. apiVersion: v1 #在之前的pv配置后面加上以下pv配置
    2. kind: PersistentVolume
    3. metadata:
    4. name: minio-pv4
    5. spec:
    6. storageClassName: minio-pv #定义了存储类型
    7. capacity:
    8. storage: 100Gi
    9. accessModes:
    10. - ReadWriteOnce
    11. persistentVolumeReclaimPolicy: Retain
    12. nfs:
    13. path: /volume2/k8s-data/minio/minio-pv4
    14. server: 10.1.13.99
    15. ---
    16. apiVersion: v1
    17. kind: PersistentVolume
    18. metadata:
    19. name: minio-pv5
    20. spec:
    21. storageClassName: minio-pv #定义了存储类型
    22. capacity:
    23. storage: 100Gi
    24. accessModes:
    25. - ReadWriteOnce
    26. persistentVolumeReclaimPolicy: Retain
    27. nfs:
    28. path: /volume2/k8s-data/minio/minio-pv5
    29. server: 10.1.13.99
    30. ---
    31. apiVersion: v1
    32. kind: PersistentVolume
    33. metadata:
    34. name: minio-pv6
    35. spec:
    36. storageClassName: minio-pv #定义了存储类型
    37. capacity:
    38. storage: 100Gi
    39. accessModes:
    40. - ReadWriteOnce
    41. persistentVolumeReclaimPolicy: Retain
    42. nfs:
    43. path: /volume2/k8s-data/minio/minio-pv6
    44. server: 10.1.13.99
    45. ---
    46. apiVersion: v1
    47. kind: PersistentVolume
    48. metadata:
    49. name: minio-pv7
    50. spec:
    51. storageClassName: minio-pv #定义了存储类型
    52. capacity:
    53. storage: 100Gi
    54. accessModes:
    55. - ReadWriteOnce
    56. persistentVolumeReclaimPolicy: Retain
    57. nfs:
    58. path: /volume2/k8s-data/minio/minio-pv7
    59. server: 10.1.13.99

    vi setafulset

    1. apiVersion: apps/v1
    2. kind: StatefulSet
    3. metadata:
    4. name: minio
    5. namespace: minio
    6. spec:
    7. podManagementPolicy: "Parallel" #平行启动pod,不配置的话模式是按顺序启动pod
    8. serviceName: minio
    9. replicas: 8 #更改pod数量
    10. selector:
    11. matchLabels:
    12. app: minio
    13. template:
    14. metadata:
    15. labels:
    16. app: minio
    17. spec:
    18. affinity:
    19. nodeAffinity:
    20. requiredDuringSchedulingIgnoredDuringExecution:
    21. nodeSelectorTerms:
    22. - matchExpressions:
    23. - key: app
    24. operator: In
    25. values:
    26. - minio
    27. containers:
    28. - name: minio
    29. image: minio/minio
    30. imagePullPolicy: IfNotPresent
    31. env:
    32. - name: MINIO_ROOT_USER
    33. value: admin
    34. - name: MINIO_ROOT_PASSWORD
    35. value: Zyh@022759
    36. args:
    37. - server
    38. - "http://minio-{0...3}.minio.minio.svc.cluster.local/data"
    39. - "http://minio-{4...7}.minio.minio.svc.cluster.local/data" #增加minio集群配置
    40. - --console-address
    41. - ":5000"
    42. ports:
    43. - name: tcp-9000
    44. containerPort: 9000
    45. protocol: TCP
    46. - name: http-5000
    47. containerPort: 5000
    48. protocol: TCP
    49. volumeMounts:
    50. - name: data
    51. mountPath: /data
    52. tolerations:
    53. - key: node-role.kubernetes.io/control-plane
    54. operator: Exists
    55. effect: NoSchedule
    56. volumeClaimTemplates:
    57. - metadata:
    58. name: data
    59. spec:
    60. accessModes: [ "ReadWriteOnce" ]
    61. storageClassName: "minio-pv"
    62. resources:
    63. requests:
    64. storage: 100Gi

    执行yaml文件加载配置

    kubectl apply -f pv.yaml

    kubectl apply -f setafulset.yaml

    执行完成后minio集群就会扩容成8节点集群,关于数据会随机分配到两部分节点上存储,可以自行做实验验证

  • 相关阅读:
    Jmeter 性能测试工具使用
    mysql调优
    数据结构与算法笔记:基础篇 - 初始动态规划:如何巧妙解决“双十一”购物时的凑单问题?
    C(结构体指针、利用结构体指针偏移获取数据)
    【Flask 系统教程 7】数据库使用 SQLAlchemy
    python+java病人跟踪治疗管理系统#计算机毕业设计源码
    java练习 day5
    了解这几点,让你轻松掌握滑台模组的选型方法!
    The sorting algorithm including selection, bubble, and insertion
    2022最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)
  • 原文地址:https://blog.csdn.net/ApexPredator/article/details/134515041