K8s对接Ceph-csi配置手册(附带踩坑记录以及解决方法)

举报
笨笨小乌龟 发表于 2024/08/06 15:46:27 2024/08/06
【摘要】 Kubernetes (K8S) 是一个流行的容器编排平台,而 Ceph 是一个分布式存储系统,提供了对象存储、块存储和文件系统等多种存储服务。在 Kubernetes 中使用 Ceph 作为持久化存储后端是一种常见的部署模式。

 目录

Ceph CSI (Container Storage Interface)

CSI 的作用:

前提配置

版本信息

获取Ceph认证信息

获取Ceph集群Monitor信息

下载并部署Ceph CSI

          如果此时全部显示错误,那就代表镜像拉取错误,此时执行的yaml脚本,通过yaml脚本去K8S的镜像仓库去拉取镜像。如果这一步遇到错误可以直接去最下方查看解决办法。​编辑

创建Secret

创建StorageClass

创建PVC

创建Pod

验证


错误解决方法:

1. kubuctl get po -o wide 的时候发现惊险全部没有被拉取下来,此时我们可以通过describle去分析一下缺少哪些镜像。

2. failed to fetch monitor list using clusterID

3. curl: (52) Empty reply from server



Kubernetes (K8S) 是一个流行的容器编排平台,而 Ceph 是一个分布式存储系统,提供了对象存储、块存储和文件系统等多种存储服务。在 Kubernetes 中使用 Ceph 作为持久化存储后端是一种常见的部署模式。

Ceph CSI (Container Storage Interface)

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

CSI 的作用:

  • 标准化接口:CSI 提供了一个标准的接口,使得 Kubernetes 可以与不同的存储系统交互。
  • 存储管理:通过 CSI 插件,Kubernetes 可以创建、删除、挂载和卸载存储卷。
  • 动态配置:支持动态配置存储类(StorageClass),这允许用户定义存储需求,并由 Kubernetes 动态地分配资源。

前提配置

  1. 确保Ceph集群和Kubernetes集群已经正确部署并运行稳定。
  2. 配置MDS服务,确保CephFS可以使用。
  3. 创建存储池和文件系统,为CephFS接口准备必要的存储资源。
  4. 确保K8S和Ceph版本有所匹配。

目前K8s与ceph - csi版本对应:

编辑

版本信息

  • Kubernetes: v1.19.7
  • Ceph-CSI: v3.4.0
  • Ceph: v16.2.10

获取Ceph认证信息

创建认证用户:

ceph auth get-or-create client.cephfs mon 'allow r' mds 'allow rw' osd 'allow rw pool=test1, allow rw pool=test2'

查看认证用户信息:

ceph auth get client.cephfs

输出示例:

ceph auth get client.admin

        输出示例:

        编辑

获取Ceph集群Monitor信息

获取Cluster ID和Monitors信息:

ceph mon dump

输出示例:

epoch 1
fsid f38a95d3-b932-480c-89bc-161a4f81c160
last_changed 2022-11-24 11:18:44.328712
created 2022-11-24 11:18:44.328712
min_mon_release 14 (nautilus)
0: [v2:192.168.221.141:3300/0,v1:192.168.221.141:6789/0] mon.node1

下载并部署Ceph CSI

下载Ceph-CSI:

wget https://github.com/ceph/ceph-csi/archive/refs/tags/v3.4.0.tar.gz
tar xf v3.4.0.tar.gz
cd ceph-csi-3.4.0/deploy/cephfs/kubernetes/

修改csi-config-map.yaml文件:

注意,文件中不可有任何注释!!否则在创建PVC的时候会提示报错,显示获取不到Monitor的列表。

apiVersion: v1
kind: ConfigMap
data:
  config.json: |
    [
      {
        "clusterID": "f38a95d3-b932-480c-89bc-161a4f81c160",
        "monitors": [
          "192.168.221.141:6789"
        ]
      }
    ]
metadata:
  name: ceph-csi-config-fs

部署Ceph CSI:

kubectl apply -f csi-config-map.yaml
kubectl apply -f csi-provisioner-rbac.yaml
kubectl apply -f csi-nodeplugin-rbac.yaml
kubectl apply -f csi-cephfsplugin-provisioner.yaml
kubectl apply -f csi-cephfsplugin.yaml

检查Pod状态:

