Using Ceph RBD Storage Classes in K8S
Author: netman<netman@study-area.org>
Date: 2019-07-25
一,前言
K8S 中可以使用的 volume 種類非常多,同時也提供 Storage Class 的方式讓管理員更方便的調用定義好的儲存種類。有興趣的話可以參考官方文件:
https://kubernetes.io/docs/concepts/storage/volumes/ https://kubernetes.io/docs/concepts/storage/persistent-volumes https://kubernetes.io/docs/concepts/storage/storage-classes/本篇文章僅以簡單的實作形式來說明如何在 K8S 中使用 Ceph RBD 這一儲存資源。
二,前提條件
在展開實作之前,我們假設如下環境已經建置完成並且正常運作中:
Ceph Storage (monitors: 192.168.100.21-23)
K8S Cluster (用 kubeadm 部署)
這裏不再討論如何建置上述系統了,請另行參考其他文章。
三,實作步驟
3.1 於 ceph 上面建立專用的 pool 並設定帳號權限:
ceph osd pool create kube 32 32 # 具體的 PG number 請根據現況調整
ceph osd pool application enable 'kube' 'rbd'
ceph auth get-or-create client.kube mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=kube'
3.2 記錄如下 base64 編碼值( K8S 設定 secrets 需要一致):
ceph auth get-key client.admin | base64 # 輸出將對應到 k8s 的 ceph-secret-admin secret
ceph auth get-key client.kube | base64 # 輸出將對應到 k8s 的 ceph-secret-kube secret
3.3 在 k8s cluster 中的 worker nodes 上面安裝 ceph-common, 並將 ceph monitor 中的 admin key 檔案複製過來:
yum install -y ceph-common
scp 192.168.100.21:/etc/ceph/ceph.client.admin.keyring /etc/ceph/
3.4 在 k8s 的操作主機(已經設定好context並能順利執行kubectl, 同時也能執行git命令)建立一個專用工作目錄:
mkdir ~/kube-ceph
cd ~/kube-ceph
3.5 建立 secrets yaml:
cat > kube-ceph-secret.yaml << END
apiVersion: v1
kind: Secret
metadata:
name: ceph-secret-admin
type: "kubernetes.io/rbd"
data:
key: QVFEYzF0SmNMaVpkRmhBQWlKbUhNbndaR2tCdldFcThXWDhaaXc9PQ==
---
apiVersion: v1
kind: Secret
metadata:
name: ceph-secret-kube
type: "kubernetes.io/rbd"
data:
key: QVFDSFdUaGROcC9LT2hBQUpkVG5XVUpQUOYrZGtvZ2k3S0Zwc0E9PQ==
END
3.6 建立 Storage Class yaml:
cat > kube-ceph-sc.yaml << END
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: ceph-rbd
#provisionen: kubernetes.io/rbd
provisioner: ceph.com/rbd
parameters:
monitors: 192.168.100.21:6789,192.168.100.22:6789,192.168.100.23:6789
adminId: admin
adminSecretName: ceph-secret-admin
adminSecretNamespace: default
pool: kube
userId: kube
userSecretName: ceph-secret-kube
userSecretNamespace: default
imageFormat: "2"
imageFeatures: layering
END
3.7 建立 Persistent Volume Claim (PVC) yaml:
cat > kube-ceph-pvc.yaml << END
metadata:
name: ceph-k8s-claim
spec:
accessModes:
- ReadWriteOnce
storageClassName: ceph-rbd
resources:
requests:
storage: 1Gi
END
3.8 因爲透過 kubeadm 部署 k8s 的原因,其內建的 provider 並沒有提供 rbd 的支援(provisioner: kubernetes.io/rbd),會遇到如下 error:
persistentvolume-controller Warning ProvisioningFailed Failed to provision volume with StorageClass "ceph-rbd": failed to create rbd image: executable file not found in $PATH, command output:我們需要另行下載並部署延伸支援(provisioner: ceph.com/rbd, 上面的 Storage Class yaml 已經修改爲延伸支援了):
git clone https://github.com/kubernetes-incubator/external-storage
cd external-storage/ceph/rbd/deploy/rbac/
kubectl apply -f ./
3.9 確認 rbd-provisioner pod 有正常運作:
kubectl get pods
# 確定可以看到類似如下的 pod 在 Running 的狀態:
rbd-provisioner-9b8ffbcc-bwzvr 1/1 Running 0 58s3.10 套用 ceph rbd 並將 ceph-rbd Storage Class 設定爲 default:
cd ~/kube-ceph
kubectl apply -f ./
kubectl patch storageclass ceph-rbd -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
3.11 驗收成果
kubectl get StorageClass
# 確認 ceph-rbd 是唯一的 default
NAME PROVISIONER AGE
ceph-rbd (default) ceph.com/rbd 31skubectl get pvc
# 確認 pvc 有正確的 bound 起來
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
ceph-k8s-claim Bound pvc-00840751-aedf-11e9-8a7d-525400b83b04 1Gi RWO ceph-rbd 75s同時,在 ceph 那邊也能看到新的 rbd image 被自動建立起來:
rbd list -p kube
# 可以看到類似如下的結果:
kubernetes-dynamic-pvc-755378b8-aedf-11e9-984f-16b92f3575473.12 將 pvc 實作於 pod 內:
cat > kube-ceph-pod.yaml << END
apiVersion: v1
kind: Pod
metadata:
name: kube-ceph-pod
spec:
containers:
- name: ceph-busybox
image: busybox
command: ["sleep", "60000"]
volumeMounts:
- name: ceph-volume
mountPath: /usr/share/ceph-rbd
readOnly: false
volumes:
- name: ceph-volume
persistentVolumeClaim:
claimName: ceph-k8s-claim
END