k8s学习笔记——cephfs

本文详细介绍了如何在Kubernetes环境中安装和使用CephFS,包括编译并部署CephFS Provisioner,创建StorageClass,以及如何通过PVC动态创建和使用CephFS卷。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cephfs安装

参考://创建 Ceph 文件系统 — Ceph Documentation

//CephFs的操作方法 - 系统运维 - 亿速云 

//k8s使用cephfs动态存储 - 流年晕开时光 - 博客园

关于动态创建cephfs和动态创建ceph-rbd还不大一样,首先也是需要安装cephfs provisioner

GitHub - rootfs/cephfs-provisioner: Kubernetes CephFS PV Provisionerc

参考github上的地址,安装go的编译环境,先运行运行

go build cephfs-provisioner.go 将go代码编译为可执行文件,然后用
docker build -t cephfs-provisioner . 将代码打包成docker镜像

我这里是将打包后的镜像上传到了私有的harbor仓库里,在安装时通过仓库下载镜像。

github上没有安装的yaml,自己参考ceph-rbd的写了一个cephfs-provisioner.yaml

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: cephfs-provisioner
  namespace: cephfs
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["get", "list", "create", "update", "patch"]
  - apiGroups: [""]
    resources: ["services"]
    resourceNames: ["kube-dns", "coredns"]
    verbs: ["list", "get"]
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]

---

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: cephfs-provisioner
  namespace: cephfs
subjects:
  - kind: ServiceAccount
    name: cephfs-provisioner
    namespace: cephfs
roleRef:
  kind: ClusterRole
  name: cephfs-provisioner
  apiGroup: rbac.authorization.k8s.io

---

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: cephfs-provisioner
  namespace: cephfs
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "create"]
- apiGroups: [""]
  resources: ["endpoints"]
  verbs: ["get", "list", "watch", "create", "update", "patch"]

---

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: cephfs-provisioner
  namespace: cephfs
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: cephfs-provisioner
subjects:
- kind: ServiceAccount
  name: cephfs-provisioner
  namespace: cephfs

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cephfs-provisioner
  namespace: cephfs
  labels: 
    app: cephfs-provisioner
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cephfs-provisioner
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: cephfs-provisioner
    spec:
      nodeSelector:
        app: rbd-provisioner
      containers:
      - name: cephfs-provisioner
        image: "core.harbor.shell.com:32042/library/cephfs-provisioner:v1"
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 8080
        volumeMounts:
        - name: ceph-conf
          mountPath: /etc/ceph
        volumeMounts:
        - name: kube-conf
          mountPath: /kube/config
        env:
        - name: PROVISIONER_NAME
          value: ceph.com/cephfs
        command:
        - "/bin/sh"
        - "-c"
        - "/usr/local/bin/cephfs-provisioner"
      serviceAccount: cephfs-provisioner
      volumes:
      - name: ceph-conf
        hostPath:
          path: /etc/ceph
      volumes:
      - name: kube-conf
        hostPath:
          path: /root/.kube/config
      tolerations:
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"

---

apiVersion: v1
kind: ServiceAccount
metadata:
  name: cephfs-provisioner
  namespace: cephfs

 这里与前面的创建rbd-provisioner在权限设置上略有不同,cephfs动态建立pv时需要动态创建secret,event事件需要list权限,所以在ClusterRole中event中增加了list权限,在Role中secrets中增加了create权限。否则动态创建时会报权限不足。

另外,好像这里创建pvc只能在cephfs的名称空间里创建,具体什么原因我还没弄明白,好像要想在其他名称空间创建pvc应在别的名称空间部署cephfs-provisioner,需要更改cephfs-provisioner.yaml文件中的配置。

创建cephfs-secret.yaml文件与github中的ceph-secret-admin.yaml内容相同,key的值要用过

ceph auth get client.admin 2>&1 |grep "key = " |awk '{print  $3'} |base64获取

创建class.yaml文件

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: cephfs
allowVolumeExpansion: true
provisioner: ceph.com/cephfs
parameters:
  monitors: 10.12.70.201:6789,10.12.70.202:6789,10.12.70.203:6789  //使用cephfs创建的地址
  adminId: admin
  adminSecretName: cephfs-secret-admin //这里的需要和创建的secret名称一致
  adminSecretNamespace: cephfs

然后部署claim.yaml文件创建的空间大小自己定义

创建成功后就会如下显示

NAME                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
cephfs-pvc-geoserver   Bound    pvc-7dc33ba0-b043-476b-9594-d118d3acc9ba   100Gi      RWO,ROX,RWX    cephfs         44m

status显示Bound状态

使用kubectl get pv查看,可以看到

pvc-7dc33ba0-b043-476b-9594-d118d3acc9ba   100Gi      RWO,ROX,RWX    Delete           Bound    cephfs/cephfs-pvc-geoserver              cephfs 

pv已动态创建

在看通过kubectl get secret -n cephfs

NAME                                                                       TYPE                                  DATA   AGE
ceph-kubernetes-dynamic-user-562ae916-3fb6-11ec-a6e9-6a9df5d0a806-secret   Opaque                                1      47m

这里创建也动态创建了secret

之前在//CephFs的操作方法 - 系统运维 - 亿速云 中手动挂载的cephfs是创建的整个pool空间可以看到磁盘中的所有内容,也包括k8s动态创建的pv如下

