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
$ 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 ダイナミック ボリューム プロビジョニングを構成する