没有部署k8s集群的,参考我的上一篇文章:从零开始部署Kubernetes
接下来开始部署ceph集群,并使用对象存储服务

一、集群规划

主机名角色IP磁盘
k8s-mastermaster192.168.2.75
k8s-node-1node-1, ceph osd192.168.2.66500G
k8s-node-2node-2, ceph osd192.168.2.74500G
k8s-node-3node-3 , ceph osd192.168.2.771T

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包下

rook项目github地址

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 + 端口就可以访问了
dashboard
接下来就获取密码

[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,密码就是获取到的这个,就可以登陆了
dashboard
ceph集群基本上就部署完成了。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