ウェブサイト検索

Cephfs を使用した Kubernetes 用 Ceph 永続ストレージ |


前回のチュートリアルでは、Ceph RBD を使用して Kubernetes の永続ストレージを実現する方法について説明しました。約束どおり、この記事では、外部 Ceph Ceph ファイル システムを使用して、Kubernetes コンテナ環境で実行されているアプリケーションの永続データを保存するように Kubernetes を構成することに焦点を当てます。

Ceph を初めて使用するものの、Ceph クラスターを実行している場合は、Ceph ファイル システム (CephFS) は、Ceph の分散オブジェクト ストアである RADOS 上に構築された POSIX 準拠のファイル システムです。強い>。 CephFS は、さまざまなアプリケーションに高可用性、多用途、パフォーマンスの高いファイル ストアを提供するように設計されています。

このチュートリアルでは、Kubernetes と Ceph の概念については深く掘り下げません。これは、Cephfs を使用して Ceph バックエンドで永続ボリュームを自動的にプロビジョニングできるようにするために、Ceph と Kubernetes の両方を構成するための簡単なステップバイステップ ガイドとして機能します。したがって、以下の手順に従って開始してください。

Cephfs を使用した Kubernetes 用 Ceph 永続ストレージ

この演習を開始する前に、動作する外部 Ceph クラスターが必要です。 Ceph を使用したほとんどの Kubernetes デプロイメントには、Rook の使用が含まれます。このガイドは、Ceph Ansible、Ceph Deploy、または手動で Ceph ストレージ クラスターがデプロイされていることを前提としています。

他の Linux ディストリビューションへの Ceph のインストールに関する他のガイドへのリンクを更新する予定です。

ステップ 1: Cephfs Provisioner を Kubernetes にデプロイする

Kubernetes クラスターにログインし、マニフェスト ファイルを作成します。

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 ボリューム プロビジョナー ポッドが実行されていることを確認します。

$ 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 Admin Key を取得し、Kubernetes で Secret を作成する

Ceph クラスターにログインし、RBD プロビジョナーで使用する管理キーを取得します。

sudo ceph auth get-key client.admin

上記のコマンドで出力された管理者ユーザー キーの値を保存します。キーを Kubernetes のシークレットとして追加します。

kubectl create secret generic ceph-admin-secret \
    --from-literal=key='<key-value>' \
    --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 ファイル システムには少なくとも 2 つの RADOS プールが必要です。両方とも次のとおりです。

  • データ
  • メタデータ

通常、メタデータ プールには最大でも数ギガバイトのデータが含まれます。実際には、大規模なクラスターでは 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 ファイル システムを作成します。

sudo ceph fs new cephfs cephfs_metadata cephfs_data

Ceph ファイル システムの作成を確認します。

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

UI ダッシュボードの確認:

ステップ 4: Kubernetes 上に Cephfs ストレージ クラスを作成する

StorageClass は、Kubernetes で提供するストレージの「クラス」を記述する方法を提供します。 cephfs というストレージクラスを作成します。

vim cephfs-sc.yml

ファイルに追加する内容:

---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: cephfs
  namespace: cephfs
provisioner: ceph.com/cephfs
parameters:
    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

どこ :

  • cephfs は、作成する StorageClass の名前です。
  • 10.10.10.11、10.10.10.12、および 10.10.10.13 は Ceph Monitor の 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

利用可能な StorageClass をリストします。

$ 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 上でテスト用のクレームとポッドを作成する

すべてが機能していることを確認するために、テスト永続ボリューム要求を作成しましょう。

$ 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:latest
    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

ポッドが実行状態であることを確認します。

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

Kubernetes での永続ボリューム プロビジョニングに Cephfs を使用してみてください。

同様のガイド:

  • Ceph RBD を使用した Kubernetes の永続ストレージ
  • Heketi と GlusterFS を使用して Kubernetes ダイナミック ボリューム プロビジョニングを構成する

関連記事: