使用Ceph RBD的Kubernetes持久存储


从下面的链接下载并以PDF格式支持本文。

theロード下载PDF指南

关门


如何在Kubernetes中使用Ceph RBD进行动态持久卷配置? Kubernetes(K8s)是一个开源系统,用于自动化容器化应用程序的部署,扩展和管理。将状态应用程序部署到Kubernetes时的关键要求之一是数据持久性。本教程介绍了如何在Kubernetes中创建一个存储类,该存储类使用RBD(Ceph块设备)从外部Ceph群集中调配持久卷。

Ceph块设备经过精简配置,可调整大小,并在Ceph集群中的多个OSD中存储条带化数据。 Ceph块设备利用了RADOS功能,例如快照,复制和一致性。 Ceph的RADOS块设备(RBD)使用内核模块或librbd库与OSD进行交互。

在开始本练习之前,您需要一个可用的外部Ceph集群。大多数使用Ceph的Kubernetes部署都涉及使用Rook。在本指南中,Ceph存储集群 头巾Ceph部署 或手动。

如何在Ubuntu 18.04 LTS上安装Ceph Storage Cluster

步骤1:在Kubernetes上部署Ceph Provisioner

登录到Kubernetes集群并创建清单文件以部署RBD供应器。这是Kubernetes 1.5及更高版本的树外动态预配器。

$ vim ceph-rbd-provisioner.yml

将以下内容添加到文件中:由于此部署使用RBAC,因此在创建服务帐户和部署Ceph RBD供应商之前,请先创建群集角色和绑定。

---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: rbd-provisioner
  namespace: kube-system
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
  namespace: kube-system
subjects:
  - kind: ServiceAccount
    name: rbd-provisioner
    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: rbd-provisioner
  apiGroup: rbac.authorization.k8s.io

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: rbd-provisioner
  namespace: kube-system
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
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: rbd-provisioner
subjects:
- kind: ServiceAccount
  name: rbd-provisioner
  namespace: kube-system

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rbd-provisioner
  namespace: kube-system
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

通过应用文件创建资源。

$ kubectl apply -f ceph-rbd-provisioner.yml
clusterrole.rbac.authorization.k8s.io/rbd-provisioner created
clusterrolebinding.rbac.authorization.k8s.io/rbd-provisioner created
role.rbac.authorization.k8s.io/rbd-provisioner created
rolebinding.rbac.authorization.k8s.io/rbd-provisioner created
deployment.apps/rbd-provisioner created

验证RBD卷设置窗格是否正在运行。

$ kubectl get pods -l app=rbd-provisioner -n kube-system
NAME                               READY   STATUS    RESTARTS   AGE
rbd-provisioner-75b85f85bd-p9b8c   1/1     Running   0          3m45s

步骤2:取得Ceph​​管理金钥并在Kubernetes中建立机密

登录到Ceph集群并获取RBD供应商使用的管理密钥。

$ sudo ceph auth get-key client.admin

保存上述命令输出的admin用户密钥值。将密钥作为秘密添加到Kubernetes。

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

哪里 您的ceph管理员密钥。您可以使用以下命令确认创建。

$ kubectl get secrets ceph-admin-secret -n kube-system 
NAME                TYPE                DATA   AGE
ceph-admin-secret   kubernetes.io/rbd   1      5m

步骤3:为Kubernetes和客户端密钥创建一个Ceph池

接下来,为Kubernetes创建一个新的Ceph池。

$ sudo ceph ceph osd pool create  

# Example
$ sudo ceph ceph osd pool create k8s 100

查看指南以获取更多信息:在Ceph Storage Cluster中创建池

接下来,创建一个可以访问创建的池的新客户端密钥。

$ sudo ceph auth add client.kube mon 'allow r' osd 'allow rwx pool='

# Example
$ sudo ceph auth add client.kube mon 'allow r' osd 'allow rwx pool=k8s'

哪里 8秒 在Ceph中创建的池的名称。

