RBD 和 KUBERNETES(pacific版本)
您可以将 Ceph 块设备映像与 Kubernetes v1.13 以及更高版本通过 ceph -csi一起使用,它动态地提供 RBD 映像以支持 Kubernetes 卷并将这些 RBD 映像映射为工作节点上的块设备(可选地挂载映像中包含的文件系统)运行引用 RBD 支持的卷的pod 。Ceph 将块设备映像条带化为整个集群中的对象,这意味着大型 Ceph 块设备映像比独立服务器具有更好的性能!
要将 Ceph 块设备与 Kubernetes v1.13 及更高版本一起使用,您必须在 Kubernetes 环境中进行ceph-csi
安装和配置。
重要:
ceph-csi
默认使用 RBD 内核模块,它可能不支持所有 Ceph CRUSH 可调参数或RBD 映像特性。
1. 创建一个池
默认情况下,Ceph 块设备使用rbd
池。为 Kubernetes 卷存储创建一个池。确保您的 Ceph 集群正在运行,然后创建池。
$ ceph osd pool create kubernetes
有关为池指定归置组数量的详细信息,请参阅创建池,有关应为池设置的归置组数量的详细信息,请参阅归置组。
新创建的池必须在使用前进行初始化。使用rbd
工具初始化池:
$ rbd pool init kubernetes
2. 配置 CEPH-CSI
2.1 设置 CEPH 客户端身份验证
为 Kubernetes 和 ceph -csi 创建一个新用户。执行以下命令并记录生成的密钥:
$ ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes' mgr 'profile rbd pool=kubernetes'
[client.kubernetes]
key = AQD9o0Fd6hQRChAAt7fMaSZXduT3NWEqylNpmg==
2.2 生成CEPH-CSI CONFIGMAP
ceph -csi 需要一个存储在 Kubernetes 中的 ConfigMap 对象来定义 Ceph 集群的 Ceph MON 地址。收集 Ceph 集群唯一 fsid 和MON地址:
$ ceph mon dump
<...>
fsid b9127830-b0cc-4e34-aa47-9d1a2e9949a8
<...>
0: [v2:192.168.1.1:3300/0,v1:192.168.1.1:6789/0] mon.a
1: [v2:192.168.1.2:3300/0,v1:192.168.1.2:6789/0] mon.b
2: [v2:192.168.1.3:3300/0,v1:192.168.1.3:6789/0] mon.c
笔记:
ceph-csi
目前只支持旧版 V1 协议。
生成类似于以下示例的csi-config-map.yaml文件,将 fsid 替换为“clusterID”,并将MON地址替换为“monitors”:
$ cat <<EOF > csi-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
config.json: |-
[
{
"clusterID": "b9127830-b0cc-4e34-aa47-9d1a2e9949a8",
"monitors": [
"192.168.1.1:6789",
"192.168.1.2:6789",
"192.168.1.3:6789"
]
}
]
metadata:
name: ceph-csi-config
EOF
生成后,将新的ConfigMap对象存储在 Kubernetes 中:
$ kubectl apply -f csi-config-map.yaml
2.3 生成CEPH -CSI CEPHX SECRET
ceph -csi 需要 cephx 凭据才能与 Ceph 集群通信。使用新创建的 Kubernetes 用户 id 和 cephx 密钥生成类似于以下示例的csi-rbd-secret.yaml文件:
$ cat <<EOF > csi-rbd-secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: default
stringData:
userID: kubernetes
userKey: AQD9o0Fd6hQRChAAt7fMaSZXduT3NWEqylNpmg==
EOF
生成后,将新的 Secret 对象存储在 Kubernetes 中:
$ kubectl apply -f csi-rbd-secret.yaml
2.4 配置 CEPH-CSI 插件
创建所需的 ServiceAccount 和 RBAC ClusterRole / ClusterRoleBinding Kubernetes 对象。这些对象不一定需要为您的 Kubernetes 环境定制,因此可以从ceph -csi 部署 YAML 中按原样使用:
$ kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-provisioner-rbac.yaml
$ kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-nodeplugin-rbac.yaml
最后,创建 ceph-csi 配置器和节点插件。除了 ceph-csi 容器发布版本之外,这些对象不一定需要为您的 Kubernetes 环境定制,因此可以从 ceph -csi 部署 YAML 中按原样使用:
$ wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml
$ kubectl apply -f csi-rbdplugin-provisioner.yaml
$ wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin.yaml
$ kubectl apply -f csi-rbdplugin.yaml
重要:默认情况下,provisioner 和节点插件 YAML 将拉取 ceph -csi 容器的开发版本 (quay.io/cephcsi/cephcsi:canary)。应更新 YAML 以将发布版本容器用于生产工作负载。
3. 使用 CEPH 块设备
3.1 创建一个存储类
Kubernetes StorageClass 定义了一个存储类。 可以创建多个StorageClass对象以映射到不同的服务质量级别(即 NVMe 与基于 HDD 的池)和功能。
例如,要创建一个映射到上面创建的kubernetes池的 ceph -csi StorageClass , 在确保“clusterID”属性与您的 Ceph 集群的 fsid 匹配后,可以使用以下 YAML 文件:
$ cat <<EOF > csi-rbd-sc.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
clusterID: b9127830-b0cc-4e34-aa47-9d1a2e9949a8
pool: kubernetes
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: default
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete
mountOptions:
- discard
EOF
$ kubectl apply -f csi-rbd-sc.yaml
3.2 创建一个PERSISTENTVOLUMECLAIM
PersistentVolumeClaim是用户对抽象存储资源的请求。然后PersistentVolumeClaim将与Pod资源相关联以提供PersistentVolume,该 PersistentVolume 将由 Ceph 块映像支持。可以包含可选的volumeMode以在已挂载的文件系统(默认)或基于原始块设备的卷之间进行选择。
使用 ceph -csi ,为 volumeMode 指定 Filesystem 可以同时支持 ReadWriteOnce 和 ReadOnlyMany accessMode 声明, 为 volumeMode 指定 Block 可以支持ReadWriteOnce、ReadWriteMany和 ReadOnlyMany accessMode声明。
例如,要使用上面创建的基于 ceph-csi 的StorageClass创建基于块的PersistentVolumeClaim,可以使用以下 YAML 从csi-rbd-sc StorageClass请求原始块存储:
$ cat <<EOF > raw-block-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: raw-block-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Block # 请求原始块设备
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
EOF
$ kubectl apply -f raw-block-pvc.yaml
下面演示了将上述 PersistentVolumeClaim作为原始块设备绑定到Pod资源的示例:
$ cat <<EOF > raw-block-pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: pod-with-raw-block-volume
spec:
containers:
- name: fc-container
image: fedora:26
command: ["/bin/sh", "-c"]
args: ["tail -f /dev/null"]
volumeDevices:
- name: data
devicePath: /dev/xvda # 原始块设备,必须先格式化为文件系统并挂载使用
volumes:
- name: data
persistentVolumeClaim:
claimName: raw-block-pvc
EOF
$ kubectl apply -f raw-block-pod.yaml
要使用上面创建的基于 ceph-csi 的StorageClass创建基于文件系统的PersistentVolumeClaim, 可以使用以下 YAML 从csi-rbd-sc StorageClass请求已安装的文件系统(由 RBD 映像支持):
$ cat <<EOF > pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem # 请求文件系统
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
EOF
$ kubectl apply -f pvc.yaml
下面演示了将上述 PersistentVolumeClaim 绑定到 Pod 资源作为挂载文件系统的示例:
$ cat <<EOF > pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: csi-rbd-demo-pod
spec:
containers:
- name: web-server
image: nginx
volumeMounts:
- name: mypvc
mountPath: /var/lib/www/html # 直接挂载为目录使用
volumes:
- name: mypvc
persistentVolumeClaim:
claimName: rbd-pvc
readOnly: false
EOF
$ kubectl apply -f pod.yaml