//在挂载的目录下面会多一个volumes目录
//目录下有一个kubernetes目录,目录下就有pvc动态绑定的pv目录
kubernetes  _kubernetes:kubernetes-dynamic-pvc-562ae89f-3fb6-11ec-a6e9-6a9df5d0a806.meta

通过test-pod.yaml 可以使用cephfs了,登录pod上后,在挂载的目录下创建文件,就可以在其他挂载cephfs的目录后/volumes/kubernetes/kubernetes-dynamic-pvc-562ae89f-3fb6-11ec-a6e9-6a9df5d0a806/目录下就有刚才pod中创建的文件,文件内容相同。

在cephfs中删除pvc动态创建的pv也就动态删除,但是动态创建的secret还在,并且/volumes/kubernetes/kubernetes-dynamic-pvc-562ae89f-3fb6-11ec-a6e9-6a9df5d0a806目录及创建的文件都会继续存在,不会删除。

### 使用 Helm 在 Kubernetes (K8S) 上部署 CephFS CSI 以接入 Ceph 集群的指南 要在 Kubernetes 集群中使用 Helm 部署 CephFS CSI 并接入 Ceph 集群,需要完成以下内容的配置与操作。以下是详细的步骤说明: #### 1. 安装 Helm 确保 Helm 已正确安装在本地环境中,并初始化 Helm 的 Tiller 组件(如果需要)。可以运行以下命令检查 Helm 版本: ```bash helm version ``` #### 2. 添加 Helm Chart 仓库 Ceph 社区通常会提供官方或第三方支持的 Helm Chart,用于简化 CephFS CSI 的部署过程。添加 Ceph 或相关存储解决方案的 Helm 仓库: ```bash helm repo add ceph https://ceph.github.io/csi-charts/ helm repo update ``` 此操作将添加包含 CephFS CSI 相关 Chart 的仓库[^6]。 #### 3. 配置 Ceph 集群信息 在部署之前,需要准备 Ceph 集群的相关配置信息,例如 `monitors`、`admin secret` 和 `user secret` 等。这些信息可以通过以下方式获取: - **Monitors (mons)**: Ceph Monitor 的地址列表。 - **Admin Secret**: Ceph 集群管理员的密钥。 - **User Secret**: 用于访问 CephFS 的用户密钥。 创建一个包含上述信息的 ConfigMap 或 Secret: ```yaml apiVersion: v1 kind: Secret metadata: name: csi-cephfs-secret namespace: kube-system data: adminSecret: <base64-encoded-admin-secret> userSecret: <base64-encoded-user-secret> ``` 保存为文件(如 `cephfs-secret.yaml`),并应用到集群中: ```bash kubectl apply -f cephfs-secret.yaml ``` #### 4. 部署 CephFS CSI 使用 Helm 部署 CephFS CSI。首先查看可用的 Chart 参数: ```bash helm show values ceph/ceph-csi ``` 根据实际需求调整参数后,执行部署命令: ```bash helm install ceph-csi ceph/ceph-csi --namespace kube-system \ --set ceph.monitors=<comma-separated-mon-list> \ --set ceph.adminSecret=<admin-secret-name> \ --set ceph.userSecret=<user-secret-name> ``` 此处 `<comma-separated-mon-list>` 是 Ceph Monitor 地址列表,格式为 `mon1:port,mon2:port,...`[^7]。 #### 5. 验证部署 部署完成后,验证 CephFS CSI 是否正常工作: ```bash kubectl get pods -n kube-system -l app=csi-cephfsplugin ``` 确保所有 Pod 处于 `Running` 状态。 #### 6. 创建 StorageClass 和 PVC 定义一个 StorageClass 来动态分配 CephFS 存储资源: ```yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: cephfs-sc provisioner: ceph.com/cephfs parameters: monitors: <comma-separated-mon-list> adminId: admin adminSecretName: csi-cephfs-secret adminSecretNamespace: kube-system userId: csi userSecretName: csi-cephfs-secret ``` 保存为文件(如 `cephfs-sc.yaml`),并应用到集群中: ```bash kubectl apply -f cephfs-sc.yaml ``` 接着创建 PersistentVolumeClaim (PVC): ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: cephfs-pvc spec: accessModes: - ReadWriteMany storageClassName: cephfs-sc resources: requests: storage: 1Gi ``` 保存为文件(如 `cephfs-pvc.yaml`),并应用到集群中: ```bash kubectl apply -f cephfs-pvc.yaml ``` #### 7. 测试存储功能 创建一个测试 Pod,挂载上述 PVC 并写入数据: ```yaml apiVersion: v1 kind: Pod metadata: name: cephfs-test spec: containers: - name: test-container image: busybox command: ["sleep", "3600"] volumeMounts: - mountPath: "/mnt/cephfs" name: cephfs-pvc volumes: - name: cephfs-pvc persistentVolumeClaim: claimName: cephfs-pvc ``` 保存为文件(如 `cephfs-test.yaml`),并应用到集群中: ```bash kubectl apply -f cephfs-test.yaml ``` 进入 Pod 并测试存储功能: ```bash kubectl exec -it cephfs-test -- /bin/sh echo "Test Data" > /mnt/cephfs/test.txt cat /mnt/cephfs/test.txt ``` --- ### 注意事项 - 确保 Ceph 集群已正确配置并运行。 - 如果遇到权限问题,请检查 Secret 和 RBAC 配置是否正确[^8]。 - 可以通过修改 Helm Chart 的参数进一步优化性能或安全性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值