ウェブサイト検索

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


Kubernetes の動的永続ボリューム プロビジョニングに Ceph RBD を使用するにはどうすればよいですか? Kubernetes (K8s) は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのオープンソース システムです。 Kubernetes にステートフル アプリケーションをデプロイする際の重要な要件の 1 つは、データの永続性です。このチュートリアルでは、RBD (Ceph Block Device) を使用して外部 Ceph クラスターから永続ボリュームをプロビジョニングするストレージ クラスを Kubernetes 上に作成する方法を見ていきます。

Ceph ブロック デバイスはシン プロビジョニングされ、サイズ変更可能で、Ceph クラスター内の複数の OSD にストライプ化されたデータを保存します。 Ceph ブロック デバイスは、スナップショット、レプリケーション、整合性などの RADOS 機能を活用します。 Ceph の RADOS ブロック デバイス (RBD) は、カーネル モジュールまたはlibrbd ライブラリを使用して OSD と対話します。

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

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

Kubernetes クラスターにログインし、Kubernetes 1.5 以降のツリー外の動的プロビジョナーである RBD プロビジョナーをデプロイするためのマニフェスト ファイルを作成します。

vim ceph-rbd-provisioner.yml

次の内容をファイルに追加します。このデプロイメントでは RBAC が使用されていることに注意してください。そのため、サービス アカウントを作成して Ceph RBD プロビジョナーをデプロイする前に、クラスターのロールとバインディングを作成します。

---
kind: ServiceAccount
apiVersion: v1
metadata:
  name: rbd-provisioner
  namespace: kube-system
---
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 Admin Key を取得し、Secret を作成する

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

sudo ceph auth get-key client.admin

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

kubectl create secret generic ceph-admin-secret \
  --type="kubernetes.io/rbd" \
  --from-literal=key='<key-value>' \
  --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 <pool-name> <pg-number>

# 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=<pool-name>'

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

ここで、 k8s は Ceph で作成されたプールの名前です。

その後、プールをアプリケーションに関連付けて初期化できます。

sudo ceph osd pool application enable <pool-name> rbd
sudo rbd pool init <pool-name>

Ceph でクライアント キーを取得します。

sudo ceph auth get-key client.kube

Kubernetes でクライアント シークレットを作成する

kubectl create secret generic ceph-k8s-secret \
  --type="kubernetes.io/rbd" \
  --from-literal=key='<key-value>' \
  --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

どこ :

  • ceph-rbd は、作成する 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 apply -f ceph-rbd-sc.yml
storageclass.storage.k8s.io/ceph-rbd created

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

$ 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

ステップ 5: テスト用のクレームとポッドを作成する

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

$ 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

いいですね! Ceph RBD バックエンドで動的な Persistent Volume Claim を作成できます。クレームの前に永続ボリュームを手動で作成する必要がないことに注目してください。なんてカッコいいのでしょう...

次に、作成したクレームを使用してテスト ポッドをデプロイできます。まず、データを保持するファイルを作成します。

vim rbd-test-pod.yaml

追加 :

---
kind: Pod
apiVersion: v1
metadata:
  name: rbd-test-pod
spec:
  containers:
  - name: rbd-test-pod
    image: busybox
    command:
      - "/bin/sh"
    args:
      - "-c"
      - "touch /mnt/RBD-SUCCESS && exit 0 || exit 1"
    volumeMounts:
      - name: pvc
        mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: pvc
      persistentVolumeClaim:
        claimName: ceph-rbd-claim1 

ポッドを作成します。

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

ポッドについて説明すると、ボリュームの接続が成功したことがわかります。

$ kubectl describe pod rbd-test-pod
.....
vents:
  Type    Reason                  Age        From                     Message
  ----    ------                  ----       ----                     -------
  Normal  Scheduled               <unknown>  default-scheduler        Successfully assigned default/rbd-test-pod to rke-worker-02
  Normal  SuccessfulAttachVolume  3s         attachdetach-controller  AttachVolume.Attach succeeded for volume "pvc-c6f4399d-43cf-4fc1-ba14-cc22f5c85304"

Ceph Dashboard をお持ちの場合は、新しいブロック イメージが作成されたことを確認できます。

次のガイドでは、動的永続ボリューム プロビジョニングのための Kubernetes での Ceph ファイル システムの使用について説明します。

タグ :

  • Kubernetes で Ceph RBD を使用する
  • Ceph RBD を使用した Kubernetes 動的ストレージ プロビジョニング
  • Kubernetes での外部 Ceph の使用
  • Ceph RBD を使用した Kubernetes

同様のガイド:

  • NFS を Kubernetes 永続ボリューム ストレージとして構成する
  • Kubernetes クラスターに Rook Ceph Storage をデプロイする方法
  • Heketi と GlusterFS を使用して Kubernetes ダイナミック ボリューム プロビジョニングを構成する方法
  • CentOS 8/CentOS 7 で Heketi を使用して GlusterFS ストレージをセットアップする
  • Kubernetes および Docker コンテナに最適なストレージ ソリューション

関連記事: