分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

Kubernetes持久化Ceph存储

发布时间:2023-09-06 02:09责任编辑:郭大石关键词:暂无标签
一、依然简介

Kubernetes支持的卷类型详见:https://kubernetes.io/docs/concepts/storage/volumes/

Kubernetes使用Persistent Volume和Persistent Volume Claim两种API资源来管理存储。

PersistentVolume(简称PV):由管理员设置的存储,它是集群的一部分。就像节点(Node)是集群中的资源一样,PV也是集群中的资源。它包含存储类型,存储大小和访问模式。它的生命周期独立于Pod,例如当使用它的Pod销毁时对PV没有影响。

PersistentVolumeClaim(简称PVC): 是用户存储的请求。它和Pod类似。Pod消耗Node资源,PVC消耗PV资源。Pod可以请求特定级别的资源(CPU和MEM)。PVC可以请求特定大小和访问模式的PV。

可以通过两种方式配置PV:静态或动态。

静态PV:集群管理员创建许多PV,它们包含可供集群用户使用的实际存储的详细信息。

动态PV:当管理员创建的静态PV都不匹配用户创建的PersistentVolumeClaim时,集群会为PVC动态的配置卷。此配置基于StorageClasses:PVC必须请求存储类(storageclasses),并且管理员必须已创建并配置该类,以便进行动态创建。

Kubernetes关于PersistentVolumes的更多描述:https://kubernetes.io/docs/concepts/storage/persistent-volumes/


二、关于PersistentVolume的访问方式


  • ReadWriteOnce - 卷以读写方式挂载到单个节点

  • ReadOnlyMany - 卷以只读方式挂载到多个节点

  • ReadWriteMany - 卷以读写方式挂载到多个节点


在CLI中,访问模式缩写为:

  • RWO - ReadWriteOnce

  • ROX - ReadOnlyMany

  • RWX - ReadWriteMany

重要:卷只能一次使用一种访问模式安装,即使它支持很多。


