资讯专栏INFORMATION COLUMN

跟我学 K8S--运维: helm 安装 ceph 到 kubernetes 集群

marser / 2697人阅读

摘要:参考官方文档进行操作本文假设环境正常运行,并且已经安装。只能以单副本运行部署运行命令来安装等待一段时间执行完成后,通过如下命令确定集群是否成功运行检查的状态检查集群状态至此,集群部署完成。

参考 ceph 官方文档进行操作: http://docs.ceph.com/docs/mas...

本文假设kubernetes 环境正常运行,并且 host 已经安装 helm client。

通过 helm 来部署 ceph 用到了社区的 ceph-helm 项目( https://github.com/ceph/ceph-... ),这是一个 helm 的 chart,本文使用的master 分支,最新commit id 为743a7441ba4361866a6e017b4f8fa5c15e34e640。

# 克隆 ceph-helm 代码到本地
git clone https://github.com/ceph/ceph-helm/

# 如果环境中已经存在tiller 服务,则不需要执行下面这条命令
helm init

# ceph-helm 默认使用本地 helm-repo 的存储 charts,要在本地启动 helm repo 服务器,运行:
helm serve &
helm repo add my_local http://localhost:8879/charts

# 切换到 ceph-helm/ceph 目录并执行编译
cd ceps-helm/ceph
make

建议提前准备好需要的镜像:

  docker pull docker.io/ceph/daemon:tag-build-master-luminous-ubuntu-16.04
  docker pull docker.io/kolla/ubuntu-source-kubernetes-entrypoint:4.0.0
  docker pull docker.io/port/ceph-config-helper:v1.7.5
  docker pull quay.io/external_storage/rbd-provisioner:v0.1.1
  docker pull docker.io/alpine:latest

具体部署步骤如下

1. 创建 ceph-overrides.yaml 文件

到此初步准备工作完成,为了执行 helm 安装,需要提供覆盖 values.yaml 中默认值的配置项,通常命名为ceph-overrides.yaml,其位置可以任意。
由于我用的是 openstack 上虚拟机,网段为 10.24.0.0/24,并且虚拟机 attach 一块 cinder 创建的云硬盘,盘名为 /dev/vdb,那么就有了下面的配置文件。

network:
  public:   10.24.0.0/24
  cluster:  10.24.0.0/24

osd_devices:
  - name: dev-vdb
    device: /dev/vdb
    zap: "1"

storageclass:
  name: ceph-rbd
  pool: rbd
  user_id: admin

注意,这里的 storageclass中的user_id 如果不是 admin,则需要在 ceph 集群手动创建并在 kubernetes 中创建对应的 secret。

2. 在 kubernetes 环境提供权限和标签

首先,ceph-helm 会把ceph 集群安装在 ceph 命名空间下,需要创建之。
其次,由于kubernetes >= 1.6使用了 RBAC 的 admission controller,ceph-helm 需要为每个组件提供 RBAC 角色和权限。
最后,由于安装 ceph 组件的 ceph-mon 与ceph-osd-属于 daemonsets,满足label 条件后才会安装。

# 创建 ceph namespace
kubectl create namespace ceph

# 创建相关 rbac
kubectl create -f ~/ceph-helm/ceph/rbac.yaml

# 为节点打标签
kubectl label node node-1 ceph-mon=enabled
kubectl label node node-2 ceph-mon=enabled
kubectl label node node-3 ceph-mon=enabled

kubectl label node node-1 ceph-mgr=enabled

kubectl label node node-1  ceph-osd-device-dev-vdb=enabled ceph-osd=enabled
kubectl label node node-2  ceph-osd-device-dev-vdb=enabled ceph-osd=enabled
kubectl label node node-3  ceph-osd-device-dev-vdb=enabled ceph-osd=enabled

注意

1) 这里的 ceph-osd-dev-vdb 这个label 是根据 ceps-overrides.yaml中的 osd_devices 的名称创建,如果每个节点多个 osd 盘,那么需要打相应个数的 labels。
2) ceph-mgr 只能以单副本运行
3. ceph 部署

运行 helm 命令来安装 Ceph:

cd ~/ceph-helm

helm install --name=ceph ceph/ceph-0.1.0.tgz --namespace=ceph -f ceph-overrides.yaml

