CephFS 卷挂载失败

CephFS Volume Mount Fails

我已经使用 docker-multinode configuration 成功部署了 Kubernetes 集群以及 Ceph 集群,并且能够使用以下方法手动安装 CephFS 设备:

sudo mount -t ceph monitor1:6789:/ /ceph -o name=admin,secretfile=/etc/ceph/cephfs.secret

我现在正尝试使用 kubernetes 示例启动 pod here:

apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret
data:
  key: my-ceph-secret-key
---
apiVersion: v1
kind: Pod
metadata:
  name: cephfs2
spec:
  containers:
  - name: cephfs-rw
    image: kubernetes/pause
    volumeMounts:
    - mountPath: "/mnt/cephfs"
      name: cephfs
  volumes:
  - name: cephfs
    cephfs:
      monitors:
      - "monitor1:6789"
      - "monitor2:6789"
      - "monitor3:6789"
      user: admin
      secretRef:
        name: ceph-secret
      readOnly: false

当我运行:

sudo kubectl create -f cephfs.yml

我收到以下错误:

Warning FailedMount MountVolume.SetUp failed for volume "kubernetes.io/cephfs/445ee063-d1f1-11e6-a3e3-1418776a29a6-cephfs" (spec.Name: "cephfs") pod "445ee063-d1f1-11e6-a3e3-1418776a29a6" (UID: "445ee063-d1f1-11e6-a3e3-1418776a29a6") with: CephFS: mount failed: mount failed: fork/exec /bin/mount: invalid argument Mounting arguments: monitor1:6789,monitor2:6789,monitor3:6789:/data /var/lib/kubelet/pods/445ee063-d1f1-11e6-a3e3-1418776a29a6/volumes/kubernetes.io~cephfs/cephfs ceph [name=admin,secret=secret]

kubernetes 管理器容器是否需要安装 ceph-fs-common 包才能成功挂载?我找不到任何进一步的调试信息来确定错误的原因。

据我所知,您可能会遇到 2 个问题:

  • Ceph 需要机器的 IP 地址才能工作
  • OS 您所在的 运行 容器是装载存储的容器:需要在该机器上安装 ceph 工具。容器完全不知道挂载的磁盘

为了在 kubernetes 中成功挂载 CephFS 卷,有几个问题需要解决。请记住,我已经使用 kube-deploy docker multinode 配置部署了 Kubernetes 1.4.6。

问题 #1:使用 Kubernetes 机密的挂载命令失败

在更仔细地检查上面的错误时,我发现 Kubernetes 使用被解释为换行符的字符来加密我的 Ceph 秘密。因此,kubelet 在尝试挂载文件系统时失败。

为了解决这个问题,我将我的 YAML 配置为使用 Ceph secretfile 而不是 Kubernetes secret:

apiVersion: v1
kind: Pod
metadata:
  name: cephfs-test
spec:
  containers:
  - name: cephfs-rw
    image: kubernetes/pause
    volumeMounts:
    - mountPath: "/mnt/cephfs"
      name: cephfs
  volumes:
  - name: cephfs
    cephfs:
      monitors:
      - "<monitor1>:6789"
      - "<monitor2>:6789"
      - "<<monitor3>:6789"
      user: admin
      # Omit for CephFS mounting error
      # secretRef:
      #   name: ceph-secret
      secretFile: "/etc/ceph/user.secret"
      readOnly: false

问题 #2:Kubelet 缺少 Ceph 包和配置

kubelet 都缺少将 CephFS 卷挂载到容器所需的 ceph-fs-commonceph-common 包以及必要的配置文件。以下脚本应该对 kubelet master/worker 代理应用必要的更新:

docker exec $KUBELET_ID apt-get update
docker exec $KUBELET_ID apt-get install -y wget lsb-release apt-transport-https
docker exec $KUBELET_ID /bin/bash -c "wget -q -O- 'https://download.ceph.com/keys/release.asc' | apt-key add -"
RELEASE=$(docker exec $KUBELET_ID lsb_release -sc)
docker exec $KUBELET_ID /bin/bash -c "echo deb https://download.ceph.com/debian-jewel/ $RELEASE main | tee /etc/apt/sources.list.d/ceph.list"
docker exec $KUBELET_ID apt-get update
docker exec $KUBELET_ID apt-get install -y ceph-fs-common ceph-common

docker exec $KUBELET_ID mkdir -p /etc/ceph
docker exec $KUBELET_ID /bin/bash -c "echo $CEPH_SECRET > /etc/ceph/admin.secret"

完整要点here