docker部署单机ceph(绑定到k8s)

docker部署单机ceph(绑定到k8s)步骤一,二:运行ceph服务步骤三及之后:使用cephRBD绑定K8s的storageclass一.准备干净的一块磁盘我们准备一块150G的磁盘:vdb若之前使用过ceph,就算格式后还是会有问题,因

步骤一,二: 运行ceph服务

步骤三及之后: 使用ceph RBD绑定K8s的storageclass

一. 准备干净的一块磁盘

我们准备一块150G的磁盘: vdb

docker部署单机ceph(绑定到k8s)

若之前使用过ceph,就算格式后还是会有问题,因为磁盘还是会有旧数据

osd报错: error creating empty object store xxxxx (5) Input/output error

需执行以下步骤:

1.格式化磁盘
mkfs.xfs  -f /dev/vdb 

2.清除数据,否则还会保存旧数据,导致创建失败,使用0重写前一个G内容.
dd if=/dev/zero of=/dev/vdb bs=1M count=1024 

3.先破坏磁盘所有分区,再将分区由mgr转为gpt格式分区
sgdisk -Z -g /dev/vdb 

格式化失败问题参考:

1.查看谁在占用,找到ceph-**字样(ceph-**为lsblk显示的块设备具体信息)  dmsetup ls

2.使用dmsetup 删除字样  dmsetup remove ceph-**

3.查看设备信息,可以看到ceph-**等标识等标识消失  lsblk 

二. docker部署

第一步:拉镜像,要注意拉取的版本

docker pull ceph/daemon:latest-mimic  
docker tags ceph/daemon:latest-mimic ceph/daemon:latest  

第二步: 新建两个映射的文件目录

mkdir /etc/ceph  
mkdir /var/lib/ceph

第三步: 运行mon,mgr,osd服务

docker run --name mon  -d --network=host -v /etc/ceph:/etc/ceph \
           -v /var/lib/ceph:/var/lib/ceph -e MON_IP=172.25.1.80 \
           -e CEPH_PUBLIC_NETWORK=172.25.1.0/24 ceph/daemon mon

docker run --name mgr  -d --network=host -v /etc/ceph:/etc/ceph \
           -v /var/lib/ceph:/var/lib/ceph  ceph/daemon mgr


docker run --name osd  -d --network=host -v /etc/ceph:/etc/ceph \
           -v /var/lib/ceph:/var/lib/ceph  -v /dev/:/dev/  -v /run/udev:/run/udev \
           --pid=host --privileged=true -e OSD_DEVICE=/dev/vdb -e OSD_TYPE=disk  \
           ceph/daemon osd

第四步: 因为ceph集群默认是三个节点,所以没那么多节点时,可以通过修改配置,使ceph状态变为健康

vi /etc/ceph/ceph.conf

添加一下两行:

osd_pool_default_size = 1     #创建pool的时候默认pool是3副本
osd_pool_default_min_size = 1 #参数pool最少可写的副本数,并且默认是2

重启所有镜像

——-

服务起来后,可以看到磁盘已经自动分区了:

docker部署单机ceph(绑定到k8s)

三. 安装ceph-common,以centOS为例

yum install ceph-common -y

(若是k8s集群使用ceph,则每台机器都需要安装)

——-

安装完后,可以查看ceph状态:

ceph -w

四. 创建pool

通常在创建pool之前,需要覆盖默认的pg_num,官方推荐:

若少于5个OSD, 设置pg_num为128。

5~10个OSD,设置pg_num为512。

10~50个OSD,设置pg_num为4096。

超过50个OSD,可以参考pgcalc计算。

——-

创建pool语法:

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

——-

比如我们只有一个osd:

ceph osd pool create kubelzx 128  

——-

查看pool状态:

rados df

docker部署单机ceph(绑定到k8s)

五. 在kubernetes部署rbd的provisioner

(若kube-controller-manager是二进制部署在宿主机上的,可跳过步骤五)

因为我kubernetes是基于kubeadm部署的,所以kube-controller-manager是如下图,以容器运行的:

docker部署单机ceph(绑定到k8s)

这种方式下,kubernetes在创建使用ceph rbd pv/pvc时没任何问题,但使用dynamic provisioning自动管理存储生命周期时会报错。

提示"rbd: create volume failed, err: failed to create rbd image: executable file not found in $PATH:"

问题来自gcr.io提供的kube-controller-manager容器镜像未打包ceph-common组件,缺少了rbd命令,因此无法通过rbd命令为pod创建rbd image,查了github的相关文章,目前kubernetes官方在kubernetes-incubator/external-storage项目通过External Provisioners的方式来解决此类问题。

本文主要针对该问题,通过rbd-provisioner的方式,解决ceph rbd的dynamic provisioning问题。

——-

编写rbd-provisioner.yaml,如下:

vi rbd-provisioner.yaml

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: rbd-provisioner
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: ["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: rbd-provisioner
subjects:
  - kind: ServiceAccount
    name: rbd-provisioner
    namespace: default
roleRef:
  kind: ClusterRole
  name: rbd-provisioner
  apiGroup: rbac.authorization.k8s.io

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

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rbd-provisioner
spec:
  selector:
    matchLabels:
      app: rbd-provisioner
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: rbd-provisioner
    spec:
      containers:
      - name: rbd-provisioner
        image: quay.io/external_storage/rbd-provisioner:latest
        env:
        - name: PROVISIONER_NAME
          value: ceph.com/rbd
      serviceAccount: rbd-provisioner

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: rbd-provisioner

——-

创建:

kubectl create -f rbd-provisioner.yaml

——-

查看rbd是否起来

docker部署单机ceph(绑定到k8s)

六. 创建storageclass

获取ceph client key

ceph auth get-key client.admin | base64

docker部署单机ceph(绑定到k8s)

——-

编写storageclass

vi cephrbd_storageclass.yaml

apiVersion: v1
kind: Secret
metadata:
  name: cephrbd-secret
type: kubernetes.io/rbd
data:
  key: QVFCZmNRcGcyS0NBSFJBQVRuMmlQMTZwV2liSDdJZEdma2RVRVE9PQ==

--- 
apiVersion: v1
kind: Secret
metadata:
  name: cephrbd-secret-user
type: kubernetes.io/rbd
data:
  key: QVFCZmNRcGcyS0NBSFJBQVRuMmlQMTZwV2liSDdJZEdma2RVRVE9PQ==

--- 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: ceph.com/rbd
parameters:
  monitors: 172.25.1.80:6789
  adminId: admin
  adminSecretName: cephrbd-secret
  adminSecretNamespace: default
  pool: kubelzx
  userId: admin
  userSecretName: cephrbd-secret-user
  userSecretNamespace: default
  fsType: ext4
  imageFormat: "2"
  imageFeatures: "layering"

其中注意的是:

provisioner需要修改为ceph.com/rbd,这样才会使用你创建的provisioner去处理

secret的key就是ceph 的client key

parameters.monitors就是mon的地址,可以通过以下命令找到:

netstat -tunlp | grep 6789

parameters.pool就是我们上面创建的pool名字,kubelzx

——-

创建storageclass

kubectl crate -f cephrbd_storageclass.yaml

七. 创建pvc

编写pvc

vi cephrbd_pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-fast-1g
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 1Gi
  storageClassName: fast

——-

创建pvc

kubectl create -f cephrbd_pvc.yaml

——-

查看pvc

docker部署单机ceph(绑定到k8s)

——-

能看到pvc的状态能正常Bound上就算是

大功告成!!!

今天的文章docker部署单机ceph(绑定到k8s)分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/14593.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注