首页 > 其他分享 >K8S使用开源CEPH作为后端StorageClass

K8S使用开源CEPH作为后端StorageClass

时间:2023-10-21 09:44:55浏览次数:50  
标签:ceph k8s csi master02 rbd CEPH StorageClass K8S root

1 引言

K8S在1.13版本开始支持使用Ceph作为StorageClass。其中云原生存储Rook和开源Ceph应用都非常广泛。本文主要介绍K8S如何对接开源Ceph使用RBD卷。

K8S对接Ceph的技术栈如下图所示。K8S主要通过容器存储接口CSI和Ceph进行交互。

https://docs.ceph.com/en/reef/rbd/rbd-kubernetes/

CSI的官方地址如下

https://github.com/ceph/ceph-csi/tree/release-v3.9

在部署CSI前需要确认好部署的CSI版本,在CSI的官网,我们可以看到CSI版本与K8S之间的对应关系。

图片

CSI与Ceph之间的对应关系参考以下链接

https://github.com/ceph/ceph-csi#support-matrix

作者环境的K8S版本为1.24,Ceph版本为14,因此使用3.5.1版本的CSI。下面开始部署。

2 Ceph侧资源创建
[root@ceph-1 ~]# ceph osd pool create k8s 64 64  ##创建k8s存储池pool 'k8s' created[root@ceph-1 ~]# ceph auth get-or-create client.k8s mon 'profile rbd' osd 'profile rbd pool=k8s' mgr 'profile rbd pool=k8s'  ##新建一个ceph用户,用户名和key后续需要使用到[client.k8s]        key = AQBClIVj8usBLxAAxTl0DwZCz9prNRRRI9Bl5A==[root@ceph-1 ~]# ceph -s |grep id  ##查看ceph 的fsid    id:     395b7a30-eb33-460d-8e38-524fc48c58cb[root@ceph-1 ~]# ceph mon stat  #查看ceph的mon服务ip,我们主要采用v1版本的ip和端口e3: 3 mons at {ceph-1=[v2:10.0.245.192:3300/0,v1:10.0.245.192:6789/0],ceph-2=[v2:10.0.138.175:3300/0,v1:10.0.138.175:6789/0],ceph-3=[v2:10.0.28.226:3300/0,v1:10.0.28.226:6789/0]}, election epoch 1112, leader 0 ceph-1, quorum 0,1,2 ceph-1,ceph-2,ceph-3        

 

3 ceph-csi部署环境准备

主要步骤为下载官方csi部署文件,创建csi需要使用到的configmap及sa、secret。使用到的文件均位于ceph-csi/deploy/rbd/kubernetes/ 目录下,同时会新建以下三个文件用于保存ceph相关配置

  • csi-kms-config-map.yaml

  • ceph-config-map.yaml

  • csi-rbd-secret.yaml