kubectl get po -o wide

          如果此时全部显示错误,那就代表镜像拉取错误,此时执行的yaml脚本,通过yaml脚本去K8S的镜像仓库去拉取镜像。如果这一步遇到错误可以直接去最下方查看解决办法。编辑

创建Secret

创建Secret文件:

apiVersion: v1
kind: Secret
metadata:
  name: csi-cephfs-secret
  namespace: default
stringData:
  userID: cephfs   // 上方获取到的两个用户信息对应填写即可。
  userKey: AQDW9k1lDBtfBRAAP7aBGqZMXSXlNeWbmQNAoQ==
  adminID: admin
  adminKey: AQCV4n5j60KACxAA0ZX1s/ABTrWFcJN5Tnun9w==

应用Secret:

kubectl apply -f secret.yaml

创建StorageClass

编辑storageclass.yaml文件:

        编辑

应用StorageClass:

kubectl apply -f storageclass.yaml
kubectl get sc

编辑

创建PVC

创建pvc.yaml文件:

应用PVC:

kubectl apply -f pvc.yaml
kubectl get pvc,pv

STATUS显示Bound即代表正常

编辑

 此时如果这个地方报错先检查你的pod是否全部处于运行状态,其次去检查你的csi-config-map.yaml是否有注释,如果都没问题还是报错可以用describle去检查一下报错原因。

示例:

kubectl describe pvc <pvc-name> [-n <namespace>]

创建Pod

创建pod.yaml文件:

apiVersion: v1
kind: Pod
metadata:
  name: csi-cephfs-demo-pod
spec:
  containers:
  - name: csi-cephfs-demo-container
    image: nginx
    volumeMounts:
    - mountPath: "/usr/share/nginx/html"
      name: cephfs-storage
  volumes:
  - name: cephfs-storage
    persistentVolumeClaim:
      claimName: cephfs-pvc

应用Pod:

kubectl apply -f pod.yaml
kubectl get pods

这个就是我们创建出来的Pod-demo

编辑

验证

在Ceph节点上验证:

cd /media  // 这个是你Cephfs挂载的目录,可以使用df -h 或者 mount查看
ls

编辑

会发现有我们K8s创建的东西

编辑


cd volumes/csi/ // 由于镜像名字是随机生成的,每台机器并不相同,所以我们这边输入 一直按下TAB键进行补全即可
echo "$(date) hello cephfs." > index.html
cat index.html

编辑

从Kubernetes Master节点验证:

curl 10.244.247.6

编辑

同时也可以通过进入容器对远处的文件系统进行写入

kubectl exec -it csi-cephfs-demo-pod -- /bin/bash
echo "Hello, CephFS!" > /usr/share/nginx/html/index_test.html

此时在Ceph节点下查看会出现这个和我们之前创建的文件

编辑

验证完成!


错误解决方法:

1. kubuctl get po -o wide 的时候发现惊险全部没有被拉取下来,此时我们可以通过describle去分析一下缺少哪些镜像。

kubectl describe pod POD名字

编辑

以这个为例,你会发现他缺少了的是Nginx的镜像,这通常与K8S的仓库有关,虽然这个是Docker的,但是你们遇到的错误一般都是K8S的仓库镜像拉不下来。

渡渡鸟镜像同步站 (aityp.com)

这个可以从这个网站里面下载。以 k8s.gcr.io/sig-storage/csi-resizer:v1.2.0 为例:

编辑

编辑

编辑

其原理就是拉取镜像,然后修改镜像的TAG,使其能够检测到你拉取的镜像,最终完成。

2. failed to fetch monitor list using clusterID

编辑

去掉注释即可。删除PVC和PV,修改csi-config-map.yaml文件,然后重新apply -f 一下即可。

3. curl: (52) Empty reply from server

如果你是在有网的情况下首先去检查下你的DNS配置是否正确,可以用nmtui或者cat /etc/sysconfig/network-scripts/ifcfg-eth0去查看。

编辑

此时就是配置没问题,那么看看你是否是通过代理上网。

curl IP -v可以查看详细信息。

编辑

可以看到我这边是先连接到代理IP,然后去curl那个IP,我在代理上ping了一下这个IP发现ping不通,关闭代理即可。

unset http_proxy https_proxy no_proxy

就说到这里,希望可以帮到大家~

参考链接:

手把手系列 - Ceph使用rbd及cephfs与k8s集群集成 - 三种方式实现 - hukey - 博客园 (cnblogs.com)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。