前提条件:已经部署好ceph集群

本次实验由于环境有限,ceph集群是部署在k8s的master节点上的

一、创建ceph存储池

在ceph集群的mon节点上执行以下命令:

  1. ceph osd pool create k8s-volumes 64 64

查看下副本数

  1. [root@master ceph]# ceph osd pool get k8s-volumes size
  2. size:

pg的设置参照以下公式:

  1. Total PGs = ((Total_number_of_OSD * ) / max_replication_count) / pool_count

结算的结果往上取靠近2的N次方的值。比如总共OSD数量是2,复制份数3,pool数量也是1,那么按上述公式计算出的结果是66.66。取跟它接近的2的N次方是64,那么每个pool分配的PG数量就是64。

二、在k8s的所有节点上安装ceph-common

1、配置国内 yum源地址、ceph源地址

  1. cp -r /etc/yum.repos.d/ /etc/yum-repos-d-bak
  2. yum install -y wget
  3. rm -rf /etc/yum.repos.d/*
  4. wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  5. wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
  6. yum clean all
  7. yum makecache
  1. cat <<EOF > /etc/yum.repos.d/ceph.repo
  2. [ceph]
  3. name=Ceph packages
  4. baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/x86_64/
  5. enabled=
  6. gpgcheck=
  7. priority=
  8. type=rpm-md
  9. gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
  10.  
  11. [ceph-noarch]
  12. name=Ceph noarch packages
  13. baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch
  14. enabled=
  15. gpgcheck=
  16. priority=
  17. type=rpm-md
  18. gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
  19.  
  20. [ceph-source]
  21. name=Ceph source packages
  22. baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/SRPMS
  23. enabled=
  24. gpgcheck=
  25. type=rpm-md
  26. gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
  27. priority=
  28. EOF

2、安装ceph-common

  1. yum -y install ceph-common

3、将ceph的mon节点的配置文件/etc/ceph/ceph.conf 放到所有k8s节点的/etc/ceph目录下

4、将ceph的mon节点的文件 /etc/ceph/ceph.client.admin.keyring 放到所有k8s节点的/etc/ceph目录下

三、以rbac方式对接ceph

由于是用kubeadm部署的k8s集群,kube-controller-manager是以容器方式运行的,里面并没有ceph-common,所以采用 扩展存储卷插件 的方式来实现。

简单说一下,这里提供 rbac 和 no-rbac 两种方式,这里因为我们搭建的 k8s 集群时开启了 rbac 认证的,所以这里采用 rbac 方式来创建该 deployment。

1、下载插件镜像:(本人已经将其上传到阿里云的镜像仓库了)

  1. docker pull registry.cn-hangzhou.aliyuncs.com/boshen-ns/rbd-provisioner:v1.

2、创建/root/k8s-ceph-rbac/serviceaccount.yaml

  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. name: rbd-provisioner

3、创建/root/k8s-ceph-rbac/clusterrole.yaml

  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. name: rbd-provisioner
  5. [root@master k8s-ceph-rbac]# vim clusterrole.yaml
  6. [root@master k8s-ceph-rbac]# cat clusterrole.yaml
  7. kind: ClusterRole
  8. apiVersion: rbac.authorization.k8s.io/v1
  9. metadata:
  10. name: rbd-provisioner
  11. rules:
  12. - apiGroups: [""]
  13. resources: ["persistentvolumes"]
  14. verbs: ["get", "list", "watch", "create", "delete"]
  15. - apiGroups: [""]
  16. resources: ["persistentvolumeclaims"]
  17. verbs: ["get", "list", "watch", "update"]
  18. - apiGroups: ["storage.k8s.io"]
  19. resources: ["storageclasses"]
  20. verbs: ["get", "list", "watch"]
  21. - apiGroups: [""]
  22. resources: ["events"]
  23. verbs: ["list", "watch", "create", "update", "patch"]
  24. - apiGroups: [""]
  25. resources: ["services"]
  26. resourceNames: ["kube-dns","coredns"]
  27. verbs: ["list", "get"]
  28. - apiGroups: [""]
  29. resources: ["endpoints"]
  30. verbs: ["get", "list", "watch", "create", "update", "patch"]
  31. - apiGroups: [""]
  32. resources: ["secrets"]
  33. verbs: ["get", "create", "delete"]

4、创建/root/k8s-ceph-rbac/clusterrolebinding.yaml

  1. kind: ClusterRoleBinding
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. name: rbd-provisioner
  5. subjects:
  6. - kind: ServiceAccount
  7. name: rbd-provisioner
  8. namespace: default
  9. roleRef:
  10. kind: ClusterRole
  11. name: rbd-provisioner
  12. apiGroup: rbac.authorization.k8s.io

5、创建/root/k8s-ceph-rbac/role.yaml

  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: Role
  3. metadata:
  4. name: rbd-provisioner
  5. rules:
  6. - apiGroups: [""]
  7. resources: ["secrets"]
  8. verbs: ["get"]
  9. - apiGroups: [""]
  10. resources: ["endpoints"]
  11. verbs: ["get", "list", "watch", "create", "update", "patch"]

6、创建/root/k8s-ceph-rbac/rolebinding.yaml

  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: RoleBinding
  3. metadata:
  4. name: rbd-provisioner
  5. roleRef:
  6. apiGroup: rbac.authorization.k8s.io
  7. kind: Role
  8. name: rbd-provisioner
  9. subjects:
  10. - kind: ServiceAccount
  11. name: rbd-provisioner
  12. namespace: default

7、创建/root/k8s-ceph-rbac/deployment.yaml

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: rbd-provisioner
  5. spec:
  6. replicas:
  7. strategy:
  8. type: Recreate
  9. template:
  10. metadata:
  11. labels:
  12. app: rbd-provisioner
  13. spec:
  14. containers:
  15. - name: rbd-provisioner
  16. image: registry.cn-hangzhou.aliyuncs.com/boshen-ns/rbd-provisioner:v1.
  17. imagePullPolicy: Never
  18. env:
  19. - name: PROVISIONER_NAME
  20. value: ceph.com/rbd
  21. serviceAccount: rbd-provisioner

8、创建/root/k8s-ceph-rbac/ceph-secret.yaml

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

上面key的值用以下方式查看:

  1. [root@master ~]# grep key /etc/ceph/ceph.client.admin.keyring |awk '{printf "%s", $NF}'|base64
  2. QVFDQmRvbGNxSHlaQmhBQW45WllIbCtVd2JrTnlPV0xseGQ4RUE9PQ==

9、创建/root/k8s-ceph-rbac/ceph-storageclass.yaml

  1. apiVersion: storage.k8s.io/v1
  2. kind: StorageClass
  3. metadata:
  4. name: ceph-storage-class
  5. provisioner: ceph.com/rbd
  6. parameters:
  7. #monitors: 192.168.137.10:
  8. monitors: ceph-mon-1.default.svc.cluster.local.:6789
  9. adminId: admin
  10. adminSecretName: ceph-secret
  11. adminSecretNamespace: default
  12. pool: k8s-volumes
  13. userId: admin
  14. userSecretName: ceph-secret
  15. fsType: ext4
  16. imageFormat: ""
  17. imageFeatures: layering

注意:上面的monitors,不能直接写ip,这样以后创建pvc会报:missing Ceph monitors。源码中,monitors需要k8s dns解析,我这里使用外部ceph,肯定没有相关解析。所以手动添加解析,如第10步。

10、创建/root/k8s-ceph-rbac/rbd-monitors-dns.yaml

  1. kind: Service
  2. apiVersion: v1
  3. metadata:
  4. name: ceph-mon-
  5. spec:
  6. type: ExternalName
  7. externalName: 192.168.137.10.xip.io

ceph的mon地址为:192.168.137.10:6789

11、执行以下命令将上面1到10步的yaml文件进行执行

  1. kubeclt apply -f k8s-ceph-rbac/

12、进行测试是否可用

1)创建test-pvc.yaml

  1. kind: PersistentVolumeClaim
  2. apiVersion: v1
  3. metadata:
  4. name: test-pvc
  5. spec:
  6. accessModes:
  7. - ReadWriteOnce
  8. storageClassName: ceph-storage-class
  9. resources:
  10. requests:
  11. storage: 1Gi
  1. kubectl apply -f test-pvc.yaml

状态为Bound,说明创建的pvc正常

扩展链接:https://github.com/kubernetes-incubator/external-storage

k8s对接ceph存储的更多相关文章

  1. 分布式存储ceph——(2)openstack对接ceph存储后端

    ceph对接openstack环境 一.使用rbd方式提供存储如下数据: (1)image:保存glanc中的image: (2)volume存储:保存cinder的volume:保存创建虚拟机时选择 ...

  2. k8s使用ceph存储

    目录 ceph配置 k8s 配置 通过静态pv,pvc使用ceph 测试多pod挂载静态pv数据不一致问题 StoragaClass 方式 ceph 常用命令 k8s 常用命令 k8s各类端口及IP说 ...

  3. 分布式存储ceph---openstack对接ceph存储后端(4)

    ceph对接openstack环境 一.使用RBD方式提供存储,如下数据: 1.image:保存glance中的image 2.volume存储:保存cinder的volume:保存创建虚拟机时选择创 ...

  4. openstack之cinder_backup对接ceph存储

    M版openstack,是kolla部署的 1.介绍 backup 功能好像与 snapshot 很相似,都可以保存 volume 的当前状态,以备以后恢复.但二者在用途和实现上还是有区别的,具体表现 ...

  5. k8s 对接glusterfs存储

    service 与 endpoint 是通过namespace相同,name相同,相互关联的 创建endpoint [root@k8s-master glusterfs]# cat glusterfs ...

  6. Ceph 14.2.5-K8S 使用Ceph存储实战 -- <6>

    K8S 使用Ceph存储 PV.PVC概述 管理存储是管理计算的一个明显问题.PersistentVolume子系统为用户和管理员提供了一个API,用于抽象如何根据消费方式提供存储的详细信息.于是引入 ...

  7. K8S学习笔记之k8s使用ceph实现动态持久化存储

    0x00 概述 本文章介绍如何使用ceph为k8s提供动态申请pv的功能.ceph提供底层存储功能,cephfs方式支持k8s的pv的3种访问模式ReadWriteOnce,ReadOnlyMany ...

  8. k8s使用ceph的rbd作后端存储

    k8s使用rbd作后端存储 k8s里的存储方式主要有三种.分别是volume.persistent volumes和dynamic volume provisioning. volume: 就是直接挂 ...

  9. OpenStack 对接 Ceph

    [TOC]   1. Openstack 与 Ceph 1.1. Ceph 简介 Ceph 是当前非常流行的开源分布式存储系统,具有高扩展性.高性能.高可靠性等优点,同时提供块存储服务(RBD).对象 ...

随机推荐

  1. [原创] 扩展jquery-treegrid插件, 实现勾选功能和全删按钮.

    新上手一个项目, 因而正好想学习下bootstrap, 所以就采用asp.net mvc + bootstrap来做.  因为需要TreeGrid的控件, 本来想用easyUI.LingerUi.DW ...

  2. 20175213吕正宏 MyCP(课下任务,必做)

    一.任务详情: 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin 用来把文本文件( ...

  3. webconfig标签收集

    在web项目启动时,很多因为vs没有报错,而页面跑不出来的情况,无法调试找到错误, 可以在webconfig中添加一个标签,运行项目就可以在页面显示错误 <customErrors mode=& ...

  4. Navicat Premium 12注册机使用教程

    来看下软件具体的安装.激活图文教程: 1.首先下载后正常安装软件至结束: 这时候如果打开的话,是提示要注册的 2.以管理员身份运行注册机工具 Navicat_Keygen_Patch[vxia.net ...

  5. 安装 mongo 4.0

    Centos 使用yum安装MongoDB 4.0 1.配置MongoDB的yum源 创建yum源文件: #touch /etc/yum.repos.d/mongodb-org-4.0.repo 添加 ...

  6. Visual Studio Enterprise 2019序列号

    Visual Studio Enterprise 2019序列号:BF8Y8-GN2QH-T84XB-QVY3B-RC4DF Visual Studio Professional 2019序列号:NY ...

  7. ApplicationListener接口的生命周期

    create:游戏初次创建时被调用,一般在这里创建ApplicationListener对象,初始化布景信息,将数据或UI布局绑定到监听器等,执行完该方法后会执行resize方法,是游戏创建立即执行的 ...

  8. 区块链入门(4)Truffle创建项目,编译,及项目部署

    上一章的结尾说这一次要讲编写一个智能合约部署到测试网络集群中,并进行交易,但我自己越看越觉得内容挺多的.先讲下truffle的项目创建,编译和部署的问题,然后再做上面说的事情吧. truffle是一套 ...

  9. poj_3045 贪心

    Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join the ...

  10. POJ-3159.Candies.(差分约束 + Spfa)

    Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 40407   Accepted: 11367 Descri ...