[root@k8s-master02 ~]# wget https://github.com/ceph/ceph-csi/archive/refs/tags/v3.5.1.tar.gz ##本次实验ceph版本为14,使用3.5.1版本有较好的兼容性[root@k8s-master02 ~]# tar xvf v3.5.1.tar.gz[root@k8s-master02 ~]# mv ceph-csi-3.5.1 ceph-csi[root@k8s-master02 ~]# cd /root/ceph-csi/deploy/rbd/kubernetes/[root@k8s-master02 kubernetes]# cat csi-config-map.yaml ##编辑config-map文件## /!\ DO NOT MODIFY THIS FILE## This file has been automatically generated by Ceph-CSI yamlgen.# The source for the contents can be found in the api/deploy directory, make# your modifications there.#---apiVersion: v1kind: ConfigMapmetadata:  name: "ceph-csi-config"data:  config.json: |-    [      {        "clusterID": "395b7a30-eb33-460d-8e38-524fc48c58cb",  #ceph -s输出的id        "monitors": [          "10.0.245.192:6789",  ##三个mon服务的ip地址          "10.0.138.175:6789",          "10.0.28.226:6789"        ]      }    ][root@k8s-master02 kubernetes]# kubectl create ns ceph-csi  ##创建namespacenamespace/ceph-csi created[root@k8s-master02 kubernetes]# kubectl -n ceph-csi create -f csi-config-map.yaml configmap/ceph-csi-config created[root@k8s-master02 kubernetes]# cat csi-kms-config-map.yaml ##新建kms-config文件---apiVersion: v1kind: ConfigMapdata:  config.json: |-    {}metadata:  name: ceph-csi-encryption-kms-config[root@k8s-master02 kubernetes]# kubectl create -n ceph-csi -f csi-kms-config-map.yaml configmap/ceph-csi-encryption-kms-config created[root@k8s-master02 kubernetes]# cat ceph-config-map.yaml ##新建一个ceph-config文件,ceph.conf中的内容与ceph集群中/etc/ceph/ceph.conf的内容保持一致---apiVersion: v1kind: ConfigMapdata:  ceph.conf: |    [global]    fsid = 395b7a30-eb33-460d-8e38-524fc48c58cb    public_network = 10.0.0.0/16    cluster_network = 10.0.0.0/16    mon_initial_members = ceph-1    mon_host = 10.0.245.192    auth_cluster_required = cephx    auth_service_required = cephx    auth_client_required = cephx    mon_allow_pool_delete = true    auth_allow_insecure_global_id_reclaim = false    rbd_default_format = 2  # keyring is a required key and its value should be empty  keyring: |metadata:  name: ceph-config[root@k8s-master02 kubernetes]# kubectl -n ceph-csi create -f ceph-config-map.yaml configmap/ceph-config created[root@k8s-master02 kubernetes]# cat csi-rbd-secret.yaml ##新建一个secret文件apiVersion: v1kind: Secretmetadata:  name: csi-rbd-secret  namespace: ceph-csistringData:  userID: k8s   ##ceph集群上创建额用户  userKey: AQBClIVj8usBLxAAxTl0DwZCz9prNRRRI9Bl5A==  ##用户的key[root@k8s-master02 kubernetes]# kubectl create -f csi-rbd-secret.yaml secret/csi-rbd-secret created  [root@k8s-master02 ~]# sed -i "s/namespace: default/namespace: ceph-csi/g"  $(grep -rl "namespace: default" ./)  #将所有yaml文件的namespace从default改成ceph-csi[root@k8s-master02 kubernetes]# cat csi-provisioner-rbac.yaml ##检查配置文件中namespace是否更改成功---apiVersion: v1kind: ServiceAccountmetadata:  name: rbd-csi-provisioner  # replace with non-default namespace name  namespace: ceph-csi 
---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: rbd-external-provisioner-runner##创建rbac权限[root@k8s-master02 kubernetes]# kubectl create -f csi-provisioner-rbac.yaml serviceaccount/rbd-csi-provisioner createdclusterrole.rbac.authorization.k8s.io/rbd-external-provisioner-runner createdclusterrolebinding.rbac.authorization.k8s.io/rbd-csi-provisioner-role createdrole.rbac.authorization.k8s.io/rbd-external-provisioner-cfg createdrolebinding.rbac.authorization.k8s.io/rbd-csi-provisioner-role-cfg created[root@k8s-master02 kubernetes]# kubectl create -f csi-nodeplugin-rbac.yaml serviceaccount/rbd-csi-nodeplugin createdclusterrole.rbac.authorization.k8s.io/rbd-csi-nodeplugin createdclusterrolebinding.rbac.authorization.k8s.io/rbd-csi-nodeplugin created

 

4 部署ceph-csi相关容器

yaml中的镜像源需要替换,否则部署时镜像可能下载不成功。如果部署其他版本的csi,可以自己设置通过阿里云容器镜像服务托管下载k8s.gcr.io中相关csi版本的镜像。

[root@k8s-master02 kubernetes]# sed -i 's#k8s.gcr.io/sig-storage/#registry.cn-shanghai.aliyuncs.com/singless/#' csi-rbdplugin*  ##替换yaml里的镜像源[root@k8s-master02 kubernetes]# kubectl -n ceph-csi create -f csi-rbdplugin-provisioner.yaml ##部署sidecar容器,yaml文件里的所有镜像地址修改为registry.cn-shanghai.aliyuncs.com/singless/service/csi-rbdplugin-provisioner createddeployment.apps/csi-rbdplugin-provisioner created[root@k8s-master02 kubernetes]# kubectl -n ceph-csi create -f csi-rbdplugin.yaml ##部署RBD CSI driver容器daemonset.apps/csi-rbdplugin createdservice/csi-metrics-rbdplugin created[root@k8s-master02 kubernetes]# kubectl get pod -n ceph-csi  ##检查pod是否都已启动NAME                                         READY   STATUS    RESTARTS   AGEcsi-rbdplugin-8s6cf                          3/3     Running   0          60mcsi-rbdplugin-g74qd                          3/3     Running   0          60mcsi-rbdplugin-provisioner-56d6d755c7-jhcwl   7/7     Running   0          14mcsi-rbdplugin-provisioner-56d6d755c7-lz2zf   7/7     Running   0          14mcsi-rbdplugin-provisioner-56d6d755c7-pxw7q   7/7     Running   0          14mcsi-rbdplugin-twjdh                          3/3     Running   0          60mcsi-rbdplugin-v529x                          3/3     Running   0          60mcsi-rbdplugin-wgh5c                          3/3     Running   0          60m

 

5 创建StorageClass

[root@k8s-master02 kubernetes]# cat storageclass.yaml ---apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:   name: csi-rbd-scprovisioner: rbd.csi.ceph.comparameters:   clusterID: 395b7a30-eb33-460d-8e38-524fc48c58cb  ##ceph集群ID   pool: k8s   ##ceph集群的pool名   imageFeatures: layering  ##定义创建的rbd features   csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret   csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi   csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret   csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi   csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret   csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi   csi.storage.k8s/fstype: ext4reclaimPolicy: DeleteallowVolumeExpansion: truemountOptions:   - discard[root@k8s-master02 kubernetes]# kubectl create -f storageclass.yaml storageclass.storage.k8s.io/csi-rbd-sc created

 

