使用Cephfs的Kubernetes的Ceph永久存储


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

theロード下载PDF指南

关门


在上一教程中,我解释了如何: 使用Ceph RBD的Kubernetes持久存储。如所承诺的,本文重点介绍如何配置Kubernetes以使用外部Ceph Ceph文件系统来存储在Kubernetes容器环境中运行的应用程序的持久数据。

如果您是第一次使用Ceph,则可以使用Ceph集群,CephFS)是在Ceph的分布式对象存储之上构建的POSIX兼容文件系统。 拉多斯。 CephFS旨在为各种应用程序提供高可用性,多功能,高性能的文件存储。

本教程没有详细介绍Kubernetes和Ceph的概念。它是配置Ceph和Kubernetes的简单分步指南,并允许Cephfs使用Cephfs在Ceph后端自动设置持久卷。请按照以下步骤开始。

使用Cephfs的Kubernetes的Ceph永久存储

在开始本练习之前,您需要在室外工作
Ceph集群。对于大多数使用Ceph的Kubernetes部署,
路加在本指南中,Ceph存储集群 头巾Ceph部署 或手动。

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

更新有关在其他Linux发行版上安装Ceph的其他指南的链接。

步骤1:在Kubernetes上部署Cephfs Provisioner

登录Kubernetes集群并创建清单文件
部署RBD供应商,这是动态的供应商
对于Kubernetes 1.5或更高版本。

$ vim cephfs-provisioner.yml

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

---
kind: Namespace
apiVersion: v1
metadata:
  name: cephfs

---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: cephfs-provisioner
  namespace: cephfs
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"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: cephfs-provisioner
  namespace: cephfs
subjects:
  - kind: ServiceAccount
    name: cephfs-provisioner
    namespace: cephfs
roleRef:
  kind: ClusterRole
  name: cephfs-provisioner
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: cephfs-provisioner
  namespace: cephfs
rules:
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["create", "get", "delete"]
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: cephfs-provisioner
  namespace: cephfs
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: cephfs-provisioner
subjects:
- kind: ServiceAccount
  name: cephfs-provisioner
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: cephfs-provisioner
  namespace: cephfs
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cephfs-provisioner
  namespace: cephfs
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cephfs-provisioner
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: cephfs-provisioner
    spec:
      containers:
      - name: cephfs-provisioner
        image: "quay.io/external_storage/cephfs-provisioner:latest"
        env:
        - name: PROVISIONER_NAME
          value: ceph.com/cephfs
        - name: PROVISIONER_SECRET_NAMESPACE
          value: cephfs
        command:
        - "/usr/local/bin/cephfs-provisioner"
        args:
        - "-id=cephfs-provisioner-1"
      serviceAccount: cephfs-provisioner

应用清单:

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

验证Cephfs Volume Provisioning窗格是否正在运行。

$ kubectl get pods -l app=cephfs-provisioner -n cephfs
NAME                                  READY   STATUS    RESTARTS   AGE
cephfs-provisioner-7b77478cb8-7nnxs   1/1     Running   0          84s

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

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

$ sudo ceph auth get-key client.admin

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

$ kubectl create secret generic ceph-admin-secret 
    --from-literal=key='' 
    --namespace=cephfs

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

$ kubectl get secrets ceph-admin-secret -n cephfs
NAME                TYPE     DATA   AGE
ceph-admin-secret   Opaque   1      6s

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

Ceph文件系统具有 至少两个RADOS池:对于两者:

  • 资料
  • 元数据

通常,元数据池最多包含数GB的数据。对于大型群集,实际上通常使用64或128。因此,通常建议减少PG的数量。

让我们为Kubernetes创建一个Ceph OSD池。

$ sudo ceph osd pool create cephfs_data 128 128
$ sudo ceph osd pool create cephfs_metadata 64 64

在池中创建一个ceph文件系统。

$ ceph fs new   
$ ceph fs new cephfs cephfs_data  cephfs_metadata 

确认创建Ceph文件系统。

$ sudo ceph fs ls
 name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

检查UI仪表板:

步骤4:在Kubernetes中创建一个Cephfs存储类

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

$ vim cephfs-sc.yml

什么添加到文件:

---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: cephfs
  namespace: cephfs
provisioner: ceph.com/cephfs
parameters:
    monitors: monitors: 10.10.10.11:6789,10.10.10.12:6789,10.10.10.13:6789
    adminId: admin
    adminSecretName: ceph-admin-secret
    adminSecretNamespace: cephfs
    claimRoot: /pvc-volumes

其中:

  • 塞夫 要创建的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命令创建StorageClass。

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

列出可用的StorageClasses。

$ kubectl get sc
NAME       PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
ceph-rbd   ceph.com/rbd      Delete          Immediate           false                  25h
cephfs     ceph.com/cephfs   Delete          Immediate           false                  2m23s

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

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

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

应用清单文件。

$ kubectl  apply -f cephfs-claim.yml
persistentvolumeclaim/cephfs-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       25h
cephfs-claim1     Bound    pvc-1bfa81b6-2c0b-47fa-9656-92dc52f69c52   1Gi        RWO            cephfs         87s

然后,您可以使用创建的声明来部署测试平台。首先,创建一个文件来保存数据。

$ vim cephfs-test-pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name: test-pod
    image: gcr.io/google_containers/busybox:1.24
    command:
      - "/bin/sh"
    args:
      - "-c"
      - "touch /mnt/SUCCESS && exit 0 || exit 1"
    volumeMounts:
      - name: pvc
        mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: pvc
      persistentVolumeClaim:
        claimName: claim1

创建一个吊舱。

$ kubectl apply -f cephfs-test-pod.yaml
pod/test-pod created

确保Pod正在运行。

$ kubectl get  pods test-pod
NAME              READY   STATUS    RESTARTS   AGE
test-pod   0/1     Completed   0          2m28s

使用Cephfs与Kubernetes进行持久卷配置。

类似指南:

使用Ceph RBD的Kubernetes持久存储

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


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

theロード下载PDF指南

关门


Sidebar