kubernetes集群下的分布式存储方案-ceph

Ceph跟K8S进行集成

复制代码
# github官网:
    https://github.com/kubernetes/examples/tree/master/volumes/cephfs/
​
# k8s官网:
    https://kubernetes.io/docs/concepts/storage/volumes/#cephfs
    
# ceph官网
    https://docs.ceph.com/en/reef/rbd/rbd-kubernetes/
​
# 参考:
    《HCIE-openEuler V1.0 实验手册》

环境信息

1、k8s集群

主机名 IP地址 操作系统 配置 关键组件
k8s-master01 172.16.90.11 Rocky Linux release 9 2颗CPU 4G内存 100G硬盘 kube-apiserver, etcd, etc
k8s-node01 172.16.90.12 Rocky Linux release 9 2颗CPU 4G内存 100G硬盘 kubelet, kube-proxy
k8s-node02 172.16.90.13 Rocky Linux release 9 2颗CPU 4G内存 100G硬盘 kubelet, kube-proxy
复制代码
# 为了方便管理,k8s配置dashboard,本文采用kubesphere
# 只在master节点部署,前提是已经安装helm
[root@k8s-master01 ~]# helm upgrade --install -n kubesphere-system --create-namespace ks-core https://charts.kubesphere.com.cn/main/ks-core-1.1.4.tgz --set global.imageRegistry=swr.cn-southwest-2.myhuaweicloud.com/ks --set extension.imageRegistry=swr.cn-southwest-2.myhuaweicloud.com/ks --debug --wait
​
# Access the KubeSphere Console
http://172.16.90.11:30880
​
# Login to KubeSphere Console
​
    Use the following credentials to log in:
​
    Account: admin
    Password: P@88w0rd  # 第一次登录需要修改密码

2、ceph集群

主机名 IP地址 操作系统 配置 作用
serverc.lab.example.com 172.16.90.91 Rocky Linux release 8 2颗CPU 2G内存 40G硬盘 3*30G硬盘 存储节点
serverd.lab.example.com 172.16.90.92 Rocky Linux release 8 2颗CPU 2G内存 40G硬盘 3*30G硬盘 存储节点
servere.lab.example.com 172.16.90.93 Rocky Linux release 8 2颗CPU 2G内存 40G硬盘 3*30G硬盘 存储节点
clienta.lab.example.com 172.16.90.94 Rocky Linux release 8 2颗CPU 2G内存 40G硬盘 3*30G硬盘 管理节点
复制代码
# ceph dashboard
https://172.16.90.91:8443/
admin/redhat
复制代码
# 内置了Prometheus和Grafana
https://172.16.90.91:3000/
复制代码
# ceph 和 k8s 集群各节点互相添加hosts解析
# 最终的hosts文件如下
# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.90.91 serverc.lab.example.com serverc
172.16.90.92 serverd.lab.example.com serverd
172.16.90.93 servere.lab.example.com servere
172.16.90.94 client.lab.example.com client
172.16.90.11 k8s-master01
172.16.90.12 k8s-node01
172.16.90.13 k8s-node02

实验介绍

关于本实验

本实验通过 ceph 的对接使用,实现对于 Kubernetes 后端块存储和文件存储的实践。

实验目的

  • 理解 volume 挂载 ceph-rbd 的方法。(k8s v1.31 版本将删除Ceph RBD 卷插件及其 CSI 迁移支持*,rbd*卷类型将无法继续使用。 建议你在集群中使用RBD CSI 驱动。)

  • 理解 PV 和 PVC 挂载 ceph-rbd 的方法。

  • 掌握 StorageClass 挂载 ceph-rbd 的方法。

  • 掌握 StorageClass 挂载 cephfs 的方法。

实验步骤

一、K8S连接Ceph步骤

