Ceph in Libvirt and Kubernetes

Ceph部署

Ceph的部署已经有很多文章了,大致都是用ceph-deploy这个工具实施,这里我就不累述了。我就简单记录下我在部署过程中遇到的坑。

**1. **SSH端口不是22造成的部署失败。

修改本地.ssh/config目录,加入要安装ceph集群的host即可,如下:

host ceph-mon
    Hostname 192.168.68.55
host ceph-osd1
    Hostname 192.168.68.53
host ceph-osd2
    Hostname 192.168.68.54
host ceph-mon ceph-osd1 ceph-osd2
    User root
    Port 8822

**2. **安装ceph-release

$ yum install -y centos-release-ceph-jewel

**3. **通过ceph-deploy部署不同版本的ceph,我这里用的是jewel

$ ceph-deploy install  --release jewel ceph-mon ceph-osd1 ceph-osd2

**4. **切换国内阿里ceph镜像源

export CEPH_DEPLOY_REPO_URL=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/
export CEPH_DEPLOY_GPG_URL=https://mirrors.aliyun.com/ceph/keys/release.asc

**5. **配置文件

[global]
fsid = 6013f65b-1178-4d8b-b3b5-dfb52ce811a7
mon_initial_members = l-192168068053-mitaka
mon_host = 192.168.68.53
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public network = 192.168.68.0/24
cluster network = 192.168.68.0/24
rbd_default_features = 3

这里有关rbd_default_features这个配置项,遇到个问题。由于不知道内核支持的镜像特性,所以在映射rbd的时候会报错,提示镜像特性问题。查了下,本机内核版本只支持分层,所以配置3就好了。

rbd镜像特性

  • layering: 支持分层
  • striping: 支持条带化 v2
  • exclusive-lock: 支持独占锁
  • object-map: 支持对象映射(依赖 exclusive-lock )
  • fast-diff: 快速计算差异(依赖 object-map )
  • deep-flatten: 支持快照扁平化操作
  • journaling: 支持记录 IO 操作(依赖独占锁)

Ceph 使用

**1. ** 创建存储池与配额设置

创建

ceph osd pool create {pool-name} {pg-num} [{pgp-num}] [replicated] \
        [crush-ruleset-name] [expected-num-objects]

PG_NUM
取值是强制性的,因为不能自动计算。下面是几个常用的值:
少于 5 个 OSD 时可把 pg_num 设置为 128
OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512
OSD 数量在 10 到 50 个时,可把 pg_num 设置为 4096
OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值
自己计算 pg_num 取值时可借助 pgcalc 工具
随着 OSD 数量的增加,正确的 pg_num 取值变得更加重要,因为它显著地影响着集群的行为、以及出错时的数据持久性(即灾难性事件导致数据丢失的概率)。
replicated
副本个数,默认是三份

我的设置

$ ceph osd pool create instances 128
$ ceph osd pool set instances size 2
$ ceph osd pool create volumes 128
$ ceph osd pool set volumes size 2
$ ceph osd pool create kube 128
$ ceph osd pool set kube size 2

配额

ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]

我的设置

ceph osd pool set-quota instances max_objects 1000000
ceph osd pool set-quota volumes  max_objects 5000000
ceph osd pool set-quota kube  max_objects 5000000

**2. **创建用户

$ ceph auth get-or-create client.libvirt mon 'allow r' osd 'allow class-read class-write object_prefix rbd_children, allow rwx pool=instances, allow rwx pool=volumes' -o ceph.client.libvirt.keyring
$ ceph auth get-or-create client.kube mon 'allow r' osd 'allow class-read class-write object_prefix rbd_children, allow rwx pool=kube' -o ceph.client.kube.keyring

我这里对libvirt账号只能拥有instances和volumes池子的所有权限、kube占用只拥有kube池子所有权限

Ceph in Libvirt

**1. **生成secret

$ cat > secret.xml <<EOF
<secret ephemeral='no' private='no'>
        <usage type='ceph'>
                <name>client.libvirt secret</name>
        </usage>
</secret>
EOF

**2. **导入secret

$ virsh secret-define --file secret.xml
<uuid of secret is output here>

**3. **设置secret的UUID

virsh secret-set-value --secret {uuid of secret} --base64 $(ceph auth get-key client.libvirt)

4. 编辑虚拟机xml文件

    <disk type='network' device='disk'>
      <driver name='qemu' type='raw'/>
      <source protocol='rbd' name='instances/kube_ceph'>
        <host name='192.168.68.53' port='6789'/>
        <host name='192.168.68.54' port='6789'/>
        <host name='192.168.68.57' port='6789'/>
      </source>
      <auth username='libvirt'>
        <secret type='ceph' uuid='3735f424-7724-4489-9ee5-d78066ad7fa1'/>
      </auth>
      <target dev='vda' bus='virtio'/>
    </disk>

5. 如果要在virt-manager上的存储池上使用Ceph,则需要定义一个pool

<pool type="rbd">
  <name>ceph-volumes</name>
  <source>
    <name>volumes</name>
    <host name='192.168.68.53' port='6789'/>
    <host name='192.168.68.54' port='6789'/>
    <host name='192.168.68.57' port='6789'/>
    <auth username='libvirt' type='ceph'>
      <secret type='ceph' uuid='3735f424-7724-4489-9ee5-d78066ad7fa1'/>
    </auth>
  </source>
