容器云平台No.6~企业级分布式存储Ceph~v14.2.10

scofield 菜鸟运维杂谈

简介


ceph作为一个统一的分布式存储系统,提供了高性能,高可用性,高扩展性。ceph的统一体现在其可以提供文件系统、块存储、对象存储,在云环境中,通常采用ceph作为后端存储来保证数据的高可用性。
ceph发表于2004年,随后开源给社区。经过十几年发展,目前得到众多云厂商支持并广泛使用。比如openstack\kubernetes\虚拟机系统等。。。
架构图:

特点


  • 高性能
    采用CRUSH算法,数据分布均衡,并行度高。
    容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。
    能够支持上千个存储节点的规模,支持TB到PB级的数据。
  • 高可用性
    副本数可以灵活控制。
    支持故障域分隔,数据强一致性。
    多种故障场景自动进行修复自愈。
    没有单点故障,自动管理。
  • 高可扩展性
    去中心化。
    扩展灵活。
    随着节点增加而线性增长。
    支持三种存储接口:块存储、文件存储、对象存储
    支持自定义接口,支持多种语言驱动

    部署方式


1、部署到裸机,作为独立的存储集群,为kubernetes提供存储服务(线上环境推荐)
2、部署到kubernetes集群之上,使用Rook管理ceph。Rook是一个可以提供Ceph集群管理能力的Operator,它使用CRD控制器来对ceph的资源进行部署和管理。相比部署到裸机。更接近kubernetes,但是属于一个新的东西,稳定性和故障处理难易程度有不确定性,生成环境需要自行评估。
3、作为测试,本文就采用rook来部署ceph集群。
先看下架构图

从以上两张官方给的图可以看出,
Rook Operator是核心组件,它主要用来管理存储集群,并监控存储守护进程,确保存储集群的健康。
Rook Agent运行到每一个存储节点,并配置了FlexVolume插件和Kubernetes 的存储卷控制框架(CSI)进行集成。
Rook 用 Kubernetes Pod 的形式,部署 Ceph的MON、OSD 以及 MGR守护进程。
4、部署ceph前,需要确保你的服务器有空闲的硬盘给ceph集群使用,一般是三块或者更多,如果只是测试最少一块。
如下所示,sdb就是给ceph用的

 1fdisk  -l 2 3Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors 4Units = sectors of 1 * 512 = 512 bytes 5Sector size (logical/physical): 512 bytes / 512 bytes 6I/O size (minimum/optimal): 512 bytes / 512 bytes 7 8 9Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors10Units = sectors of 1 * 512 = 512 bytes11Sector size (logical/physical): 512 bytes / 512 bytes12I/O size (minimum/optimal): 512 bytes / 512 bytes13Disk label type: dos14Disk identifier: 0x0001ce601516   Device Boot      Start         End      Blocks   Id  System17/dev/sda1   *        2048     2099199     1048576   83  Linux18/dev/sda2         2099200   209715199   103808000   8e  Linux LVM

部署rook-ceph


安装root-operator,本文部署到命名空间:rook
1、部署common资源

1[root@k8s-master001 rook]# kubectl  apply -f common.yaml 2namespace/rook created3Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition4。。中间省略N行5clusterrolebinding.rbac.authorization.k8s.io/rbd-csi-provisioner-role created

2、部署operator资源

 1[root@k8s-master001 rook]# kubectl label node k8s-master003 app.storage=rook-ceph 2node/k8s-master003 labeled 3[root@k8s-master001 rook]# kubectl label node k8s-master002 app.storage=rook-ceph 4node/k8s-master002 labeled 5[root@k8s-master001 rook]# kubectl label node k8s-master001 app.storage=rook-ceph 6node/k8s-master001 labeled 7 8[root@k8s-master001 rook]# kubectl  apply -f operator.yaml 9configmap/rook-ceph-operator-config created10deployment.apps/rook-ceph-operator created1112[root@k8s-master001 rook]# kubectl  get po -n rook13NAME                                 READY   STATUS    RESTARTS   AGE14rook-ceph-operator-87f875bbc-zz9lb   0/1     Pending   0          106s1516再次查看,知道全部Pod为Running状态,表示安装成功17如果不是Runing状态,可以使用例如:kubectl describe po rook-discover-5qrc6 -n rook18查看详情,一般情况可能是镜像下载失败,如果是其他情况,请根据实际情况自行解决。。。1920[root@k8s-master001 rook]# kubectl  get po -n rook21NAME                                 READY   STATUS    RESTARTS   AGE22rook-ceph-operator-87f875bbc-zz9lb   1/1     Running   3          27m23rook-discover-5qrc6                  1/1     Running   0          3m42s24rook-discover-fzfz5                  1/1     Running   0          3m52s25rook-discover-fzg7r                  1/1     Running   0          20m