1.1、kubernetes的主机上安装ceph客户端
复制代码
所有节点安装ceph-common
添加ceph的yum源:
​
cat > /etc/yum.repos.d/ceph.repo <<EOF
[Ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-quincy/el9/x86_64
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
​
[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-quincy/el9/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
​
[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-quincy/el9/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
EOF
​
安装ceph-common:
​
yum install ceph-common -y
1.2、配置ceph配置文件
复制代码
将ceph配置文件拷贝到各个k8s的node节点
[root@serverc ~]# scp -r /etc/ceph/ k8s-master01:/etc/
[root@serverc ~]# scp -r /etc/ceph/ k8s-node01:/etc/
[root@serverc ~]# scp -r /etc/ceph/ k8s-node02:/etc/
1.3、ceph新建pool、user
复制代码
# 1、新建一个pool
[root@k8s-master01 ~]# ceph osd pool create kubernetes
pool 'kubernetes' created
​
# 新创建的池必须在使用前进行初始化。
[root@k8s-master01 ~]# rbd pool init kubernetes
​
# 2、为 Kubernetes 和ceph-csi创建新用户,且只能使用指定的pool(kubernetes)
[root@k8s-master01 ceph_test]# ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes' mgr 'profile rbd pool=kubernetes'
[client.kubernetes]
    key = AQDzrfhnNp+hKBAA2GMeQxl15tApNLx4Pg+oIA==
​
# 3、查看用户
[root@k8s-master01 ceph_test]# ceph auth  ls | grep -A 3 client.kubernetes
installed auth entries:
​
client.kubernetes
    key: AQDzrfhnNp+hKBAA2GMeQxl15tApNLx4Pg+oIA==
    caps: [mgr] profile rbd pool=kubernetes
    caps: [mon] profile rbd
​
# 4、对这个用户进行加密,后面的secret会用到
[root@k8s-master01 ceph_test]# echo AQDzrfhnNp+hKBAA2GMeQxl15tApNLx4Pg+oIA== | base64
QVFEenJmaG5OcCtoS0JBQTJHTWVReGwxNXRBcE5MeDRQZytvSUE9PQo=
​
# 5、查看mon地址
[root@k8s-master01 ~]# ceph mon dump
epoch 4
fsid 368690e6-ef0f-11ee-a429-defa6053e742
last_changed 2024-03-31T03:41:23.472436+0000
created 2024-03-31T03:33:15.412646+0000
min_mon_release 16 (pacific)
election_strategy: 1
0: [v2:172.16.90.91:3300/0,v1:172.16.90.91:6789/0] mon.serverc.lab.example.com
1: [v2:172.16.90.93:3300/0,v1:172.16.90.93:6789/0] mon.servere
2: [v2:172.16.90.92:3300/0,v1:172.16.90.92:6789/0] mon.serverd
3: [v2:172.16.90.94:3300/0,v1:172.16.90.94:6789/0] mon.client
dumped monmap epoch 4

二、StorageClass集成Ceph

下图展示了 Kubernetes/Ceph 技术栈

2.1 Storage Class的作用

简单来说,storage配置了要访问ceph RBD的IP/Port、用户名、keyring、pool,等信息,我们不需要提前创建image;当用户创建一个PVC时,k8s查找是否有符合PVC请求的storage class类型,如果有,则依次执行如下操作:

  • 到ceph集群上创建image

  • 创建一个PV,名字为pvc-xx-xxx-xxx,大小pvc请求的storage。

  • 将上面的PV与PVC绑定,格式化后挂到容器中

通过这种方式管理员只要创建好storage class就行了,后面的事情用户自己就可以搞定了。如果想要防止资源被耗尽,可以设置一下Resource Quota。

当pod需要一个卷时,直接通过PVC声明,就可以根据需求创建符合要求的持久卷。

2.2 配置 ceph-csi

Ceph CSI (Container Storage Interface)

Ceph CSI(容器存储接口)是 Ceph 社区为 Kubernetes 开发的一个插件,它允许 Kubernetes 使用 Ceph 的块存储功能。CSI 是 Kubernetes 存储生态的一部分,用于标准化各种存储系统的集成方式。

CSI 的作用:

  • 标准化接口:CSI 提供了一个标准的接口,使得 Kubernetes 可以与不同的存储系统交互。

  • 存储管理:通过 CSI 插件,Kubernetes 可以创建、删除、挂载和卸载存储卷。

  • 动态配置:支持动态配置存储类(StorageClass),这允许用户定义存储需求,并由 Kubernetes 动态地分配资源。

前提配置

  • 确保Ceph集群和Kubernetes集群已经正确部署并运行稳定。

  • 配置MDS服务,确保CephFS可以使用。

  • 创建存储池和文件系统,为CephFS接口准备必要的存储资源。

  • 确保K8S和Ceph版本有所匹配。

Ceph CSI github地址:GitHub - ceph/ceph-csi at release-v3.14

Ceph CSI drivers are currently developed and tested exclusively in Kubernetes environments.

Ceph CSI Version Container Orchestrator Name Version Tested
v3.14.0 Kubernetes v1.30, v1.31, v1.32
v3.13.1 Kubernetes v1.29, v1.30, v1.31
v3.13.0 Kubernetes v1.29, v1.30, v1.31

There is work in progress to make this CO-independent and thus support other

1、生成ceph-csi ConfigMap

生成类似于以下示例的csi-config-map.yaml文件,将fsid替换为"clusterID",将监视器地址替换为"monitors":

复制代码
在上面的步骤,我们已经在ceph集群用创建了我们所需的信息,现在在k8s集群中使用起来
# 1、新建目录
[root@k8s-master01 ~]# mkdir /app/ceph_test -p ;cd  /app/ceph_test
​
# 2、创建secret的yaml文件
[root@k8s-master01 ceph_test]# cat csi-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
  config.json: |-
    [
      {
        "clusterID": "368690e6-ef0f-11ee-a429-defa6053e742",
        "monitors": [
          "172.16.90.91:6789",
          "172.16.90.92:6789",
          "172.16.90.93:6789"
        ]
      }
    ]
metadata:
  name: ceph-csi-config
​
# 3、create这个ConfigMap
生成后,将新的ConfigMap对象存储在 Kubernetes 中:
[root@k8s-master01 ceph_test]# kubectl apply -f csi-config-map.yaml 
configmap/ceph-csi-config created
​
最新版本的ceph-csi还需要一个额外的ConfigMap对象来定义密钥管理服务 (KMS) 提供程序的详细信息。如果未设置 KMS,请在csi-kms-config-map.yaml文件中放入一个空配置,或参考https://github.com/ceph/ceph-csi/tree/master/examples/kms上的示例:
​
$ cat <<EOF > csi-kms-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
  config.json: |-
    {}
metadata:
  name: ceph-csi-encryption-kms-config
EOF
​
生成后,将新的ConfigMap对象存储在 Kubernetes 中:
$ kubectl apply -f csi-kms-config-map.yaml
​
ceph-csi的最新版本还需要另一个ConfigMap对象来定义 Ceph 配置,以添加到 CSI 容器内的 ceph.conf 文件中:
​
$ cat <<EOF > ceph-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
  ceph.conf: |
    [global]
    auth_cluster_required = cephx
    auth_service_required = cephx
    auth_client_required = cephx
  # keyring is a required key and its value should be empty
  keyring: |
metadata:
  name: ceph-config
EOF
生成后,将新的ConfigMap对象存储在 Kubernetes 中:
​
$ kubectl apply -f ceph-config-map.yaml

2、生成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: AQDzrfhnNp+hKBAA2GMeQxl15tApNLx4Pg+oIA==
EOF

生成后,将新的Secret对象存储在 Kubernetes 中:

复制代码
$ kubectl apply -f csi-rbd-secret.yaml

3、配置ceph-csi插件

创建所需的ServiceAccount和 RBAC ClusterRole / ClusterRoleBinding Kubernetes 对象。这些对象无需根据你的 Kubernetes 环境进行定制,因此可以直接从ceph-csi 部署 YAML 中使用:

复制代码
操作之前先去除 master节点污点
# master 去除污点
[root@k8s-master01 ceph_test]# kubectl describe nodes k8s-master01 | grep -i taint
Taints:             node-role.kubernetes.io/control-plane:NoSchedule
[root@k8s-master01 ceph_test]# kubectl taint node k8s-master01 node-role.kubernetes.io/control-plane:NoSchedule-
node/k8s-master01 untainted
​
$ 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
$ wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin.yaml
​
此处需要修改镜像地址:
[root@k8s-master01 ceph_test]# grep -i image: csi-rbdplugin-provisioner.yaml
          image: quay.io/cephcsi/cephcsi:canary
          #image: registry.k8s.io/sig-storage/csi-provisioner:v5.1.0
          image: registry.cn-hangzhou.aliyuncs.com/google_containers/csi-provisioner:v5.1.0
          #image: registry.k8s.io/sig-storage/csi-snapshotter:v8.2.0
          image: registry.cn-hangzhou.aliyuncs.com/google_containers/csi-snapshotter:v8.2.0
          #image: registry.k8s.io/sig-storage/csi-attacher:v4.8.0
          image: registry.cn-hangzhou.aliyuncs.com/google_containers/csi-attacher:v4.8.0
          #image: registry.k8s.io/sig-storage/csi-resizer:v1.13.1
          image: registry.cn-hangzhou.aliyuncs.com/google_containers/csi-resizer:v1.13.1
          image: quay.io/cephcsi/cephcsi:canary
          image: quay.io/cephcsi/cephcsi:canary
[root@k8s-master01 ceph_test]# grep -i image: csi-rbdplugin.yaml 
          image: quay.io/cephcsi/cephcsi:canary
          #image: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.13.0
          image: registry.cn-hangzhou.aliyuncs.com/google_containers/csi-node-driver-registrar:v2.13.0
          image: quay.io/cephcsi/cephcsi:canary
​
$ kubectl apply -f csi-rbdplugin-provisioner.yaml
$ kubectl apply -f csi-rbdplugin.yaml
2.3 使用 Ceph 块设备

1、创建StorageClass

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: 368690e6-ef0f-11ee-a429-defa6053e742
   pool: kubernetes
   imageFeatures: layering
   csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
   csi.storage.k8s.io/provisioner-secret-namespace: default
   csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
   csi.storage.k8s.io/controller-expand-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
allowVolumeExpansion: true
mountOptions:
   - discard
EOF
$ kubectl apply -f csi-rbd-sc.yaml

2、创建PersistentVolumeClaim

PersistentVolumeClaim是用户对抽象存储资源的请求。PersistentVolumeClaim随后会关联到Pod资源,以配置一个PersistentVolume,该卷将由 Ceph 块镜像支持。可以包含可选的volumeMode ,用于在已挂载的文件系统(默认)或基于原始块设备的卷之间进行选择。

使用ceph-csi,为volumeMode指定Filesystem可以支持 ReadWriteOnce和ReadOnlyMany accessMode声明, 为volumeMode指定Block可以支持ReadWriteOnce、ReadWriteMany和 ReadOnlyMany accessMode声明。

例如,要创建一个基于块的PersistentVolumeClaim,该 PersistentVolumeClaim 利用上面创建的基于ceph-csi的StorageClass,可以使用以下 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

查看:

复制代码
[root@k8s-master01 ceph_test]# kubectl get pv,pvc,pod
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
persistentvolume/pvc-7f2800ad-68c4-438c-8413-95e32c0e3995   1Gi        RWO            Delete           Bound    default/raw-block-pvc   csi-rbd-sc     <unset>                          46m
​
NAME                                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
persistentvolumeclaim/raw-block-pvc   Bound    pvc-7f2800ad-68c4-438c-8413-95e32c0e3995   1Gi        RWO            csi-rbd-sc     <unset>                 46m
​
NAME                                             READY   STATUS    RESTARTS      AGE
pod/csi-rbdplugin-kfwgw                          3/3     Running   0             47m
pod/csi-rbdplugin-nmn5h                          3/3     Running   0             47m
pod/csi-rbdplugin-provisioner-777d6d9654-5rmkp   7/7     Running   3 (15m ago)   48m
pod/csi-rbdplugin-provisioner-777d6d9654-cjhjb   7/7     Running   0             48m
pod/csi-rbdplugin-provisioner-777d6d9654-h289k   7/7     Running   2 (15m ago)   48m
pod/csi-rbdplugin-vslhw                          3/3     Running   0             47m
pod/pod-with-raw-block-volume                    1/1     Running   0             45m

创建一个基于文件系统PersistentVolumeClaim其利用 ceph- CSI基StorageClass上面创建,以下YAML可以用于请求安装从文件系统(由RBD图像支持)CSI -rbd-SC StorageClass:

复制代码
$ cat <<EOF > pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rbd-pvc
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem  # 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:1.17.1
      volumeMounts:
        - name: mypvc
          mountPath: /var/www/html
  volumes:
    - name: mypvc
      persistentVolumeClaim:
        claimName: rbd-pvc
        readOnly: false
EOF
$ kubectl apply -f pod.yaml

三、StorageClass对接 CephFS

3.1 创建Cephfs文件系统

Cephfs类型的CSI提供了指定使用哪一个Cephfs文件系统的参数,我们可以在Ceph集群中再创建一个Cephfs文件系统,专门为Storageclass使用。

复制代码
1.创建Cephfs使用的资源池
# ceph osd pool create k8s_cephfs_data 64
# ceph osd pool create k8s_cephfs_metadata 64
​
2.创建cephfs文件系统
# ceph fs new k8s_cephfs k8s_cephfs_metadata k8s_cephfs_data
​
部署MDS
# ceph orch apply mds k8s_cephfs --placement="3 ceph1 ceph2 ceph3"
​
3、在Cephfs文件系统中创建一个子卷
StorageClass使用Cephfs-CSI客户端将数据持久化到Cephfs文件系统时,无法指定Cephfs文件系统中现有的子目录进行挂载,只能将数据写在文件系统的/目录中,这是Cephfs-CSI程序内部写死的,无法进行配置,除非修改源代码。
volumes目录是无法修改的,只能修改volumes目录中的子目录csi,Cephfs-CSI会在Ceph集群指定的Cephfs文件系统中创建一个子卷,这个目录就对应的就是子卷的名称。
​
下面我们来创建一个子卷。
​
命令格式:ceph fs subvolumegroup create {cephfs文件系统名称} {子卷名称}
1>.创建子卷
# ceph fs subvolumegroup create k8s_cephfs csi
2>.查看文件系统下所有的子卷
[root@k8s-master01 ceph_test]# ceph fs subvolumegroup ls k8s_cephfs
[
    {
        "name": "csi"
    }
]
3.2 在K8S集群中部署Cephfs-CSI供应商客户端

创建所需的ServiceAccount和 RBAC ClusterRole / ClusterRoleBinding Kubernetes 对象。这些对象无需根据你的 Kubernetes 环境进行定制,因此可以直接从ceph-csi 部署 YAML 中使用:

复制代码
$ kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/cephfs/kubernetes/csi-provisioner-rbac.yaml
$ kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/cephfs/kubernetes/csi-nodeplugin-rbac.yaml
​
$ kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/cephfs/kubernetes/csidriver.yaml
​
•csi-driver.yaml文件在Kubernetes中主要用于部署CSI(Container Storage Interface)驱动,这些驱动允许动态地在Kubernetes环境中创建和挂载存储卷。

最后,创建ceph-csi配置器和节点插件。除了ceph-csi容器发行版本之外,这些对象无需根据您的 Kubernetes 环境进行定制,因此可以直接从ceph-csi部署 YAML 中使用:

复制代码
$ wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml
$ wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/cephfs/kubernetes/csi-cephfsplugin.yaml
​
此处需要修改镜像地址:
# sed -i 's#registry.k8s.io/sig-storage#registry.cn-hangzhou.aliyuncs.com/google_containers#' csi-cephfsplugin-provisioner.yaml
# sed -i 's#registry.k8s.io/sig-storage#registry.cn-hangzhou.aliyuncs.com/google_containers#' csi-cephfsplugin.yaml
​
$ kubectl apply -f csi-cephfsplugin-provisioner.yaml
$ kubectl apply -f csi-cephfsplugin.yaml

CSI连接Ceph集群的ConfigMap资源

复制代码
[root@k8s-master01 ceph_test]# cat csi-cephfs-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
  config.json: |-
    [
      {
        "clusterID": "368690e6-ef0f-11ee-a429-defa6053e742",
        "monitors": [
          "172.16.90.91:6789",
          "172.16.90.92:6789",
          "172.16.90.93:6789"
        ],
        "cephFS": {
           "subvolumeGroup": "csi"
         }
      }
    ]
metadata:
  name: ceph-csi-config
​
[root@k8s-master01 ceph_test]# kubectl apply -f csi-cephfs-config-map.yaml
​
clusterID:集群的ID号
monitors:Monitor组件的地址
subvolumeGroup:Cephfs文件系统中的子卷名称,StorageClass分配的PV,产生的持久化数据都会存储在这里。

创建 secret,后面对接回用到

复制代码
# 查看key
[root@k8s-master01 ceph_test]# ceph auth get client.admin
[client.admin]
    key = AQB62QhmzFY0JRAAmWFjOZKyL5mtynddMMnRHw==
    caps mds = "allow *"
    caps mgr = "allow *"
    caps mon = "allow *"
    caps osd = "allow *"
exported keyring for client.admin
​
创建 secret,修改 userKey 和 adminKey 为上述命令查询到的 key 值:
[root@k8s-master01 ceph_test]# cat csi-secret.yaml 
---
apiVersion: v1
kind: Secret
metadata:
 name: csi-secret
stringData:
 # Required for statically provisioned volumes
 userID: admin
 userKey: AQB62QhmzFY0JRAAmWFjOZKyL5mtynddMMnRHw==
 # Required for dynamically provisioned volumes
 adminID: admin
 adminKey: AQB62QhmzFY0JRAAmWFjOZKyL5mtynddMMnRHw==
 # Encryption passphrase
 encryptionPassphrase: test_passphrase
​
# kubectl apply -f csi-secret.yaml
[root@k8s-master01 ceph_test]# kubectl get secrets 
NAME             TYPE     DATA   AGE
csi-rbd-secret   Opaque   2      3h7m
csi-secret       Opaque   5      83m
2.3 使用 Cephfs设备

1、创建StorageClass

复制代码
[root@k8s-master01 ceph_test]# cat csi-cephfs-sc.yaml 
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
 name: csi-cephfs-sc
 namespace: default
provisioner: cephfs.csi.ceph.com
parameters:
 clusterID: 368690e6-ef0f-11ee-a429-defa6053e742
 fsName: k8s_cephfs
 pool: k8s_cephfs_data
 csi.storage.k8s.io/provisioner-secret-name: csi-secret
 csi.storage.k8s.io/provisioner-secret-namespace: default
 csi.storage.k8s.io/controller-expand-secret-name: csi-secret
 csi.storage.k8s.io/controller-expand-secret-namespace: default
 csi.storage.k8s.io/node-stage-secret-name: csi-secret
 csi.storage.k8s.io/node-stage-secret-namespace: default
 mounter: kernel
reclaimPolicy: Delete
allowVolumeExpansion: true
​
# kubectl apply -f csi-cephfs-sc.yaml
# kubectl get sc
NAME            PROVISIONER           RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
csi-cephfs-sc   cephfs.csi.ceph.com   Delete          Immediate           true                   46m
csi-rbd-sc      rbd.csi.ceph.com      Delete          Immediate           true                   175m

2、创建PersistentVolumeClaim

复制代码
[root@k8s-master01 ceph_test]# cat csi-cephfs-pvc.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
 name: csi-cephfs-pvc
spec:
 storageClassName: csi-cephfs-sc
 accessModes:
 - ReadWriteMany
 resources:
   requests:
     storage: 1Gi
# kubectl apply -f csi-cephfs-pvc.yaml 

准备演示pod

复制代码
[root@k8s-master01 ceph_test]# cat csi-cephfs-pod1.yaml
apiVersion: v1
kind: Pod
metadata:
 labels:
   app: csi-cephfs-pod1
 name: csi-cephfs-pod1
spec:
 containers:
 - name: csi-cephfs-pod1
   image: nginx:1.17.1
   volumeMounts:
   - name: csi-cephfs-pod1
     mountPath: /mnt
     readOnly: false
 volumes:
 - name: csi-cephfs-pod1
   persistentVolumeClaim:
     claimName: csi-cephfs-pvc
     
[root@k8s-master01 ceph_test]# kubectl apply -f csi-cephfs-pod1.yaml
pod/csi-cephfs-pod1 created

部署 csi-cephfs-pod2,共同挂载一个 PVC:

复制代码
[root@k8s-master01 ceph_test]# cat csi-cephfs-pod2.yaml
apiVersion: v1
kind: Pod
metadata:
 labels:
   app: csi-cephfs-pod2
 name: csi-cephfs-pod2
spec:
 containers:
 - name: csi-cephfs-pod2
   image: nginx:1.17.1
   volumeMounts:
   - name: csi-cephfs-pod2
     mountPath: /mnt
     readOnly: false
 volumes:
 - name: csi-cephfs-pod2
   persistentVolumeClaim:
     claimName: csi-cephfs-pvc
     
[root@k8s-master01 ceph_test]# kubectl apply -f csi-cephfs-pod2.yaml
pod/csi-cephfs-pod1 created

登录 csi-cephfs-pod1:

复制代码
[root@k8s-master01 ceph_test]# kubectl exec -it csi-cephfs-pod1 -- /bin/bash
root@csi-cephfs-pod1:/# echo "hello csi-ceph" >> /mnt/test.txt
root@csi-cephfs-pod1:/# exit
exit

登录 csi-cephfs-pod2,可以查看到文件/mnt/test.txt:

复制代码
[root@k8s-master01 ceph_test]# kubectl exec -it csi-cephfs-pod2 -- /bin/cat /mnt/test.txt
hello csi-ceph
相关推荐
苦逼IT运维2 小时前
Helm 实战指南(四):生产环境 Helm 部署 CVAT 全记录:Ceph 存储、GPU 节点污点调度与 HTTPS 指南
ceph·网络协议·https
为什么不问问神奇的海螺呢丶2 小时前
n9e categraf k8s监控配置 -kube-state-metrics
java·容器·kubernetes
江畔何人初19 小时前
k8s静态pod
云原生·容器·kubernetes
u01040583621 小时前
淘客返利系统的CI/CD流水线搭建:Docker镜像构建与K8s部署实践
ci/cd·docker·kubernetes
nix.gnehc1 天前
深度解析K8s四大核心接口:CRI、CNI、CSI与OCI的设计精髓与实践逻辑
云原生·容器·kubernetes
回忆是昨天里的海1 天前
k8s部署的微服务动态扩容
java·运维·kubernetes
没有bug.的程序员1 天前
Docker 与 K8s 生产级实战:从镜像极致优化到集群自动化部署全流程
spring cloud·docker·kubernetes·自动化·k8s·镜像·集群自动化
小韩加油呀1 天前
jenkins声明式pipline和shell从环境变量配置到打包构建再到发布到k8s
运维·kubernetes·jenkins
A-刘晨阳1 天前
K8S 部署 CoreDNS 之 DNS 域名获取
运维·云原生·容器·kubernetes·dns·coredns