目录
Ceph CSI (Container Storage Interface)
如果此时全部显示错误,那就代表镜像拉取错误,此时执行的yaml脚本,通过yaml脚本去K8S的镜像仓库去拉取镜像。如果这一步遇到错误可以直接去最下方查看解决办法。编辑
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 动态地分配资源。
前提配置
- 确保Ceph集群和Kubernetes集群已经正确部署并运行稳定。
- 配置MDS服务,确保CephFS可以使用。
- 创建存储池和文件系统,为CephFS接口准备必要的存储资源。
- 确保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的仓库镜像拉不下来。
这个可以从这个网站里面下载。以 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)