部署Ceph系统为K8S提供存储平台

部署Ceph系统为K8S提供存储平台

0 前情提要

本文的搭建过程是在K8S系统上复用的,因此关于系统优化配置方面不再赘述。

说明:如不特殊说明,以下操作均在三台系统上执行。

1 新建磁盘

给虚拟机新增一块硬盘,由于我之前已经添加过一块盘了,所以盘符为sdc:

/dev/sdc

2 配置yum源

vim /etc/yum.repos.d/ceph.repo

[Ceph]
name=Ceph packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/x86_64/
gpgcheck=0

[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch/
gpgcheck=0
vim /etc/yum.repos.d/epel.repo

[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch/debug
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1

[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
#baseurl=http://download.fedoraproject.org/pub/epel/7/SRPMS
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1

3 创建普通用户并设置sudo免密

groupadd -g 3000 ceph
useradd -u 3000 -g ceph ceph
echo "ceph" | passwd --stdin ceph
echo "ceph ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph
chmod 0440 /etc/sudoers.d/ceph

4 新建的用户创建ssh免密登录

在master节点执行:

su - ceph
ssh-keygen
ssh-copy-id ceph@k8s-master
ssh-copy-id ceph@k8s-node1
ssh-copy-id ceph@k8s-node2

5 安装软件

sudo su - root    # master要从ceph用户切换到root用户下
yum install ceph-deploy -y
wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 https://archive.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
yum install python-pip -y
yum install ceph ceph-osd ceph-mds ceph-mon ceph-radosgw -y
yum install ntp -y
systemctl start ntpd
systemctl enable ntpd

Tps:安装时间同步服务的目的是为了防止后续集群因为时间不同步导致健康状态从OK转变为WARN。

6 创建集群

在master节点执行:

su - ceph
mkdir cephcluster
cd cephcluster/
# 初始化创建ceph集群
ceph-deploy new --cluster-network 192.168.0.0/24 --public-network 192.168.0.0/24 k8s-master k8s-node1 k8s-node2
# 初始化monitor服务
ceph-deploy mon create-initial
# 配置信息拷贝到三台节点
ceph-deploy admin k8s-master k8s-node1 k8s-node2
sudo chown -R ceph:ceph /etc/ceph
chown -R ceph:ceph /etc/ceph    # 在其它节点执行

查看状态:

ceph -s
  cluster:
    id:     14450b7d-84ce-40c4-8a1e-46af50457fc6
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum k8s-master,k8s-node1,k8s-node2 (age 65s)
    mgr: no daemons active
    osd: 0 osds: 0 up, 0 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:

7 配置mgr服务

在master节点执行:

ceph-deploy mgr create k8s-master k8s-node1 k8s-node2

查看状态:

ceph -s
  cluster:
    id:     14450b7d-84ce-40c4-8a1e-46af50457fc6
    health: HEALTH_WARN
            OSD count 0 < osd_pool_default_size 3

  services:
    mon: 3 daemons, quorum k8s-master,k8s-node1,k8s-node2 (age 99s)
    mgr: k8s-master(active, since 23s), standbys: k8s-node2, k8s-node1
    osd: 0 osds: 0 up, 0 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:

8 配置osd服务

在master节点执行:

ceph-deploy osd create --data /dev/sdc k8s-master
ceph-deploy osd create --data /dev/sdc k8s-node1
ceph-deploy osd create --data /dev/sdc k8s-node2

9 配置mon服务

在master节点执行:

先查看Ceph集群中的mon服务状态:

ceph mon stat

e1: 3 mons at {k8s-master=[v2:192.168.0.234:3300/0,v1:192.168.0.234:6789/0],k8s-node1=[v2:192.168.0.235:3300/0,v1:192.168.0.235:6789/0],k8s-node2=[v2:192.168.0.236:3300/0,v1:192.168.0.236:6789/0]}, election epoch 10, leader 0 k8s-master, quorum 0,1,2 k8s-master,k8s-node1,k8s-node2
ceph mon_status --format json-pretty

{
    "name": "k8s-master",
    "rank": 0,
    "state": "leader",
    "election_epoch": 10,
    "quorum": [
        0,
        1,
        2
    ],
    "quorum_age": 495,
    "features": {
        "required_con": "2449958747315912708",
        "required_mon": [
            "kraken",
            "luminous",
            "mimic",
            "osdmap-prune",
            "nautilus"
        ],
        "quorum_con": "4611087854035861503",
        "quorum_mon": [
            "kraken",
            "luminous",
            "mimic",
            "osdmap-prune",
            "nautilus"
        ]
    },
    "outside_quorum": [],
    "extra_probe_peers": [
        {
            "addrvec": [
                {
                    "type": "v2",
                    "addr": "192.168.0.235:3300",
                    "nonce": 0
                },
                {
                    "type": "v1",
                    "addr": "192.168.0.235:6789",
                    "nonce": 0
                }
            ]
        },
        {
            "addrvec": [
                {
                    "type": "v2",
                    "addr": "192.168.0.236:3300",
                    "nonce": 0
                },
                {
                    "type": "v1",
                    "addr": "192.168.0.236:6789",
                    "nonce": 0
                }
            ]
        }
    ],
    "sync_provider": [],
    "monmap": {
        "epoch": 1,
        "fsid": "14450b7d-84ce-40c4-8a1e-46af50457fc6",
        "modified": "2021-03-02 18:32:42.613085",
        "created": "2021-03-02 18:32:42.613085",
        "min_mon_release": 14,
        "min_mon_release_name": "nautilus",
        "features": {
            "persistent": [
                "kraken",
                "luminous",
                "mimic",
                "osdmap-prune",
                "nautilus"
            ],
            "optional": []
        },
        "mons": [
            {
                "rank": 0,
                "name": "k8s-master",
                "public_addrs": {
                    "addrvec": [
                        {
                            "type": "v2",
                            "addr": "192.168.0.234:3300",
                            "nonce": 0
                        },
                        {
                            "type": "v1",
                            "addr": "192.168.0.234:6789",
                            "nonce": 0
                        }
                    ]
                },
                "addr": "192.168.0.234:6789/0",
                "public_addr": "192.168.0.234:6789/0"
            },
            {
                "rank": 1,
                "name": "k8s-node1",
                "public_addrs": {
                    "addrvec": [
                        {
                            "type": "v2",
                            "addr": "192.168.0.235:3300",
                            "nonce": 0
                        },
                        {
                            "type": "v1",
                            "addr": "192.168.0.235:6789",
                            "nonce": 0
                        }
                    ]
                },
                "addr": "192.168.0.235:6789/0",
                "public_addr": "192.168.0.235:6789/0"
            },
            {
                "rank": 2,
                "name": "k8s-node2",
                "public_addrs": {
                    "addrvec": [
                        {
                            "type": "v2",
                            "addr": "192.168.0.236:3300",
                            "nonce": 0
                        },
                        {
                            "type": "v1",
                            "addr": "192.168.0.236:6789",
                            "nonce": 0
                        }
                    ]
                },
                "addr": "192.168.0.236:6789/0",
                "public_addr": "192.168.0.236:6789/0"
            }
        ]
    },
    "feature_map": {
        "mon": [
            {
                "features": "0x3ffddff8ffecffff",
                "release": "luminous",
                "num": 1
            }
        ],
        "osd": [
            {
                "features": "0x3ffddff8ffecffff",
                "release": "luminous",
                "num": 2
            }
        ],
        "client": [
            {
                "features": "0x3ffddff8ffecffff",
                "release": "luminous",
                "num": 2
            }
        ],
        "mgr": [
            {
                "features": "0x3ffddff8ffecffff",
                "release": "luminous",
                "num": 1
            }
        ]
    }
}

发现有3个mon服务,所以不必再次配置。

10 查看服务状态

在master节点执行:

systemctl list-units | grep ceph-mon
ceph-mon@k8s-master.service                                                                                                           loaded active running   Ceph cluster monitor daemon
ceph-mon.target                                                                                                                       loaded active active    ceph target allowing to start/stop all ceph-mon@.service instances at once

systemctl list-units | grep ceph-mgr
ceph-mgr@k8s-master.service                                                                                                           loaded active running   Ceph cluster manager daemon
ceph-mgr.target                                                                                                                       loaded active active    ceph target allowing to start/stop all ceph-mgr@.service instances at once

systemctl list-units | grep ceph-osd
var-lib-ceph-osd-ceph\x2d0.mount                                                                                                      loaded active mounted   /var/lib/ceph/osd/ceph-0
ceph-osd@0.service                                                                                                                    loaded active running   Ceph object storage daemon osd.0
ceph-osd.target 

查看状态:

ceph -s
  cluster:
    id:     14450b7d-84ce-40c4-8a1e-46af50457fc6
    health: HEALTH_WARN
            clock skew detected on mon.k8s-node1

  services:
    mon: 3 daemons, quorum k8s-master,k8s-node1,k8s-node2 (age 15m)
    mgr: k8s-master(active, since 41s), standbys: k8s-node2, k8s-node1
    osd: 3 osds: 3 up (since 10m), 3 in (since 10m)

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   3.0 GiB used, 597 GiB / 600 GiB avail
    pgs: 
                                                                                                         loaded active active    ceph target allowing to start/stop all ceph-osd@.service instances at once

发现health: HEALTH_WARN,解决方案:

su - ceph
echo "mon clock drift allowed = 2" >> ~/cephcluster/ceph.conf
echo "mon clock drift warn backoff = 30" >> ~/cephcluster/ceph.conf
ceph-deploy --overwrite-conf config push k8s-master k8s-node1 k8s-node2
sudo systemctl restart ceph-mon.target

再次查看状态:

ceph -s
  cluster:
    id:     14450b7d-84ce-40c4-8a1e-46af50457fc6
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum k8s-master,k8s-node1,k8s-node2 (age 2m)
    mgr: k8s-master(active, since 5m), standbys: k8s-node2, k8s-node1
    osd: 3 osds: 3 up (since 16m), 3 in (since 16m)

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   3.0 GiB used, 597 GiB / 600 GiB avail
    pgs:

这次状态正常了。

11 配置dashboard

在master节点执行:

yum -y install ceph-mgr-dashboard    # 三个节点都要执行安装操作
echo "mgr initial modules = dashboard" >> ~/cephcluster/ceph.conf
ceph-deploy --overwrite-conf config push k8s-master k8s-node1 k8s-node2
sudo systemctl restart ceph-mgr@k8s-master
ceph mgr module enable dashboard
ceph dashboard create-self-signed-cert
ceph dashboard set-login-credentials admin ceph123
******************************************************************
***          WARNING: this command is deprecated.              ***
*** Please use the ac-user-* related commands to manage users. ***
******************************************************************
Username and password updated
ceph mgr services
{
    "dashboard": "https://k8s-master:8443/"
}

打开浏览器,输入地址 https://192.168.0.234:8443/

输入账号面:admin,ceph123:

12 使用示例

https://kubernetes.io/zh/docs/concepts/storage/volumes/#cephfs
https://github.com/kubernetes/examples/tree/master/volumes/cephfs
https://github.com/kubernetes/examples/blob/master/volumes/cephfs/cephfs.yam

13 参考链接

https://www.cnblogs.com/weiwei2021/p/14060186.html
https://blog.youkuaiyun.com/weixin_43902588/article/details/109147778
https://www.cnblogs.com/huchong/p/12435957.html
https://www.cnblogs.com/sisimi/p/7700608.html

<think>我们正在讨论如何在Kubernetes中部署Ceph作为存储解决方案。用户要求查找部署方法,而提供的引用资料中提到了几种方法,包括使用Helm部署和通过Rook部署(Rook是一个在Kubernetes中运行存储系统的operator)。根据引用[2]和引用[4],我们可以总结出两种主要方法:使用Helm部署Ceph以及使用Rook operator部署Ceph。 由于引用[4]中提到了Rook部署,并且Rook是部署Ceph到Kubernetes的流行方法,我将重点介绍使用Rook部署Ceph的步骤。同时,引用[2]提到了使用Helm部署,我们也可以简要提及。 ### 部署方法1:使用Rook部署Ceph(推荐) Rook是一个开源的云原生存储协调器,为Kubernetes提供平台无关的存储服务。它简化了Ceph在Kubernetes集群中的部署、管理和运维。 **部署步骤:** 1. **前提条件**: - 一个运行的Kubernetes集群(至少三个节点,每个节点有未使用的磁盘或分区)。 - 节点满足Ceph的硬件要求(SSD推荐,网络带宽足够)。 - 安装`kubectl`和`helm`(可选,用于安装Rook operator)。 2. **部署Rook operator**: ```bash # 克隆Rook仓库 git clone --single-branch --branch v1.10.12 https://github.com/rook/rook.git cd rook/deploy/examples # 创建Rook所需的命名空间和CRD kubectl create -f crds.yaml -f common.yaml -f operator.yaml # 等待Rook operator运行(在rook-ceph命名空间) kubectl -n rook-ceph get pod ``` 3. **创建Ceph集群**: - 编辑`cluster.yaml`文件,配置存储节点和磁盘选择。 - 应用配置: ```bash kubectl create -f cluster.yaml ``` - 等待Ceph集群状态健康(所有Pod运行正常): ```bash kubectl -n rook-ceph get pod ``` 4. **创建存储类(StorageClass)**: - Rook提供了示例存储类配置(如`csi/rbd/storageclass.yaml`): ```bash kubectl create -f csi/rbd/storageclass.yaml ``` - 验证存储类: ```bash kubectl get storageclass ``` 5. **测试PVC**: - 创建示例PVC(使用`pvc.yaml`): ```bash kubectl create -f pvc.yaml ``` - 确认PVC状态为`Bound`。 ### 部署方法2:使用Helm部署Ceph 引用[2]提到基于Helm部署Ceph。但是,请注意,Ceph的Helm chart可能不是官方维护的,因此推荐使用Rook。如果选择Helm,步骤大致如下: 1. 添加Helm仓库并安装: ```bash helm repo add ceph https://ceph.github.io/charts helm install my-ceph ceph/ceph ``` 2. 根据需要进行配置(通过values.yaml)。 ### 注意事项 - **持久化存储**:确保Kubernetes集群有可用的持久化存储(如本地磁盘或云存储)。 - **网络**:Ceph集群内部通信需要低延迟、高带宽网络。 - **监控**:部署Ceph Dashboard或使用Prometheus监控集群状态[^3][^4]。 ### 验证部署 部署完成后,可以通过以下命令验证: ```bash kubectl get pods -n rook-ceph kubectl get storageclass kubectl get pvc ``` ### 相关问题 §§相关问题§§ 1. 如何解决Rook部署Ceph时节点磁盘发现失败的问题? 2. 如何在Kubernetes中扩展Ceph集群的存储容量? 3. 如何备份和恢复基于Ceph的Kubernetes持久卷? 4. Ceph存储性能调优有哪些常用方法? 以上内容综合了引用资料中的信息,提供了两种部署方法,并以Rook部署为重点,因为它是当前Kubernetes上部署Ceph的主流方式[^2][^4]。 </think>以下是使用 Ceph 作为 Kubernetes 存储的两种主流部署方法,结合引用资料和行业实践整理: ### 方法一:通过 Rook Operator 部署(推荐) **核心优势**:自动化管理 Ceph 生命周期,深度集成 Kubernetes API #### 部署流程: 1. **前提准备**(引用[3][^3]): - 至少 3 个节点(每个节点需有未格式化磁盘) - 网络互通(建议万兆网络) - 禁用交换空间:`swapoff -a` ```bash # 检查节点磁盘 lsblk -f | grep -v loop ``` 2. **安装 Rook Operator**: ```bash # 部署 CRD 和 Operator kubectl apply -f https://raw.githubusercontent.com/rook/rook/v1.10.12/deploy/examples/crds.yaml kubectl apply -f https://raw.githubusercontent.com/rook/rook/v1.10.12/deploy/examples/common.yaml kubectl apply -f https://raw.githubusercontent.com/rook/rook/v1.10.12/deploy/examples/operator.yaml # 验证 Operator 状态(引用[4][^4]) kubectl get pods -n rook-ceph -l app=rook-ceph-operator ``` ✅ 预期输出: ``` NAME READY STATUS RESTARTS AGE rook-ceph-operator-757546f8c7-x2ft5 1/1 Running 0 2m ``` 3. **部署 Ceph 集群**: ```yaml # cluster.yaml 示例 apiVersion: ceph.rook.io/v1 kind: CephCluster metadata: name: rook-ceph namespace: rook-ceph spec: dataDirHostPath: /var/lib/rook mon: count: 3 # 必须为奇数 storage: useAllNodes: true useAllDevices: true ``` ```bash kubectl apply -f cluster.yaml ``` 4. **验证集群状态**: ```bash kubectl get cephcluster -n rook-ceph kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph status ``` ✅ 健康标志:`HEALTH_OK` 5. **创建 StorageClass**(引用[2][^4]): ```yaml # storageclass.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: rook-ceph-block provisioner: rook-ceph.rbd.csi.ceph.com parameters: clusterID: rook-ceph pool: replicapool imageFormat: "2" ``` ### 方法二:通过 Helm 部署(适合快速验证) **适用场景**:测试环境或小规模部署(引用[2][^2]) #### 部署步骤: 1. 添加 Helm 仓库: ```bash helm repo add ceph https://ceph.github.io/charts helm repo update ``` 2. 安装 Ceph: ```bash helm install my-ceph ceph/ceph \ --namespace ceph-system \ --set mon.count=3 \ --set osd.devices='{"/dev/sdb", "/dev/sdc"}' ``` 3. 验证 OSD 状态: ```bash kubectl -n ceph-system exec -it my-ceph-tools -- ceph osd tree ``` ### 关键配置注意事项 1. **网络规划**(引用[3][^3]): - Ceph 公共网络:客户端访问 - 集群网络:OSD 间数据同步 - Kubernetes 需开通端口:6789 (mon), 6800-7300 (osd) 2. **存储池优化**: ```bash # 创建副本池 ceph osd pool create kube-pool 128 128 replicated ceph osd pool set kube-pool size 3 ``` 3. **性能调优**: ```ini # ceph.conf 优化片段 [osd] osd_memory_target = 4GB # 按节点内存调整 ``` ### 验证 PVC 功能 ```yaml # pvc-test.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ceph-pvc-test spec: storageClassName: rook-ceph-block accessModes: - ReadWriteOnce resources: requests: storage: 1Gi ``` ```bash kubectl apply -f pvc-test.yaml kubectl get pvc # 预期状态 BOUND ``` ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值