3、创建ceph集群
这里需要根据实际情况修改cluster.yaml文件
设置ceph存储节点,使用的硬盘,否则会把系统可用的磁盘都格式化了,这里需要设置如下

 1  storage: # cluster level storage configuration and selection 2    useAllNodes: false 3    useAllDevices: false 4    #deviceFilter: 5    config: 6      # metadataDevice: "md0" # specify a non-rotational storage so ceph-volume will use it as block db device of bluestore. 7      # databaseSizeMB: "1024" # uncomment if the disks are smaller than 100 GB 8      # journalSizeMB: "1024"  # uncomment if the disks are 20 GB or smaller 9      # osdsPerDevice: "1" # this value can be overridden at the node or device level10      # encryptedDevice: "true" # the default value for this option is "false"11# Individual nodes and their config can be specified as well, but 'useAllNodes' above must be set to false. Then, only the named12# nodes below will be used as storage resources.  Each node's 'name' field should match their 'kubernetes.io/hostname' label.13    nodes:14    - name: "10.26.25.20"  #这个地方最好写hostname15      devices:16      - name: "sdb"17    - name: "10.26.25.21"18      devices:19      - name: "sdb"20    - name: "10.26.25.22"21      devices:22      - name: "sdb"

修改节点情和性,把ceph安装到固定标签的节点,这里使用app.storage=rook-ceph这个标签。

 1  placement: 2    all: 3      nodeAffinity: 4        requiredDuringSchedulingIgnoredDuringExecution: 5          nodeSelectorTerms: 6          - matchExpressions: 7            - key: app.storage 8              operator: In 9              values:10              - rook-ceph

执行部署命令,这个环节需要下载ceph的一些镜像,根据网络情况,耗时可能会比较长。。。

 1[root@k8s-master001 rook]# kubectl  apply -f cluster.yaml 2cephcluster.ceph.rook.io/rook-ceph created 3 4[root@k8s-master001 rook]#  kubectl  get po -n rook 5NAME                                                      READY   STATUS    RESTARTS   AGE 6csi-cephfsplugin-2fsl9                                    3/3     Running   0          6m54s 7csi-cephfsplugin-4r5cg                                    3/3     Running   0          6m55s 8csi-cephfsplugin-htdjs                                    3/3     Running   0          6m54s 9csi-cephfsplugin-provisioner-7646976d94-9kfd6             5/5     Running   1          6m53s10csi-cephfsplugin-provisioner-7646976d94-rbztr             5/5     Running   0          6m53s11csi-rbdplugin-56jpj                                       3/3     Running   0          6m59s12csi-rbdplugin-8h25h                                       3/3     Running   0          6m59s13csi-rbdplugin-provisioner-55c946c8c-d25g4                 6/6     Running   2          6m58s14csi-rbdplugin-provisioner-55c946c8c-g77s8                 6/6     Running   1          6m57s15csi-rbdplugin-z4qpw                                       3/3     Running   0          6m59s16rook-ceph-crashcollector-k8s-master001-6975bdf888-bpm7r   1/1     Running   0          2m6s17rook-ceph-crashcollector-k8s-master002-746b76cd87-5xzz4   1/1     Running   0          3m18s18rook-ceph-crashcollector-k8s-master003-5b54f4496-hntgb    1/1     Running   0          2m34s19rook-ceph-mgr-a-58594cfb7d-l7wjg                          1/1     Running   0          2m7s20rook-ceph-mon-a-84b755686-c6cxr                           1/1     Running   0          3m18s21rook-ceph-mon-b-776469c655-d5jb7                          1/1     Running   0          3m1s22rook-ceph-mon-c-64648fbd69-n5jh4                          1/1     Running   0          2m35s23rook-ceph-operator-87f875bbc-cgvwm                        1/1     Running   3          7m35s24rook-discover-d9fpp                                       1/1     Running   0          7m31s25rook-discover-kxmdx                                       1/1     Running   0          7m31s26rook-discover-z9kzt                                       1/1     Running   0          7m31s

