步骤一,二: 运行ceph服务
步骤三及之后: 使用ceph RBD绑定K8s的storageclass
一. 准备干净的一块磁盘
我们准备一块150G的磁盘: vdb
若之前使用过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
重启所有镜像
——-
服务起来后,可以看到磁盘已经自动分区了:
三. 安装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
五. 在kubernetes部署rbd的provisioner
(若kube-controller-manager是二进制部署在宿主机上的,可跳过步骤五)
因为我kubernetes是基于kubeadm部署的,所以kube-controller-manager是如下图,以容器运行的:
这种方式下,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是否起来
六. 创建storageclass
获取ceph client key
ceph auth get-key client.admin | base64
——-
编写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
——-
能看到pvc的状态能正常Bound上就算是
大功告成!!!
今天的文章docker部署单机ceph(绑定到k8s)分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/14593.html