然后,您可以将池与应用程序关联并对其进行初始化。

sudo ceph osd pool application enable  rbd
sudo rbd pool init 

使用Ceph获取客户端密钥。

$ sudo ceph auth get-key client.kube

使用Kubernetes创建客户端机密

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

哪里 Ceph客户端密钥。

步骤4:创建RBD存储类

StorageClass提供了一种描述Kubernetes提供的存储“类”的方法。创建一个名为ceph-rbd的存储类。

$ vim ceph-rbd-sc.yml

什么添加到文件:

---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: ceph-rbd
provisioner: ceph.com/rbd
parameters:
  monitors: 10.10.10.11:6789, 10.10.10.12:6789, 10.10.10.13:6789
  pool: k8s-uat
  adminId: admin
  adminSecretNamespace: kube-system
  adminSecretName: ceph-admin-secret
  userId: kube
  userSecretNamespace: kube-system
  userSecretName: ceph-k8s-secret
  imageFormat: "2"
  imageFeatures: layering

其中:

  • 头孢 要创建的StorageClass的名称。
  • 10.10.10.11、10.10.10.12和10.10.10.13 Ceph监控器的IP地址。您可以使用以下命令列出它们:
$ sudo ceph -s
  cluster:
    id:     7795990b-7c8c-43f4-b648-d284ef2a0aba
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum cephmon01,cephmon02,cephmon03 (age 32h)
    mgr: cephmon01(active, since 30h), standbys: cephmon02
    mds: cephfs:1 {0=cephmon01=up:active} 1 up:standby
    osd: 9 osds: 9 up (since 32h), 9 in (since 32h)
    rgw: 3 daemons active (cephmon01, cephmon02, cephmon03)
 
  data:
    pools:   8 pools, 618 pgs
    objects: 250 objects, 76 KiB
    usage:   9.6 GiB used, 2.6 TiB / 2.6 TiB avail
    pgs:     618 active+clean

在使用正确的Ceph监视器值修改文件后,应用配置。

$ kubectl apply -f ceph-rbd-sc.yml
storageclass.storage.k8s.io/ceph-rbd created

列出可用的StorageClasses。

kubectl get sc
NAME       PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
ceph-rbd   ceph.com/rbd      Delete          Immediate           false                  17s
cephfs     ceph.com/cephfs   Delete          Immediate           false                  18d

步骤4:在Kubernetes中创建测试声明和Pod

让我们创建一个测试持久卷声明,以确保一切正常。

$ vim ceph-rbd-claim.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ceph-rbd-claim1
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: ceph-rbd
  resources:
    requests:
      storage: 1Gi

通过应用清单文件创建索赔。

$ kubectl apply -f ceph-rbd-claim.yml
persistentvolumeclaim/ceph-rbd-claim1 created

如果绑定成功, 结界 状态。

$ kubectl get pvc
NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
ceph-rbd-claim1   Bound    pvc-c6f4399d-43cf-4fc1-ba14-cc22f5c85304   1Gi        RWO            ceph-rbd       43s

听起来不错。您可以使用CephRBD后端创建动态持久卷请求。请注意,您无需在声明之前手动创建持久卷。那有多酷?

如果您有Ceph仪表板,则可以看到创建的新块图像。

使用Ceph RBD的Kubernetes持久存储

以下指南介绍了将Ceph文件系统与Kubernetes一起使用以进行动态持久卷配置。

标签:

  • 将Ceph RBD与Kubernetes结合使用
  • 使用Ceph RBD的Kubernetes动态存储配置
  • 在Kubernetes上使用外部Ceph
  • Kubernetes与Ceph RBD

类似指南:

如何使用Heketi和GlusterFS配置Kubernetes动态卷配置

在CentOS 8 / CentOS 7上使用Heketi设置GlusterFS存储

适用于Kubernetes和Docker容器的最佳存储解决方案


从下面的链接下载并以PDF格式支持本文。

theロード下载PDF指南

关门


Sidebar