从以上输出可以看到,没有任何OSD的pod在运行。

查看rook-discover-kxmdx日志发现。能够找到硬盘sdb,但是没有对硬盘进程任何操作
,突然想到ceph也是通过关键lvm来格式化硬盘的,然后查看系统,果然没有安装lvm2,果断重来吧:

1kubectl delete -f cluster.yaml2kubectl delete -f operator.yaml3kubectl delete -f  common.yaml4在所有节点删除5rm -rf /var/lib/rook/*

安装lvm2

1yum install -y lvm2

再次部署

 1[root@k8s-master001 rook]#  kubectl  get po -n rook 2NAME                                                      READY   STATUS      RESTARTS   AGE 3csi-cephfsplugin-9l55s                                    3/3     Running     0          10m 4csi-cephfsplugin-czwlx                                    3/3     Running     0          10m 5csi-cephfsplugin-np7n7                                    3/3     Running     0          10m 6csi-cephfsplugin-provisioner-7646976d94-579qz             5/5     Running     3          10m 7csi-cephfsplugin-provisioner-7646976d94-v68wg             5/5     Running     0          10m 8csi-rbdplugin-9q82d                                       3/3     Running     0          10m 9csi-rbdplugin-l55zq                                       3/3     Running     0          10m10csi-rbdplugin-provisioner-55c946c8c-ft4xl                 6/6     Running     0          10m11csi-rbdplugin-provisioner-55c946c8c-zkzh7                 6/6     Running     1          10m12csi-rbdplugin-wk7cw                                       3/3     Running     0          10m13rook-ceph-crashcollector-k8s-master001-6c4c78b6cd-gcfvn   1/1     Running     0          6m17s14rook-ceph-crashcollector-k8s-master002-746b76cd87-47k84   1/1     Running     0          9m7s15rook-ceph-crashcollector-k8s-master003-5b54f4496-ts64m    1/1     Running     0          8m43s16rook-ceph-mgr-a-66779c74c5-cnxbm                          1/1     Running     0          8m16s17rook-ceph-mon-a-5b7bcd77ff-sb4fz                          1/1     Running     0          9m25s18rook-ceph-mon-b-779c8467d4-bfd4g                          1/1     Running     0          9m7s19rook-ceph-mon-c-574fd97c79-v5qcd                          1/1     Running     0          8m44s20rook-ceph-operator-87f875bbc-z7rwn                        1/1     Running     1          11m21rook-ceph-osd-0-66775549dc-g2ttv                          1/1     Running     0          6m11s22rook-ceph-osd-2-6c5b4fc67-gtqjf                           1/1     Running     0          6m20s23rook-ceph-osd-prepare-k8s-master001-jbpgg                 0/1     Completed   0          8m13s24rook-ceph-osd-prepare-k8s-master002-vfvnp                 0/1     Completed   0          8m12s25rook-ceph-osd-prepare-k8s-master003-ffd6r                 0/1     Completed   0          6m28s26rook-discover-74qf2                                       1/1     Running     0          10m27rook-discover-fk4wn                                       1/1     Running     0          10m28rook-discover-fvbcf                                       1/1     Running     0          10m

终于看到rook-ceph-osd-*的Pod在运行了。osd如果没有运行,ceph是不能提供存储能力的。

4、创建ceph-dashboard

1[root@k8s-master001 rook]# kubectl apply -f dashboard-external-https.yaml2service/rook-ceph-mgr-dashboard-external-https created34使用如下命令查询dashboard的admin密码5MGR_POD=`kubectl get pod -n rook | grep mgr | awk '{print $1}'`6kubectl -n rook-ceph logs $MGR_POD | grep password

5、安装ceph-tool工具,就是一个ceph客户端工具,可以使用ceph命令管理ceph集群

1[root@k8s-master001 rook]# kubectl apply -f toolbox.yaml

6、创建kubernetes集群存储类,默认reclaimPolicy:策略从Delete改成Retain,看自己需求改

1[root@k8s-master001 rook]# kubectl  apply -f storageclass.yaml2cephblockpool.ceph.rook.io/k8spool created3storageclass.storage.k8s.io/rook-ceph created

使用ceph为kubernetes提供存储


验证存储类是否可使用,这里使用了nodeSelector,把pod指定到特定机器,也可以不设置

 1--- 2apiVersion: apps/v1 3kind: StatefulSet 4metadata: 5  name: demo001 6  labels: 7    app: demo00 8spec: 9  serviceName: demo00110  replicas: 111  selector:12    matchLabels:13      app: demo00114  template:15    metadata:16      labels:17        app: demo00118    spec:19      terminationGracePeriodSeconds: 18020      nodeSelector:21        kubernetes.io/hostname: k8s-master00122      containers:23      - name: demo00124        image: nginx25        imagePullPolicy: IfNotPresent26        ports:27        - containerPort: 8028          name: port29        volumeMounts:30        - name: volume31          mountPath: /var/www/html32  volumeClaimTemplates:33  - metadata:34      name: volume35    spec:36      accessModes: ["ReadWriteOnce"]37      storageClassName: rook-ceph38      resources:39        requests:40          storage: 1Gi

执行部署kubectl apply -f demo.yaml

 1[root@k8s-master001 rook]# kubectl  get po 2NAME        READY   STATUS              RESTARTS   AGE 3demo001-0   1/1     Running             0          78s 4查看可提供服务的存储类 5[root@k8s-master001 rook]# kubectl  get sc  6NAME        PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE 7rook-ceph   rook.rbd.csi.ceph.com   Retain          Immediate           true                   8m15s 8看已经创建的存储卷 9[root@k8s-master001 rook]# kubectl  get pv,pvc10NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM     STORAGECLASS   REASON   AGE11persistentvolume/pvc-e96e54cb-88bb-44b0-a07d-19cbb36fe739   1Gi   RWO  Retain Bound  default/volume-demo001-0   rook-ceph               104s1213NAME          STATUS   VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS   AGE14persistentvolumeclaim/volume-demo001-0   Bound    pvc-e96e54cb-88bb-44b0-a07d-19cbb36fe739   1Gi RWO    rook-ceph      110s

从以上输出可以看出,kubernetes通过调用存储类创建了PV:pvc-e96e54cb-88bb-44b0-a07d-19cbb36fe739 ,并把它和PVC:volume-demo001-0绑定。
现在我们进入nginx pod,查看挂载的磁盘情况

1[root@k8s-master001 rook]# kubectl  exec -ti demo001-0  /bin/sh2kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.3# df -h 4Filesystem               Size  Used Avail Use% Mounted on5overlay                   50G  5.6G   45G  12% /6/dev/rbd0                976M  2.6M  958M   1% /var/www/html

这里/dev/rbd0就是ceph集群为nginx提供的后端存储,大小为1G,在demo.yaml部署文件中指定。

避坑总结


1、因为ceph在创建osd的时候需要用到系统工具lvm2,部署之前最好提前装好。
2、在cluster.yaml中指定硬盘信息时,最好使用hostname,或者保证DNS系统解析正确。

1nodes:2    - name: "10.26.25.20"  #这个地方最好写hostname3      devices:4      - name: "sdb"

3、用来给ceph使用的硬盘不要手动建分区。
4、如果重新部署,记得再次部署之前先删除/var/lib/rook/目录,避免有老的集群信息残留。
5、生产环境最好使用标签,把ceph安装到指定的节点,同时避免安装到master节点。


注:文中图片来源于网络,如有侵权,请联系我及时删除。

©著作权归作者所有:来自51CTO博客作者mb5fdb131956bf3的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 容器云平台No.3~kubernetes简单使用
  2. 11:VMware Horizon View 8.0-部署配置UAG网关
  3. 语音也能做持续集成和持续部署?看 Jenkins + Alexa 如何实现
  4. 容器云平台No.4~kubernetes 服务暴露之Ingress
  5. 闲聊Kubernetes Pod垂直自动伸缩(VPA)
  6. 在Kubernetes上部署应用时我们常忽略的几件事
  7. 浅析Kubernrtes服务类型(Service Types)
  8. Kubernetes集群管理容器实践(概念篇)
  9. Kubernetes客户端和管理界面大集合

随机推荐

  1. sql plus如何新建新用户
  2. mysql 配置 explicit_defaults_for_times
  3. 怎么用SQL语句实现表中的一个字段加1啊??
  4. mysql表名忽略大小写
  5. ySQL 4.*或5.0.*的升级指南
  6. 如果至少有一条记录的值为1,则返回“是”
  7. 如何将这两个查询组合成1?
  8. 如何在一个查询中组合六个独立查询。表是
  9. mysql主从简单配置
  10. 从SQL字符串分割多桩分隔符