6 创建PV

[root@k8s-master02 kubernetes]# cd /root/ceph-csi/examples/rbd/[root@k8s-master02 rbd]# kubectl create -f pvc.yaml persistentvolumeclaim/rbd-pvc created

 

本文主要介绍K8S对接Ceph使用RBD块的方法,对象存储或文件存储可以参考官方文档进行对接。

标签:ceph,k8s,csi,master02,rbd,CEPH,StorageClass,K8S,root
From: https://www.cnblogs.com/cheyunhua/p/17778483.html

相关文章

  • 205-303 K8S API资源对象介绍03 (Job CronJob Endpoint ConfigMap Secret) 2.17-3.3
    一、水平自动扩容和缩容HPA(K8S版本>=1.23.x)HPA全称HorizontalPodAutoscaler,Pod水平自动伸缩,HPA可以基于CPU利用率replicationcontroller、deployment和replicaset中的pod数量进行自动扩缩容。pod自动缩放对象适用于无法缩放的对象,比如DaemonSetHPA由KubernetesAPI资源和控......
  • k8s中服务器重启后,provisioner制备区异常
    kubectllogs-fopenebs-localpv-provisioner-77886fbccd-fbv8k-nopenebsF101906:43:35.9089841provisioner.go:247]Errorgettingserverversion:Get"https://10.96.0.1:443/version?timeout=32s":dialtcp10.96.0.1:443:i/otimeout......
  • 使用 kaniko 在 K8S 中构建镜像
    背景现有个需求需要在K8S中构建一个新的镜像,之前使用docker命令进行构建,后面K8S升级,容器运行时换成了containerd,故查了一下网络,发现kaniko比较好用。所以测试记录一下~项目地址:https://github.com/GoogleContainerTools/kaniko测试例子一:mkdir-p/data/yaml/default......
  • kubeadm安装k8s集群
    kubeadm安装k8s集群一、机器准备(所有的master和node节点需要执行)部署k8s集群的节点按照用途可以划分为如下2类角色:master:集群的master节点,集群的初始化节点,基础配置不低于2c4gslave:集群的slave节点,可以多台,基础配置不低于1c2g主机名、节点ip、部署组件k8s-master10.......
  • k8s pv与pvc
    k8spv与pvc概念PV我们想要持久化k8spod中的数据,就需要用到存储,找一个地方,存放数据。不然一旦pod被删除,则数据就丢失了。在k8s中,pv就是存储数据的地方,可以理解为pv就是存储后端。pv可以由多种存储系统提供,如NFS,GFS,本地,CIFS,云存储集群等PVC用户想要使用PV,就需要申请,说明要......
  • 204 K8S API资源对象介绍03 (Job CronJob Endpoint ConfigMap Secret) 2.12-2.16
    一、API资源对象Job一次性运行后就退出的Pod1.1使用kubect生成YAML文件#kubectlcreatejobjob01--image=busybox--dry-run=client-oyaml>job01.yaml#vimjob01.yaml#catjob01.yamlapiVersion:batch/v1kind:Jobmetadata:creationTimestamp:nullnam......
  • 十四、kubernetes日志收集之Loki收集K8s日志
    3.使用Loki收集K8s日志3.1架构说明无论是ELK、EFK还是Filebeat,都需要用到Elasticsearch来存储数据,Elasticsearch本身就像“一座大山”,维护难度和资源使用都是偏高的。对于很多公司而言,特别是新创公司,可能并不想大费周章地去搭建一个ELK、EFK或者其他重量级的日志平台,刚开始的人力......
  • Ceph
    Ceph1、存储基础1.单机存储//单机存储设备●DAS(直接附加存储,是直接接到计算机的主板总线上去的存储)IDE、SATA、SCSI、SAS、USB接口的磁盘所谓接口就是一种存储设备驱动下的磁盘设备,提供块级别的存储●NAS(网络附加存储,是通过网络附加到当前主机文件系统之上的存储)NFS(文件......
  • Spring Boot + K8S 中的滚动发布、优雅停机、弹性伸缩、应用监控、配置分离
    前言 K8s+SpringBoot实现零宕机发布:健康检查+滚动更新+优雅停机+弹性伸缩+Prometheus监控+配置分离(镜像复用) 配置 健康检查健康检查类型:就绪探针(readiness)+存活探针(liveness)探针类型:exec(进入容器执行脚本)、tcpSocket(探测端口)、httpGet(调用接口)业务层面项目......
  • kubeadm 部署 k8s
    kubeadm部署k8s简介记录在centos7.6.1810上,使用kubeadm部署k8s,部署在三台虚机上,部署版本是1.22.0虚机信息使用三台一模一样的虚机,系统版本为CentOS7.6.1810安装虚机的ISO是CentOS-7-x86_64-Minimal-1810.isoIP分别是172.17.134.134、172.17.139.162、172.17.140.87使......