</pool>

这样就可以在宿主机存储池上创建和删除rbd块了

virt-manager

6. 虚拟机镜像

因为Ceph镜像支持分层,我这里创建虚拟机镜像的时候只需要对原镜的快照做clone就行了,操作如下:

导入镜像

$ rbd import --image-format 2 Debian-Wheezy-7.11.raw instances/Debian-Wheezy-7.11.raw --name client.libvirt

raw 数据格式是使用 RBD 时的唯一可用 format 选项。从技术上讲,你可以使用 QEMU 支持的其他格式(例如 qcow2 或 vmdk),但是这样做可能会带来额外开销,而且在开启缓存模式下进行虚拟机的热迁移时会导致卷的不安全性。

快照

$ rbd snap protect  instances/Debian-Wheezy-7.11.raw@snapshot_backingfile --name client.libvirt 

克隆镜像

 $ rbd clone  instances/Debian-Wheezy-7.11.raw@snapshot_backingfile  instances/kube_ceph  --name client.libvirt

克隆完成后我们虚拟机就可以使用 instances/kube_ceph块了.

Ceph in Kubernetes

不管采用什么模式,kubelet节点都要安装ceph-common

1. 普通模式

根据K8s官方提供的rbd文件可以简单做功能测试。

  • Ceph认证

加密ceph秘钥环

grep key /etc/ceph/ceph.client.kube.keyring |awk '{printf "%s", $NF}'|base64
QVFBclU4dFlGUjhLTXhBQXRGcnFiUXN2cm1hUUU1N1ZpUmpmcUE9PQ==

secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret
type: "kubernetes.io/rbd"  
data:
  key: QVFBclU4dFlGUjhLTXhBQXRGcnFiUXN2cm1hUUU1N1ZpUmpmcUE9PQ==
  • 创建pod
apiVersion: v1
kind: Pod
metadata:
  name: rbd
spec:
  containers:
  - name: rbd-rw
    image: nginx:1.11.10
    volumeMounts:
    - mountPath: "/mnt/rbd"
      name: rbdpd
  nodeSelector:  
    ceph: up    #方便测试,我这里调度到label为 ceph=up的kube节点上
  volumes:
  - name: rbdpd
    rbd:
      monitors:
      - 192.168.68.57:6789
      pool: kube
      image: test
      user: kube
      secretRef:
        name: ceph-secret
      fsType: ext4

2. PersistentVolume/PersistentVolumeCliam

  • PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
  name: ceph-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  rbd:
    monitors:
      - 192.168.68.53:6789
      - 192.168.68.54:6789
      - 192.168.68.57:6789
    pool: kube
    image: magine_test
    user: kube
    secretRef:
      name: ceph-secret
    fsType: ext4
    readOnly: false
  persistentVolumeReclaimPolicy: Recycle
  • PersistentVoumeCliam
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ceph-claim
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  • 状态
$ kubectl get pvc
NAME         STATUS    VOLUME     CAPACITY   ACCESSMODES   AGE
ceph-claim   Bound     ceph-pv1   10Gi       RWX           4h

$ kubectl get pv
NAME            CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS    CLAIM                    REASON    AGE
ceph-pv        10Gi       RWX           Recycle         Bound     default/ceph-claim                 5h

这里看到pvc就已经bound成功

  • Pod
apiVersion: v1
kind: Pod
metadata:
  name: ceph-pod
spec:
  containers:
  - name: ceph-pod
    image: nginx:1.11.10
    volumeMounts:
    - mountPath: "/mnt/rbd"
      name: ceph-pv-test
  nodeSelector:
    ceph: up
  volumes:
  - name: ceph-pv-test
    persistentVolumeClaim:
       claimName: ceph-claim

测试了下,由于accessModes采用ReadWriteMany模式,一个rbd块是可以挂载给多个Pod使用的。
目前Kubernetes对接Ceph还没发现扩展API来帮助Pod创建RBD块,所以都需要Ceph在底层创建好才能使用。
笨一点的方法是可以采用initcontainer的方式,在POD创建之前启动容器,执行命令的创建一个rdb块,操作方式留在下次文档更新。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • ceph简介 Ceph是一个分布式存储系统,诞生于2004年,是最早致力于开发下一代高性能分布式文件系统的项目。随...
    爱吃土豆的程序猿阅读 6,011评论 0 21
  • 系统环境: centos73.10.0-514.26.2.el7.x86_64 机器数量:五台 硬盘:四块一块为系...
    think_lonely阅读 4,622评论 0 5
  • 原因:2017年4月14日 星期五 学习记录。说明:整理ceph资料。我的博客 : http://minichao...
    nicocoi阅读 8,181评论 1 9
  • 集群管理 每次用命令启动、重启、停止Ceph守护进程(或整个集群)时,必须指定至少一个选项和一个命令,还可能要指定...
    Arteezy_Xie阅读 18,474评论 0 19
  • 一、概述 Ceph是一个分布式存储系统,诞生于2004年,最早致力于开发下一代高性能分布式文件系统的项目。随着云计...
    魏镇坪阅读 49,401评论 3 54