在k8s上部署ceph集群
在k8s上通过rook部署ceph集群
没有部署k8s集群的,参考我的上一篇文章:从零开始部署Kubernetes
接下来开始部署ceph集群,并使用对象存储服务
一、集群规划
主机名 | 角色 | IP | 磁盘 |
---|---|---|---|
k8s-master | master | 192.168.2.75 | |
k8s-node-1 | node-1, ceph osd | 192.168.2.66 | 500G |
k8s-node-2 | node-2, ceph osd | 192.168.2.74 | 500G |
k8s-node-3 | node-3 , ceph osd | 192.168.2.77 | 1T |
ceph的mon、mgr等一系列组件随机分配在node节点上,也可以通过标签选择器进行分配
二、准备工作
数据盘准备
要配置 Ceph 存储集群,至少需要以下一种本地存储类型:
- 原始设备(无分区或格式化文件系统)
- 原始分区(无格式化文件系统)
- LVM 逻辑卷(无格式化文件系统)
- block模式下存储类提供的持久卷
使用以下命令确认分区或设备是否使用文件系统格式化:
[root@k8s-node-2 home]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 vfat 16E4-9B21 /boot/efi
├─sda2 xfs 469facfb-6231-4e79-ae9d-54aada593379 /boot
└─sda3 LVM2_member ApHAYx-2l49-nMrx-BsxK-o3zx-BBc0-QtJhFy
├─centos-root xfs fd9595bd-dd74-42c5-848f-26e05eea4865 /
├─centos-swap swap 28b401e7-91eb-4680-9363-da550815c179
└─centos-home xfs 71d29d61-b769-46c8-a710-6f75e66a6258 /home
sdb
如果 FSTYPE 字段不为空,则相应设备顶部有一个文件系统。在此示例中,sdb可用于 Rook,而 sda及其分区具有文件系统且不可用。
三、部署集群
准备工作
首先我们需要下载rook官方项目代码,里面包含了基本上所有需要用到的yaml文件,可以下载到服务器上,也可以下载到本地,把需要用到的文件上传到服务器上。我是下载到本地了,方便查看修改,而且不容易执行错误。我们需要的文件在deploy/examples包下
1. 部署ceph operator
这一步需要的文件分别为crds.yaml、common.yaml、operator.yaml,其中前面两个文件不需要修改,operator.yaml文件可以修改其中的镜像文件,改为阿里云镜像地址
# ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.9.0"
# ROOK_CSI_REGISTRAR_IMAGE: "registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.7.0"
# ROOK_CSI_RESIZER_IMAGE: "registry.k8s.io/sig-storage/csi-resizer:v1.7.0"
# ROOK_CSI_PROVISIONER_IMAGE: "registry.k8s.io/sig-storage/csi-provisioner:v3.4.0"
# ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.k8s.io/sig-storage/csi-snapshotter:v6.2.1"
# ROOK_CSI_ATTACHER_IMAGE: "registry.k8s.io/sig-storage/csi-attacher:v4.1.0"
ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.9.0"
ROOK_CSI_REGISTRAR_IMAGE: "registry.aliyuncs.com/google_containers/csi-node-driver-registrar:v2.7.0"
ROOK_CSI_RESIZER_IMAGE: "registry.aliyuncs.com/google_containers/csi-resizer:v1.7.0"
ROOK_CSI_PROVISIONER_IMAGE: "registry.aliyuncs.com/google_containers/csi-provisioner:v3.4.0"
ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.aliyuncs.com/google_containers/csi-snapshotter:v6.2.1"
ROOK_CSI_ATTACHER_IMAGE: "registry.aliyuncs.com/google_containers/csi-attacher:v4.1.0"
修改完成后执行
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
# 在继续操作之前,验证 rook-ceph-operator 是否正常运行, Ready状态全部为 n/n 表示正常
kubectl get deployment -n rook-ceph
kubectl get pod -n rook-ceph
2. 创建ceph集群
Rook允许通过自定义资源定义(CephCluster CRD)创建和自定义存储集群,创建群集的主要模式有四种不同的模式,关于模式以及关于cluster.yaml所有可用的字段和说明请仔细阅读和参考:Rook自定义资源
其中placement属性可以通过标签选择器分配服务器,storage属性选择每台服务器上对应的数据盘,我这里就直接按照默认的执行了
kubectl create -f cluster.yaml
执行完成后需要等待一段时间,这段时间k8s创建很多pod,其中一些状态可能是Pending ,ContainerCreating ,Terminating ,PodInitializing 等等,都不要慌,最后所有的osd pod都处于Completed状态,其余容器都处于Running状态就差不多了
[root@k8s-master ~]# kubectl get pod -n rook-ceph -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
rook-ceph-crashcollector-k8s-node-1-85f99d7744-hqfnj 1/1 Running 0 5h31m 10.1.109.78 k8s-node-1 <none> <none>
rook-ceph-crashcollector-k8s-node-2-57fd6f9597-btjcm 1/1 Running 0 6h21m 10.1.140.72 k8s-node-2 <none> <none>
rook-ceph-crashcollector-k8s-node-3-6d65b7f596-5xm6s 1/1 Running 0 5h45m 10.1.76.163 k8s-node-3 <none> <none>
rook-ceph-mgr-a-8454559888-b9lhn 3/3 Running 0 6h21m 10.1.109.70 k8s-node-1 <none> <none>
rook-ceph-mgr-b-5fb8856767-p5grr 3/3 Running 0 6h21m 10.1.76.146 k8s-node-3 <none> <none>
rook-ceph-mon-a-76567b55dc-zr8kq 2/2 Running 0 6h24m 10.1.109.69 k8s-node-1 <none> <none>
rook-ceph-mon-b-58977cc77f-n6488 2/2 Running 0 6h21m 10.1.140.71 k8s-node-2 <none> <none>
rook-ceph-mon-c-84b45f8d67-pv22p 2/2 Running 0 6h21m 10.1.76.143 k8s-node-3 <none> <none>
rook-ceph-operator-8665b7898b-pgvvd 1/1 Running 0 5h21m 10.1.76.136 k8s-node-3 <none> <none>
rook-ceph-osd-0-767fd959d9-4gphf 2/2 Running 0 6h20m 10.1.76.153 k8s-node-3 <none> <none>
rook-ceph-osd-1-6964fdc497-dhwp2 2/2 Running 0 5h31m 10.1.109.77 k8s-node-1 <none> <none>
rook-ceph-osd-2-577d7bb75f-lhkbz 2/2 Running 0 5h31m 10.1.140.76 k8s-node-2 <none> <none>
rook-ceph-osd-prepare-k8s-node-1-j9wkz 0/1 Completed 0 5h21m 10.1.109.79 k8s-node-1 <none> <none>
rook-ceph-osd-prepare-k8s-node-2-pns5d 0/1 Completed 0 5h21m 10.1.140.77 k8s-node-2 <none> <none>
rook-ceph-osd-prepare-k8s-node-3-d7825 0/1 Completed 0 5h20m 10.1.76.149 k8s-node-3 <none> <none>
这一步如果出现问题的话,可以查看日志找到具体的问题,比如查看osd-1的日志,这里最好查看一下所有osd的日志,因为如果osd数据盘不满足可能也会显示成功
[root@k8s-master ~]# kubectl logs -f rook-ceph-osd-prepare-k8s-node-1-j9wkz -n rook-ceph
2023-07-19 03:45:58.975359 D | cephosd: {
"2f6215cc-31e3-418b-b9f1-432714fdd00b": {
"ceph_fsid": "cdda0420-b7eb-420d-a2e6-3473b13d91e7",
"device": "/dev/sdb",
"osd_id": 1,
"osd_uuid": "2f6215cc-31e3-418b-b9f1-432714fdd00b",
"type": "bluestore"
}
}
2023-07-19 03:45:58.975424 D | exec: Running command: lsblk /dev/sdb --bytes --nodeps --pairs --paths --output SIZE,ROTA,RO,TYPE,PKNAME,NAME,KNAME,MOUNTPOINT,FSTYPE
2023-07-19 03:45:58.978517 D | sys: lsblk output: "SIZE=\"500107862016\" ROTA=\"0\" RO=\"0\" TYPE=\"disk\" PKNAME=\"\" NAME=\"/dev/sdb\" KNAME=\"/dev/sdb\" MOUNTPOINT=\"\" FSTYPE=\"\""
2023-07-19 03:45:58.978540 D | exec: Running command: sgdisk --print /dev/sdb
2023-07-19 03:45:58.980374 I | cephosd: setting device class "ssd" for device "/dev/sdb"
2023-07-19 03:45:58.980381 I | cephosd: 1 ceph-volume raw osd devices configured on this node
2023-07-19 03:45:58.980395 I | cephosd: devices = [{ID:1 Cluster:ceph UUID:2f6215cc-31e3-418b-b9f1-432714fdd00b DevicePartUUID: DeviceClass:ssd BlockPath:/dev/sdb MetadataPath: WalPath: SkipLVRelease:true Location:root=default host=k8s-node-1 LVBackedPV:false CVMode:raw Store:bluestore TopologyAffinity: Encrypted:false ExportService:false}]
#这儿 cephosd: 1 ceph-volume raw osd devices configured on this node表示有满足需要的磁盘
#基本上这台服务器就没有问题了
3. 验证ceph集群
要验证群集是否处于正常状态,可以运行 toolbox 工具箱
kubectl create -f toolbox.yaml
# 找到tools对应的pod
kubectl get pod -n rook-ceph
# 进入ceph集群
[root@k8s-master ~]# kubectl exec -it rook-ceph-tools-68b98695bb-c7hzg -n rook-ceph -- bash
bash-4.4$
# 这里面就可以通过ceph命令查看集群状态
bash-4.4$ ceph -s
cluster:
id: cdda0420-b7eb-420d-a2e6-3473b13d91e7
health: HEALTH_OK
services:
mon: 3 daemons, quorum a,b,c (age 6h)
mgr: a(active, since 5h), standbys: b
osd: 3 osds: 3 up (since 5h), 3 in (since 5h)
rgw: 2 daemons active (2 hosts, 1 zones)
data:
pools: 9 pools, 89 pgs
objects: 406 objects, 953 KiB
usage: 141 MiB used, 1.8 TiB / 1.8 TiB avail
pgs: 89 active+clean
io:
client: 36 KiB/s rd, 170 B/s wr, 35 op/s rd, 23 op/s wr
# 查看osd状态
bash-4.4$ ceph osd status
ID HOST USED AVAIL WR OPS WR DATA RD OPS RD DATA STATE
0 k8s-node-3 57.8M 931G 0 0 2 0 exists,up
1 k8s-node-1 41.8M 465G 0 0 2 0 exists,up
2 k8s-node-2 41.4M 465G 0 0 0 0 exists,up
每个 OSD 都有一个状态,可以是以下几种之一:
- up:表示该 OSD 正常运行,并且可以处理数据请求。
- down:表示该 OSD 当前无法运行或不可用,可能由于硬件故障或软件问题。
- out:表示该 OSD 不参与数据存储或恢复,这通常是由于管理员手动将其标记为不可用。
- exists:表示该 OSD 配置存在,但尚未启动或加入集群。
4. 使用对象存储服务
官方给定的对象存储服务配置文件中用到了标签选择器,所以需要给服务器添加k8s标签,标签是键值对形式
# 添加标签
[root@k8s-master rook]# kubectl label nodes k8s-master app=rook-ceph-rgw
node/k8s-master labeled
# 查看标签
[root@k8s-master rook]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
k8s-master Ready control-plane 7h28m v1.27.2 app=rook-ceph-rgw,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
k8s-node-1 Ready <none> 6h58m v1.27.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node-1,kubernetes.io/os=linux
k8s-node-2 Ready <none> 6h58m v1.27.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node-2,kubernetes.io/os=linux
k8s-node-3 Ready <none> 7h25m v1.27.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node-3,kubernetes.io/os=linux
# 取消标签
[root@k8s-master rook]# kubectl label nodes k8s-master app-
node/k8s-master unlabeled
接下来创建对象服务
kubectl create -f obeject.yaml
然后对外开放接口,修改rgw-external.yaml文件
apiVersion: v1
kind: Service
metadata:
name: rook-ceph-rgw-my-store-external
namespace: rook-ceph # namespace:cluster
labels:
app: rook-ceph-rgw
rook_cluster: rook-ceph # namespace:cluster
rook_object_store: my-store
spec:
ports:
- name: rgw
port: 80 # service port mentioned in object store crd
protocol: TCP
targetPort: 8080
nodePort: 31000 # 外部访问端口
selector:
app: rook-ceph-rgw
rook_cluster: rook-ceph # namespace:cluster
rook_object_store: my-store
sessionAffinity: None
type: NodePort # 指定类型,开放外部访问
然后执行
kubectl create -f rgw-external.yaml
5. 创建用户
因为我这边是需要固定的accessKey和secretKey,在官方给定的文件中没有找到对这个进行配置的,所以我这边的用户是直接在ceph集群中手动创建,如果不需要指定accessKey可以使用默认配置进行创建
# 创建用户
kubectl create -f object-user.yaml
也可以和我一样通过ceph创建
# radosgw-admin user create --uid=[parameter] --display-name=[parameter] --access-key=[ak] --secret=[sk]
[root@k8s-master rook]# kubectl exec -it rook-ceph-tools-68b98695bb-c7hzg -n rook-ceph -- bash
bash-4.4$ radosgw-admin user create --uid=test --display-name=test --access-key=123456 --secret=123456
# 查看用户列表
[root@k8s-master rook]# kubectl exec -it rook-ceph-tools-68b98695bb-c7hzg -n rook-ceph -- bash
bash-4.4$ radosgw-admin metadata list user
[
"dashboard-admin",
"test",
"rgw-admin-ops-user"
]
# 查看用户信息
bash-4.4$ radosgw-admin user info --uid=test
{
"user_id": "test",
"display_name": "test",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
"user": "test",
"access_key": "123456",
"secret_key": "123456"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
然后通过access_key和secret_key就能访问对象服务了。
6. Ceph Dashboard
仪表板是一个非常有用的工具,可让您概览 Ceph 集群的状态,包括总体运行状况、mon 仲裁状态、mgr、osd 和其他 Ceph 守护程序的状态、查看池和 PG 状态、显示守护程序的日志等。Rook 使启用仪表板变得简单。
按照步骤可以参考官网:Ceph Dashboard
# 查看mgr服务的端口
kubectl get svc -n rook-ceph
默认的配置里已经启用了Dashboard,所以只需要对外开放就行了
# 我这里使用默认配置
kubectl create -f dashboard-external-https.yaml
# 查看
[root@k8s-master rook]# kubectl get svc -n rook-ceph
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rook-ceph-mgr ClusterIP 10.101.105.69 <none> 9283/TCP 6h44m
rook-ceph-mgr-dashboard ClusterIP 10.103.77.135 <none> 8443/TCP 6h44m
rook-ceph-mgr-dashboard-external-https NodePort 10.109.189.84 <none> 8443:32070/TCP 5h39m
rook-ceph-mon-a ClusterIP 10.102.74.18 <none> 6789/TCP,3300/TCP 6h48m
rook-ceph-mon-b ClusterIP 10.111.71.195 <none> 6789/TCP,3300/TCP 6h45m
rook-ceph-mon-c ClusterIP 10.108.213.94 <none> 6789/TCP,3300/TCP 6h45m
rook-ceph-rgw-my-store ClusterIP 10.98.1.10 <none> 80/TCP 6h9m
rook-ceph-rgw-my-store-external NodePort 10.104.242.130 <none> 80:31000/TCP 6h3m
然后通过主机IP + 端口就可以访问了
接下来就获取密码
[root@k8s-master rook]# kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo
3Oz@NV1P_"/yx3P[^H&L
账号admin,密码就是获取到的这个,就可以登陆了
ceph集群基本上就部署完成了。
更多推荐
所有评论(0)