• k8s--基础--28.5--ceph--k8s对接ceph rbd


    k8s–基础–28.5–ceph–k8s对接ceph rbd


    1、介绍

    1.1、kubernetes支持的后端存储接口

    在这里插入图片描述

    1.2、kubernetes pv和pvc绑定流程

    1. 创建pv:pv需要指定后端存储类型
    2. 创建pvc:指定需要的资源
    3. pvc和pv绑定
    4. pod挂载pvc实现持久化存储

    1.3、kubernetes storageclass存储类动态生成pv流程

    1. 创建storageclass(sc)
    2. pvc请求已经创建的sc,通过sc来自动创建pv,达到通过sc动态生成一个pv的效果

    2、公共操作

    2.1、配置master1-admin节点到master1,node1节点的无密码登陆

    在 master1-admin上操作

    2.1.1、配置hosts文件

    cat >> /etc/hosts  <
    • 1
    • 2
    • 3
    • 4
    • 5

    2.1.2、生成加密信息

    以前的操作,我们已经做过,这里就不执行了

    cd 
    ssh-keygen -t rsa
    
    • 1
    • 2

    一直回车就可以

    2.1.3、将公钥复制到对应的节点上

    ssh-copy-id -i .ssh/id_rsa.pub root@master1
    ssh-copy-id -i .ssh/id_rsa.pub root@node1
    
    • 1
    • 2

    2.2、将ceph配置文件拷贝到各个k8s的节点

    在master1-admin(ceph的管理节点)上操作

    # 在node1,master1节点上创建目录
    mkdir -p /etc/ceph/
    
    # 拷贝 ceph配置文件到各个k8s的节点
    scp  -r /etc/ceph/* node1:/etc/ceph/
    scp  -r /etc/ceph/*  master1:/etc/ceph/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.3、每个k8s的节点安装ceph-common

    kubernetes要想使用ceph,需要在k8s的每个节点安装ceph-common

    2.3.1、把ceph节点上的ceph.repo文件拷贝到k8s各个节点上

    在master1-admin节点操作

    scp  -r /etc/yum.repos.d/ceph.repo  node1:/etc/yum.repos.d/
    scp  -r /etc/yum.repos.d/ceph.repo  master1:/etc/yum.repos.d/
    
    • 1
    • 2

    2.3.2、安装ceph-common

    每个节点安装ceph-common

    # 更新yum源
    yum update -y
    # 安装ceph-common
    yum install -y ceph-common
    
    • 1
    • 2
    • 3
    • 4

    3、测试–创建的pod直接挂载ceph rbd

    3.1、创建ceph rbd

    在master1-admin(ceph的管理节点)上操作

    # 创建一个pool,名称是k8srbd
    ceph osd pool create k8srbd 256
    
    # 在k8srbd中创建rbd,名称是rbda,大小为1024
    rbd create rbda -s 1024 -p k8srbd
    
    # 需要禁用,否则挂载不成功
    rbd feature disable  k8srbd/rbda object-map fast-diff deep-flatten
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.2、测试pod直接挂载刚才创建的ceph rbd

    在master1上操作

    3.2.1、脚本

    # 创建对应的目录
    mkdir -p  /root/ceph/
    
    vi   /root/ceph/pod-test.yaml
    
    • 1
    • 2
    • 3
    • 4

    内容

    apiVersion: v1
    kind: Pod
    metadata:
      name: testrbd
    spec:
      containers:
        - image: nginx
          name: nginx
          volumeMounts:
          # 引用数据卷
          - name: testrbd
            mountPath: /mnt
      # 定义数据卷
      volumes:
        # 定义名称
        - name: testrbd
        # 类型是rbd
          rbd:
            #  rbd监控节点,如果有多个,就写多个
            monitors:
            - '192.168.187.157:6789'
            # pool的名称
            pool: k8srbd
            # rbd的名称
            image: rbda
            # rdb要格式化为xfs文件系统
            fsType: xfs
            # 非只读
            readOnly: false
            # 用户是admin,因为我们是拷贝master1-admin的配置信息
            user: admin
            # 秘钥,因为我们是拷贝master1-admin的配置信息
            keyring: /etc/ceph/ceph.client.admin.keyring
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    3.4.2、执行

    kubectl apply -f /root/ceph/pod-test.yaml
    
    # 查看
    kubectl get pods 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    4、基于ceph rbd创建pv,pvc

    4.1、获取client.admin的keyring值

    1. 获取client.admin的keyring值,并用base64编码,我们使用这个值来创建k8s secret对象
      1. 可以认为client.admin就是访问ceph管理节点的token
    2. 在master1-admin(ceph管理节点)操作
    ceph auth get-key client.admin | base64
    # 内容如下
    # QVFEcmtkNWlGYTBqQVJBQUhvY1VPR05WUFFGbFdUTmxiUmdObEE9PQ==
    
    • 1
    • 2
    • 3

    4.2、创建ceph的secret

    1. 这个secre 用于k8s volume插件访问ceph集群
    2. 在k8s的master1上操作

    4.2.1、脚本

    # 创建对应的目录
    mkdir -p  /root/ceph/
    
    vi   /root/ceph/ceph-secret.yaml
    
    • 1
    • 2
    • 3
    • 4

    内容

    apiVersion: v1
    kind: Secret
    metadata:
      name: ceph-secret
    data:
      # 相当于定义访问ceph集群的token
      key: QVFEcmtkNWlGYTBqQVJBQUhvY1VPR05WUFFGbFdUTmxiUmdObEE9PQ==
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.2.2、执行

    kubectl apply -f /root/ceph/ceph-secret.yaml
    
    # 查看
    kubectl get Secret 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    4.3、创建pool池

    在master1-admin(ceph的管理节点)上操作

    # 创建一个pool,名称是k8stest
    ceph osd pool create k8stest 256
    
    # 在k8stest中创建rbd,名称是rbda,大小为1024
    rbd create rbda -s 1024 -p k8stest
    
    # 需要禁用,否则挂载不成功
    rbd feature disable  k8stest/rbda object-map fast-diff deep-flatten
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4.4、创建ceph pv

    1. 在k8s的master1上操作

    4.4.1、脚本

    # 创建对应的目录
    mkdir -p  /root/ceph/
    
    vi   /root/ceph/pv.yaml
    
    • 1
    • 2
    • 3
    • 4

    内容

    apiVersion: v1
    kind: PersistentVolume
    metadata:
        # 定义pv的名称
        name: ceph-pv
    spec:
        # 定义PV的资源
        capacity:
            storage: 1Gi
        # 定义pv的访问模式为:单节点读写
        accessModes:
            - ReadWriteOnce
        # 定义存储卷回收策略
        persistentVolumeReclaimPolicy: Recycle
        # 使用rbd来定义pv
        rbd:
            # rbd监控节点,如果有多个,就写多个
            monitors:
              - 192.168.187.157:6789
            # pool的名称
            pool: k8stest
            # rbd的名称
            image: rbda
            # 用户是admin,因为我们是拷贝master1-admin的配置信息
            user: admin
            # 要使用的secret,相当于使用哪个token去访问rbd
            secretRef:
              name: ceph-secret
            # rdb要格式化为xfs文件系统
            fsType: xfs
            # 非只读
            readOnly: false 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    4.4.2、执行

    kubectl apply -f  /root/ceph/pv.yaml
    
    # 查看
    kubectl get pv 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    4.5、创建ceph pvc

    1. 在k8s的master1上操作

    4.5.1、脚本

    # 创建对应的目录
    mkdir -p  /root/ceph/
    
    vi   /root/ceph/pvc.yaml
    
    • 1
    • 2
    • 3
    • 4

    内容

    kind: PersistentVolumeClaim 
    apiVersion: v1 
    metadata:   
        # 定义pvc的名称
        name: ceph-pvc 
    spec:   
        # 定义pvc的访问模式为:单节点读写
        accessModes:     
            - ReadWriteOnce   
        # 定义要使用的资源
        resources:     
            requests:       
                storage: 1Gi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.5.2、执行

    kubectl apply -f /root/ceph/pvc.yaml
    
    # 查看
    kubectl get pvc 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    可以看到pvc已经和pv进行绑定了,对应的pv名称为ceph-pv

    4.6、挂载使用

    在master1上操作

    4.6.1、脚本

    # 创建对应的目录
    mkdir -p  /root/ceph/
    
    vi   /root/ceph/pod.yaml
    
    • 1
    • 2
    • 3
    • 4

    内容

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 1 # tells deployment to run 2 pods matching the template
        # 选择器
      selector:
        # 选择器匹配的标签
        matchLabels:
          app: nginx
      template: # create pods using pod definition in this template
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.7.9
            ports:
            - containerPort: 80
            # 引用的数据卷
            volumeMounts:
              - mountPath: "/ceph-data"
                name: ceph-data
          # 定义数据卷
          volumes:
          # 数据卷名称
          - name: ceph-data
            # 定义使用哪个pvc
            persistentVolumeClaim:
                # pvc的名称
                claimName: ceph-pvc
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    4.6.2、执行

    kubectl apply -f /root/ceph/pod.yaml
    
    # 查看
    kubectl get pods 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    如果是running则运行正常

    5、基于storageclass生成pv

    参考资料

    https://github.com/kubernetes-incubator/external-storage/tree/master/ceph/rbd/deploy/rbac
    
    • 1

    5.1、创建rbd的provisioner

    1. 在master1上操作
    2. 创建一个storageclass的供应商

    5.1.1、脚本

    vi   /root/ceph/rbd-provisioner.yaml
    
    • 1

    内容

    
    
    # 创建sa账号,名称为rbd-provisioner
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: rbd-provisioner
    ---------
    
    # rabc授权
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: rbd-provisioner
    rules:
      - apiGroups: [""]
        resources: ["persistentvolumes"]
        verbs: ["get", "list", "watch", "create", "delete"]
      - apiGroups: [""]
        resources: ["persistentvolumeclaims"]
        verbs: ["get", "list", "watch", "update"]
      - apiGroups: ["storage.k8s.io"]
        resources: ["storageclasses"]
        verbs: ["get", "list", "watch"]
      - apiGroups: [""]
        resources: ["events"]
        verbs: ["create", "update", "patch"]
      - apiGroups: [""]
        resources: ["services"]
        resourceNames: ["kube-dns","coredns"]
        verbs: ["list", "get"]
      - apiGroups: [""]
        resources: ["endpoints"]
        verbs: ["get", "list", "watch", "create", "update", "patch"]
    ----------
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: rbd-provisioner
    subjects:
      - kind: ServiceAccount
        name: rbd-provisioner
        namespace: default
    roleRef:
      kind: ClusterRole
      name: rbd-provisioner
      apiGroup: rbac.authorization.k8s.io
    ---------
    
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: rbd-provisioner
    rules:
    - apiGroups: [""]
      resources: ["secrets"]
      verbs: ["get"]
    - apiGroups: [""]
      resources: ["endpoints"]
      verbs: ["get", "list", "watch", "create", "update", "patch"]
    ---------
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: rbd-provisioner
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: rbd-provisioner
    subjects:
    - kind: ServiceAccount
      name: rbd-provisioner
      namespace: default
      
    ---------
    
    # 部署pod
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: rbd-provisioner
    spec:
      replicas: 1
      # 标签选择器
      selector:
        # 选择器匹配的标签
        matchLabels:
          app: rbd-provisioner
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: rbd-provisioner
        spec:
          containers:
          - name: rbd-provisioner
            image: "quay.io/external_storage/rbd-provisioner:latest"
            env:
            - name: PROVISIONER_NAME
              # 供应商地址
              value: ceph.com/rbd
          serviceAccount: rbd-provisioner
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105

    5.1.2、执行

    kubectl apply -f /root/ceph/rbd-provisioner.yaml
    
    # 查看
    kubectl get pods 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    5.2、创建ceph-secret

    4.2、中,我们有创建ceph的secret,这里我们需要删掉,再重新建

    kubectl delete -f /root/ceph/ceph-secret.yaml
    
    
    • 1
    • 2

    5.2.1、脚本

    vi   /root/ceph/ceph-secret.yaml
    
    • 1

    内容

    apiVersion: v1
    kind: Secret
    metadata:
      name: ceph-secret
    type: "ceph.com/rbd"
    data:
      key: QVFEcmtkNWlGYTBqQVJBQUhvY1VPR05WUFFGbFdUTmxiUmdObEE9PQ==
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5.2.2、执行

    kubectl apply -f /root/ceph/ceph-secret.yaml
    
    # 查看
    kubectl get Secret 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    5.3、创建storageclass

    5.3.1、脚本

    vi   /root/ceph/storageclass.yaml
    
    • 1

    内容

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      # 存储类名称
      name: k8s-rbd
    # 存储类供应商
    provisioner: ceph.com/rbd
    # 参数
    parameters:
      #  rbd监控节点,如果有多个,就写多个
      monitors: 192.168.187.157:6789
      # adminid 是admin,因为我们是拷贝master1-admin的配置信息
      adminId: admin
      # 使用访问ceph集群的token
      adminSecretName: ceph-secret
      pool: k8stest
      # userId 是admin,因为我们是拷贝master1-admin的配置信息
      userId: admin
      # 使用访问ceph集群的token
      userSecretName: ceph-secret
      # rdb要格式化为xfs文件系统
      fsType: xfs
      # rbd 的格式
      imageFormat: "2"
      # rbd 的特性
      imageFeatures: "layering"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    5.3.2、执行

    kubectl apply -f /root/ceph/storageclass.yaml
    
    # 查看
    kubectl get sc 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    5.4、创建pvc

    5.4.1、脚本

    vi   /root/ceph/rbd-pvc.yaml
    
    • 1

    内容

    
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: rbd-pvc
    spec:
      # 访问模式:读写单节点
      accessModes:
        - ReadWriteOnce
      # 卷模式:文件系统
      volumeMode: Filesystem
      # 资源设置
      resources:
        requests:
          storage: 1Gi
      # 使用的存储类是k8s-rbd
      storageClassName: k8s-rbd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    5.4.2、执行

    kubectl apply -f /root/ceph/rbd-pvc.yaml
    
    # 查看
    kubectl get pvc  
    kubectl get pv  
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    5.5、创建pod

    测试:使用pvc来创建pod

    5.5.1、脚本

    vi   /root/ceph/pod-sto.yaml
    
    • 1

    内容

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        test: rbd-pod
      name: ceph-rbd-pod
    spec:
      containers:
      - name: ceph-rbd-nginx
        image: nginx
        volumeMounts:
        - name: ceph-rbd
          mountPath: /mnt
          readOnly: false
      # 定义存储卷
      volumes:
      - name: ceph-rbd
        # 定义要使用哪个pvc
        persistentVolumeClaim:
          claimName: rbd-pvc
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    5.5.2、执行

    kubectl apply -f /root/ceph/pod-sto.yaml
    
    # 查看
    kubectl get pods 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    6、创建statefulset,动态生成存储

    需要完成上面的第(2)、(3)、(4)、(5)、(6)步

    6.1、脚本

    vi /root/ceph/statefulset-storage.yaml
    
    • 1

    内容

    apiVersion: v1
    kind: Service
    metadata:
      # Service 名称
      name: storage
      # Service 标签
      labels:
        la: storage
    spec:
      # Service 端口
      ports:
      - port: 80
        name: nginx-port
      clusterIP: None
      # 选择器匹配的标签
      selector:
        la: nginx
    ---
    
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      # StatefulSet的名称
      name: storage
    spec:
      # 使用名称为storage的service
      serviceName: "storage"
      replicas: 2
      # 选择器
      selector:
        # 选择器匹配的标签
        matchLabels:
          la: nginx
      # 定义模板
      template:
        metadata:
          labels:
            la: nginx
        # 定义容器
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
              name: nginx-port
            # 定义挂载
            volumeMounts:
              # 使用 存储卷模板名称
            - name: www
              # 定义挂载点
              mountPath: /usr/share/nginx/html
      # 定义存储卷模板
      volumeClaimTemplates:
      - metadata:
          # 存储卷模板名称
          name: www
        spec:
            # 定义pvc的访问模式
            accessModes: [ "ReadWriteOnce" ]
            # 卷模式:文件系统
            volumeMode: Filesystem
            # 使用哪个存储类
            storageClassName: k8s-rbd
            # 定义pvc的大小
            resources:
              requests:
                storage: 1G
     
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70

    6.2、执行

    kubectl apply -f /root/ceph/statefulset-storage.yaml
     
    
    • 1
    • 2

    执行上面命令后,会自动生成pv和pvc,且完成pvc和pv的绑定

    6.3、查看

    kubectl  get pvc
    kubectl  get pv
    
    kubectl get svc  
    kubectl  get StatefulSet
    kubectl  get pods
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    echarts-雷达图和仪表图
    redis(0)-安装实操
    celery命令参数详解及在django中的用法
    热量衡算习题课
    如何训练Embedding Model
    ClickHouse(03)ClickHouse怎么安装和部署
    前端轻量级数据库mongodb
    11、综合应用案例
    操作系统——信号量机制(王道视频p30、课本ch6)
    C++二叉树
  • 原文地址:https://blog.csdn.net/zhou920786312/article/details/126244863