等待一段时间执行完成后,通过如下命令确定 ceph 集群是否成功运行:

# 检查 kubernetes 的 pod 状态
~ # kubectl get po -n ceph
NAME                                    READY     STATUS    RESTARTS   AGE
ceph-mds-5696f9df5d-8fc7l               0/1       Pending   0          3h
ceph-mgr-8656b978df-kcb6f               1/1       Running   0          3h
ceph-mon-9xqms                          3/3       Running   0          3h
ceph-mon-check-7d49bd686c-pkk7w         1/1       Running   0          3h
ceph-mon-tw5n5                          3/3       Running   0          3h
ceph-mon-x25rv                          3/3       Running   0          3h
ceph-osd-dev-vdb-9t8fh                  1/1       Running   0          2h
ceph-osd-dev-vdb-fgl8w                  1/1       Running   0          2h
ceph-osd-dev-vdb-sssqq                  1/1       Running   0          2h
ceph-rbd-provisioner-5544dcbcf5-97nxn   1/1       Running   0          3h
ceph-rbd-provisioner-5544dcbcf5-nfkhw   1/1       Running   0          3h
ceph-rgw-65b4bd8cc5-ml7gk               0/1       Pending   0          3h

# 检查 ceph 集群状态
~ # kubectl exec -it ceph-mon-9xqms -n ceph -c ceph-mon -- ceph -s
  cluster:
    id:     726cc770-3daa-4792-8cd9-b100aea87711
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum host-10-24-0-14,host-10-24-0-15,host-10-24-0-16
    mgr: host-10-24-0-14(active)
    osd: 3 osds: 3 up, 3 in

  data:
    pools:   1 pools, 128 pgs
    objects: 3 objects, 16 bytes
    usage:   324 MB used, 104 GB / 104 GB avail
    pgs:     128 active+clean

至此,ceph 集群部署完成。 但是 创建的 storageclass 中的 secret 为空,需要更新 key:

# 获取 ceph 集群的 client-admin-keyring
kubectl exec -it ceph-mon-9xqms -n ceph -c ceph-mon -- grep key /etc/ceph/ceph.client.admin.keyring |awk "{printf "%s", $NF}’|base64

# 将上面输出的编码的 keyring 填入到 storageclass使用的 secret: pvc-ceph-client-key中, 替换 null 为以上值
kubectl edit secret pvc-ceph-client-key  -n ceph

# 创建并初始化 rbd 池
kubectl exec -it ceph-mon-9xqms -n ceph -c ceph-mon -- ceph osd pool create rbd 128 
kubectl exec -it ceph-mon-9xqms -n ceph -c ceph-mon -- rbd pool init rbd

最后, 验证通过 storageclass 动态分配 rbd image。
~/template/ceph_connect # cat test-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ceph-pvc-2
spec:
  accessModes:
   - ReadWriteOnce
  resources:
    requests:
       storage: 2Gi
  storageClassName: ceph-rbd


~/template/ceph_connect # kubectl get pvc
NAME         STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
ceph-pvc     Bound     pvc-a56fd3d2-9157-11e8-bd1d-fa163eaae838   2Gi        RWO            ceph-pool      1h
ceph-pvc-2   Bound     pvc-b28baac0-9161-11e8-bd1d-fa163eaae838   2Gi        RWO            ceph-rbd       7s

~/template/ceph_connect # kubectl exec -it ceph-mon-9xqms -n ceph -c ceph-mon -- rbd ls
kubernetes-dynamic-pvc-a57200fe-9157-11e8-9008-fa163eaae838
kubernetes-dynamic-pvc-b2931fd1-9161-11e8-9ac7-0a580ae9410b
注意事项: 问题1

遇到了一个问题,重新安装的时候 osd 会init/Error,是因为osd 盘头部数据没有被清理,导致osd的 initContainer 中的prepare-old-pod 这个 container 脚本执行错误,内容为:

虽然已经在 ceph-overriders.yaml 的 osd-devices 中 设置了 zap=“1”,但可能是代码逻辑有问题,导致并没有清理,需要手动清理,步骤为:

# 查看/dev/vdb 设备状态
~/template/ceph_connect # lsblk /dev/vdb
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdb    252:16   0  40G  0 disk
|-vdb1 252:17   0  35G  0 part
`-vdb2 252:18   0   5G  0 part

# 通过 dd 向清空盘头部的110M覆盖分区信息
dd if=/dev/zero of=/dev/vdb1 bs=1M count=110 oflag=sync 
dd if=/dev/zero of=/dev/vdb2 bs=1M count=110 oflag=sync

# 通过 parted 删除分区
parted /dev/vdb rm 1
parted /dev/vdb rm 2
问题2

storageclass 方式创建 pod 挂在 volume,总是报错

timeout expired waiting for volumes to attach/mount for pod : 
Error syncing pod 096ac42b-919a-11e8-bd1d-fa163eaae838 ("mypod_ceph(096ac42b-919a-11e8-bd1d-fa163eaae838)"), skipping: timeout expired waiting for volumes to attach/mount for pod "ceph"/"mypod". list of unattached/unmounted volumes=[vol1]

具体的创建步骤是:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ceph-pvc
  namespace: ceph
spec:
  accessModes:
   - ReadWriteOnce
  resources:
    requests:
       storage: 2Gi
  storageClassName: ceph-rbd
---
kind: Pod
apiVersion: v1
metadata:
  name: mypod
  namespace: ceph
spec:
  containers:
    - name: nginx
      image: nginx
      command:
        - sleep
        - "3600"
      volumeMounts:
      - mountPath: "/mnt/rbd"
        name: vol1
  volumes:
    - name: vol1
      persistentVolumeClaim:
        claimName: ceph-pvc

这个问题在网上目前没有解决的明确说法,由于看 log 没有明显报错,pvc 和 pv 正常创建但是挂不上去,考虑可能是 kubernetes 这边调用 ceph 有问题,就将集群内所有 host 的 ceph-common 包升级到对应的版本,解决了这个问题。如果遇到这个问题,不妨一试。我 host 的 ceph-common是之前对接 j 版 ceph 时安装, 现在安装的 l 版。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/32684.html

相关文章

  • 使用Rook+CephKubernetes上作持久存储

    摘要:充当在的业务流程层,将和流程部署为副本集。来自的文件将存储软件转变为自我管理自我扩展和自我修复的存储服务。由于请求使用文件系统格式化的卷,因此我需要在所有节点上安装工具。如果没有指定特定的存储类,我安装的任何应用程序都将使用进行数据存储。 作者:Earl C. Ruby III showImg(https://segmentfault.com/img/bVbljHL?w=300&h=1...

    kuangcaibao 评论0 收藏0
  • 使用Rook+CephKubernetes上作持久存储

    摘要:充当在的业务流程层,将和流程部署为副本集。来自的文件将存储软件转变为自我管理自我扩展和自我修复的存储服务。由于请求使用文件系统格式化的卷,因此我需要在所有节点上安装工具。如果没有指定特定的存储类,我安装的任何应用程序都将使用进行数据存储。 作者:Earl C. Ruby III showImg(https://segmentfault.com/img/bVbljHL?w=300&h=1...

    muddyway 评论0 收藏0
  • k8s与caas--容器云caas平台的落地实践

    摘要:容器云将支持应用的一键式部署交付,提供负载均衡,私有域名绑定,性能监控等应用生命周期管理服务。本容器云平台,对接持续集成发布系统。 前言 在移动互联网时代,新的技术需要新技术支持环境、新的软件交付流程和IT架构,从而实现架构平台化,交付持续化,业务服务化。容器将成为新一代应用的标准交付件,容器云将帮助企业用户构建研发流程和云平台基础设施。缩短应用向云端交付的周期,降低运营门槛。加速向互...

    h9911 评论0 收藏0
  • k8s与caas--容器云caas平台的落地实践

    摘要:容器云将支持应用的一键式部署交付,提供负载均衡,私有域名绑定,性能监控等应用生命周期管理服务。本容器云平台,对接持续集成发布系统。 前言 在移动互联网时代,新的技术需要新技术支持环境、新的软件交付流程和IT架构,从而实现架构平台化,交付持续化,业务服务化。容器将成为新一代应用的标准交付件,容器云将帮助企业用户构建研发流程和云平台基础设施。缩短应用向云端交付的周期,降低运营门槛。加速向互...

    KaltZK 评论0 收藏0

发表评论

0条评论

marser

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<