三、关于回收策略

  • Retain - 手动回收

  • Recycle- 基本擦洗(rm -rf /thevolume/*

  • Delete - 关联的存储资产(如AWS EBS,GCE PD,Azure磁盘或OpenStack Cinder卷)将被删除。

    目前,只有NFS和HostPath支持回收。AWS EBS,GCE PD,Azure磁盘和Cinder卷支持删除。


四、关于PersistentVolume(PV)状态

  • Available(可用状态) - 一块空闲资源还没有被任何声明绑定

  • Bound(绑定状态) - 声明分配到PVC进行绑定,PV进入绑定状态

  • Released(释放状态) - PVC被删除,PV进入释放状态,等待回收处理

  • Failed(失败状态) - PV执行自动清理回收策略失败


五、关于PersistentVolumeClaims(PVC)状态

  • Pending(等待状态) - 等待绑定PV

  • Bound(绑定状态) - PV已绑定PVC


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

#wget-O/etc/yum.repos.d/epel.repohttp://mirrors.aliyun.com/repo/epel-7.repo#vim/etc/yum.repos.d/ceph.repo[Ceph]name=Cephpackagesfor$basearchbaseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/$basearchenabled=1gpgcheck=1priority=1gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc[Ceph-noarch]name=Cephnoarchpackagesbaseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarchenabled=1gpgcheck=1priority=1gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc[ceph-source]name=Cephsourcepackagesbaseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/SRPMSenabled=1gpgcheck=1priority=1gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc#yummakecache#yum-yinstallceph-common


七、配置静态PV


1.在默认的RBD pool中创建一个1G的image(ceph集群)

#cephosdpoolcreaterbd128pool'rbd'created#cephosdlspools#rbdcreateceph-image-s1G--image-featurelayering##创建1G的镜像并指定layering特性#rbdlsceph-image#cephosdpoolapplicationenablerbdceph-image##进行关联enabledapplication'ceph-image'onpool'rbd'#rbdinfoceph-imagerbdimage'ceph-image':size1GiBin256objectsorder22(4MiBobjects)id:13032ae8944ablock_name_prefix:rbd_data.13032ae8944aformat:2features:layeringop_features:flags:create_timestamp:SunJul2913:00:362018


2.配置ceph secret(ceph+kubernetes)

#cephauthget-keyclient.admin|base64##获取client.admin的keyring值,并用base64编码(ceph集群)QVFDOUgxdGJIalc4SWhBQTlCOXRNUCs5RUV3N3hiTlE4NTdLVlE9PQ==#vimceph-secret.yamlapiVersion:v1kind:Secretmetadata:name:ceph-secrettype:kubernetes.io/rbddata:key:QVFDOUgxdGJIalc4SWhBQTlCOXRNUCs5RUV3N3hiTlE4NTdLVlE9PQ==#kubectlcreate-fceph-secret.yamlsecret/ceph-secretcreated#kubectlgetsecretceph-secretNAMETYPEDATAAGEceph-secretkubernetes.io/rbd13s


3.创建PV(kubernetes)

#vimceph-pv.yamlapiVersion:v1kind:PersistentVolumemetadata:name:ceph-pvspec:capacity:storage:1GiaccessModes:-ReadWriteOncestorageClassName:"rbd"rbd:monitors:-192.168.100.116:6789-192.168.100.117:6789-192.168.100.118:6789pool:rbdimage:ceph-imageuser:adminsecretRef:name:ceph-secretfsType:xfsreadOnly:falsepersistentVolumeReclaimPolicy:Recycle#kubectlcreate-fceph-pv.yamlpersistentvolume/ceph-pvcreated#kubectlgetpvNAMECAPACITYACCESSMODESRECLAIMPOLICYceph-pv1GiRWORecycleSTATUSCLAIMSTORAGECLASSREASONAGEAvailablerbd1m


4.创建PVC(kubernetes)

#vimceph-claim.yamlapiVersion:v1kind:PersistentVolumeClaimmetadata:name:ceph-claimspec:storageClassName:"rbd"accessModes:-ReadWriteOnceresources:requests:storage:1Gi#kubectlcreate-fceph-claim.yamlpersistentvolumeclaim/ceph-claimcreated#kubectlgetpvcceph-claimNAMESTATUSVOLUMECAPACITYACCESSMODESSTORAGECLASSAGEceph-claimBoundceph-pv1GiRWOrbd20s#kubectlgetpvNAMECAPACITYACCESSMODESRECLAIMPOLICYceph-pv1GiRWORecycleSTATUSCLAIMSTORAGECLASSREASONAGEBounddefault/ceph-claimrbd1m


5.创建pod(kubernetes)

#vimceph-pod1.yamlapiVersion:v1kind:Podmetadata:name:ceph-pod1spec:containers:-name:ceph-busyboximage:busyboxcommand:["sleep","60000"]volumeMounts:-name:ceph-vol1mountPath:/usr/share/busyboxreadOnly:falsevolumes:-name:ceph-vol1persistentVolumeClaim:claimName:ceph-claim#kubectlcreate-fceph-pod1.yamlpod/ceph-pod1created#kubectlgetpodceph-pod1NAMEREADYSTATUSRESTARTSAGEceph-pod11/1Running02m#kubectlgetpodceph-pod1-owideNAMEREADYSTATUSRESTARTSAGEIPNODEceph-pod11/1Running02m10.244.88.2node3


6.测试

进入到该Pod中,向/usr/share/busybox目录写入一些数据,之后删除该Pod,再创建一个新的Pod,看之前的数据是否还存在。

#kubectlexec-itceph-pod1--/bin/sh/#lsbindevetchomeprocrootsystmpusrvar/#cd/usr/share/busybox//usr/share/busybox#ls/usr/share/busybox#echo'HellofromKubernetesstorage'>k8s.txt/usr/share/busybox#catk8s.txtHellofromKubernetesstorage/usr/share/busybox#exit#kubectldeletepodceph-pod1pod"ceph-pod1"deleted#kubectlapply-fceph-pod1.yamlpod"ceph-pod1"created#kubectlgetpod-owideNAMEREADYSTATUSRESTARTSAGEIPNODEceph-pod11/1Running015s10.244.91.3node02#kubectlexecceph-pod1--cat/usr/share/busybox/k8s.txtHellofromKubernetesstorage


八、配置动态PV


1.创建RBD pool(ceph)

#cephosdpoolcreatekube128pool'kube'created


2.授权 kube 用户(ceph)

#cephauthget-or-createclient.kubemon'allowr'osd'allowclass-read,allowrwxpool=kube'-oceph.client.kube.keyring#cephauthgetclient.kubeexportedkeyringforclient.kube[client.kube]key=AQB2cFxbYZtRBhAAi6xcvhEW7SYx3PlBY/0O0Q==capsmon="allowr"capsosd="allowclass-read,allowrwxpool=kube"

注:

Ceph使用术语“capabilities”(caps)来描述授权经过身份验证的用户使用监视器、OSD和元数据服务器的功能。功能还可以根据应用程序标记限制对池中的数据,池中的命名空间或一组池的访问。Ceph管理用户在创建或更新用户时设置用户的功能。


Mon 权限: 包括 r 、 w 、 x 。

OSD 权限: 包括 r 、 w 、 x 、 class-read 、 class-write 。另外,还支持存储池和命名空间的配置。


更多详见:http://docs.ceph.com/docs/master/rados/operations/user-management/


3.创建 ceph secret(ceph+kubernetes)

#cephauthget-keyclient.admin|base64##获取client.admin的keyring值,并用base64编码QVFDOUgxdGJIalc4SWhBQTlCOXRNUCs5RUV3N3hiTlE4NTdLVlE9PQ==#cephauthget-keyclient.kube|base64##获取client.kube的keyring值,并用base64编码QVFCMmNGeGJZWnRSQmhBQWk2eGN2aEVXN1NZeDNQbEJZLzBPMFE9PQ==#vimceph-kube-secret.yamlapiVersion:v1kind:Namespacemetadata:name:ceph---apiVersion:v1kind:Secretmetadata:name:ceph-admin-secretnamespace:cephtype:kubernetes.io/rbddata:key:QVFDOUgxdGJIalc4SWhBQTlCOXRNUCs5RUV3N3hiTlE4NTdLVlE9PQ==---apiVersion:v1kind:Secretmetadata:name:ceph-kube-secretnamespace:cephtype:kubernetes.io/rbddata:key:QVFCMmNGeGJZWnRSQmhBQWk2eGN2aEVXN1NZeDNQbEJZLzBPMFE9PQ==#kubectlcreate-fceph-kube-secret.yamlnamespace/cephcreatedsecret/ceph-admin-secretcreatedsecret/ceph-kube-secretcreated#kubectlgetsecret-ncephNAMETYPEDATAAGEceph-admin-secretkubernetes.io/rbd113sceph-kube-secretkubernetes.io/rbd113sdefault-token-tq2rpkubernetes.io/service-account-token313s


4.创建动态RBD StorageClass(kubernetes)

#vimceph-storageclass.yamlapiVersion:storage.k8s.io/v1kind:StorageClassmetadata:name:ceph-rbdannotations:storageclass.kubernetes.io/is-default-class:"true"provisioner:kubernetes.io/rbdparameters:monitors:192.168.100.116:6789,192.168.100.117:6789,192.168.100.118:6789adminId:adminadminSecretName:ceph-admin-secretadminSecretNamespace:cephpool:kubeuserId:kubeuserSecretName:ceph-kube-secretfsType:xfsimageFormat:"2"imageFeatures:"layering"#kubectlcreate-fceph-storageclass.yamlstorageclass.storage.k8s.io/ceph-rbdcreated#kubectlgetscNAMEPROVISIONERAGEceph-rbd(default)kubernetes.io/rbd10s

注:

storageclass.kubernetes.io/is-default-class:注释为true,标记为默认的StorageClass,注释的任何其他值或缺失都被解释为false。

monitors:Ceph监视器,逗号分隔。此参数必需。


adminId:Ceph客户端ID,能够在pool中创建images。默认为“admin”。

adminSecretNamespace:adminSecret的namespace。默认为“default”。

adminSecret:adminId的secret。此参数必需。提供的secret必须具有“kubernetes.io/rbd”类型。


pool:Ceph RBD池。默认为“rbd”。

userId:Ceph客户端ID,用于映射RBD image。默认值与adminId相同。

userSecretName:用于userId映射RBD image的Ceph Secret的名称。它必须与PVC存在于同一namespace中。此参数必需。提供的secret必须具有“kubernetes.io/rbd”类型,例如以这种方式创建:

kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" \ --from-literal=key='QVFEQ1pMdFhPUnQrSmhBQUFYaERWNHJsZ3BsMmNjcDR6RFZST0E9PQ==' \ --namespace=kube-system


fsType:kubernetes支持的fsType。默认值:"ext4"。

imageFormat:Ceph RBD image格式,“1”或“2”。默认值为“1”。

imageFeatures:此参数是可选的,只有在设置imageFormat为“2”时才能使用。目前仅支持的功能为layering。默认为“”,并且未开启任何功能。


默认的StorageClass标记为(default)

详见:https://kubernetes.io/docs/concepts/storage/storage-classes/#ceph-rbd


5.创建Persistent Volume Claim(kubernetes)

动态卷配置的实现基于StorageClass API组中的API对象storage.k8s.io。


集群管理员可以 StorageClass根据需要定义任意数量的对象,每个对象都指定一个卷插件(也称为 配置器),用于配置卷以及在配置时传递给该配置器的参数集。集群管理员可以在集群中定义和公开多种存储(来自相同或不同的存储系统),每种存储都具有一组自定义参数。此设计还确保最终用户不必担心如何配置存储的复杂性和细微差别,但仍可以从多个存储选项中进行选择。


用户通过在其中包含存储类来请求动态调配存储PersistentVolumeClaim。

#vimceph-pvc.yamlapiVersion:v1kind:PersistentVolumeClaimmetadata:name:ceph-pvcnamespace:cephspec:storageClassName:ceph-rbdaccessModes:-ReadOnlyManyresources:requests:storage:1Gi#kubectlcreate-fceph-pvc.yamlpersistentvolumeclaim/ceph-pvccreated#kubectlgetpvc-ncephNAMESTATUSVOLUMEceph-pvcBoundpvc-e55fdebe-9487-11e8-b987-000c29e75f2aCAPACITYACCESSMODESSTORAGECLASSAGE1GiROXceph-rbd5s


6.创建Pod并测试

#vimceph-pod2.yamlapiVersion:v1kind:Podmetadata:name:ceph-pod2namespace:cephspec:containers:-name:ceph-busyboximage:busyboxcommand:["sleep","60000"]volumeMounts:-name:ceph-vol1mountPath:/usr/share/busyboxreadOnly:falsevolumes:-name:ceph-vol1persistentVolumeClaim:claimName:ceph-pvc#kubectlcreate-fceph-pod2.yamlpod/ceph-pod2created#kubectl-ncephgetpodceph-pod2-owideNAMEREADYSTATUSRESTARTSAGEIPNODEceph-pod21/1Running03m10.244.88.2node03#kubectl-ncephexec-itceph-pod2--/bin/sh/#echo'CephfromKubernetesstorage'>/usr/share/busybox/ceph.txt/#exit#kubectl-ncephdeletepodceph-pod2pod"ceph-pod2"deleted#kubectlapply-fceph-pod2.yamlpod/ceph-pod2created#kubectl-ncephgetpodceph-pod2-owideNAMEREADYSTATUSRESTARTSAGEIPNODEceph-pod21/1Running02m10.244.88.2node03#kubectl-ncephexecceph-pod2--cat/usr/share/busybox/ceph.txtCephfromKubernetesstorage


九、使用持久卷部署WordPress和MariaDB

该小节详见:https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/


1.为MariaDB密码创建一个Secret

#kubectl-ncephcreatesecretgenericmariadb-pass--from-literal=password=zhijiansecret/mariadb-passcreated#kubectl-ncephgetsecretmariadb-passNAMETYPEDATAAGEmariadb-passOpaque137s


2.部署MariaDB

MariaDB容器在PersistentVolume上挂载 /var/lib/mysql。

设置MYSQL_ROOT_PASSWORD环境变量从Secret读取数据库密码。

#vimmariadb.yamlapiVersion:v1kind:Servicemetadata:name:wordpress-mariadbnamespace:cephlabels:app:wordpressspec:ports:-port:3306selector:app:wordpresstier:mariadbclusterIP:None---apiVersion:v1kind:PersistentVolumeClaimmetadata:name:mariadb-pv-claimnamespace:cephlabels:app:wordpressspec:storageClassName:ceph-rbdaccessModes:-ReadWriteOnceresources:&

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved