当前位置:网站首页 > R语言数据分析 > 正文

ceph的存储类型(cephrbd存储)



为了便于学习容器编排,实践容器编排,本篇文章记录在本地虚拟机搭建一个准生产级别的Kubernetes集群。在此k8s集群的基础上,我们可以尝试着容器化工作或者学习场景中的各种中间件集群,以及微服务应用。

从学习的目的出发,准备搭建一个控制节点和两个工作节点的集群,为了节约成本,需要支持pod被调度到控制节点上。

虚拟机 节点角色 系统配置 安装组件 k8s-master01 主节点 centos7,2核6G kube-apiserver、kube-scheduler、kube-controller-manager、etcd、kube-proxy、kubeadm、kubelet、kubectl、docker k8s-workder01 工作节点 centos7,2核6G kubeadm、kubelet、kubectl、kube-proxy、docker k8s-workder02 工作节点 centos7,2核6G kubeadm、kubelet、kubectl、kube-proxy、docker

k8s集群组件.png

组件名称 组件类型 部署方式 组件描述 kube-apiserver 控制平面组件 通过kubeadm容器化部署 API 服务器是 Kubernetes 控制面的组件, 该组件公开了 Kubernetes API。 API 服务器是 Kubernetes 控制面的前端 kube-scheduler 控制平面组件 通过kubeadm容器化部署 负责监视新创建的、未指定运行节点(node)的 Pods, 选择节点让 Pod 在上面运行 kube-controller-manager 控制平面组件 通过kubeadm容器化部署 从逻辑上讲,每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行 etcd 控制平面组件 通过kubeadm容器化部署 etcd是兼具一致性和高可用性的键值数据库,作为保存 Kubernetes所有集群数据(资源对象等)的后台数据库 kubelet 节点组件 yum安装,无法容器化部署 kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。 kubelet 不会管理不是由 Kubernetes 创建的容器 kube-proxy 节点组件 通过kubeadm容器化部署 kube-proxy 是集群中每个节点上运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。 docker 节点组件 yum安装 docker引擎,k8s支持的一种容器运行时实现 kubeadm 集群辅助部署工具 yum安装 k8s官方集群部署工具 kubectl 客户端工具 yum安装 用来与集群通信的命令行工具

无论是本地物理机还是公有云上的虚拟机,都应该保证以下几点要求

  • 满足安装 Docker 项目所需的要求,比如 64 位的 Linux 操作系统、3.10 及以上的内核版本
  • x86 或者 ARM 架构均可
  • 机器之间网络互通,容器网络互通的前提
  • 有外网访问权限,因为需要拉取镜像(也可手动下载好镜像)
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid
  • 开启机器上的某些端口,详情参照k8s官网,k8s组件端口协议
  • 禁用交换分区。为了保证 kubelet 正常工作
  1. 在所有节点上安装 Docker 和 kubeadm
  2. 部署 Kubernetes Master
  3. 部署容器网络插件
  4. 部署 Kubernetes Worker
  5. 部署 Dashboard 可视化插件
  6. 部署容器存储插件

k8s通过上层CRI接口对接容器运行时实现,这里我们采用docker引擎这个容器运行时实现。因为我们采用的是centos7的机器部署k8s集群,此处采用yum源安装docker引擎

  • Centos7 yum源安装docker引擎
  • 参考docker官网的安装手册
注意:配置 Docker 守护程序,尤其是使用 systemd 来管理容器的 cgroup,保持docker与kubelet的cgroup驱动一致
 
  

3.2.1、配置主机名

k8s集群节点之中不可以有重复的主机名、MAC 地址或 product_uuid

 
  

3.2.2、修改节点host

 
  

说明:以上是k8s三个节点的IP域名映射。

3.2.3、允许iptables检查桥接流量

  • 确保br_netfilter模块被加载
 
  
  • 确保iptables能够正确地查看桥接流量

为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1

 
  

3.2.4、禁用swap交换分区

 
  

3.2.5、配置kubernetes的yum源

  • 配置官方的kubernetes yum源(网络允许的情况下)
  • 配置采用阿里云镜像的kubernetes yum源

3.2.6、yum源安装kubeadm、kubelet、kubectl

 
  
  • 在上述安装 kubeadm 的过程中,kubeadm 和 kubelet、kubectl、kubernetes-cni 这几个二进制文件都会被自动安装好
 
  
 
  
 
  

说明:kubernetes一切皆容器的思想体现,k8s控制平面的核心组件均采用pod管理容器部署。默认情况下, kubeadm 会从 k8s.gcr.io 仓库拉取镜像。如果请求的 Kubernetes 版本是 CI 标签 (例如 ci/latest),则使用 gcr.io/k8s-staging-ci-images,如果网络不允许,我们可以手动下载以上所有的容器镜像,也可以指定从自定义的镜像仓库拉取

 
  
  • apiserver-advertise-address:API 服务器所公布的其正在监听的 IP 地址。如果未设置,则使用默认网络接口
  • control-plane-endpoint:为控制平面指定一个稳定的IP地址或DNS名称,
  • image-repository:选择用于拉取控制平面镜像的容器仓库,默认值:"k8s.gcr.io"
  • kubernetes-version:为控制平面选择一个特定的Kubernetes版本, 默认值:"stable-1"
  • service-cidr:为服务的虚拟IP地址另外指定IP地址段,默认值:"10.96.0.0/12"
  • pod-network-cidr:指明pod网络可以使用的IP地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs

3.3.2.1、初始化控制平面日志

 
  

说明:以上日志中有两个比较重要的信息,如下:

  • 集群添加工作节点的指令
 
  
  • kubectl客户端依赖的集群配置
 
  

说明:Kubernetes 集群默认需要加密方式访问。所以,这几条命令,就是将刚刚部署生成的 Kubernetes 集群的安全配置文件,保存到当前用户的.kube 目录下,kubectl 默认会使用这个目录下的授权信息访问 Kubernetes集群。

初始化控制平面后,我们首先来查看下节点的状态,会发现Master节点的状态是NotReady。

 
  

进一步,通过 kubectl describe 指令的输出,我们可以看到 NodeNotReady 的原因在于,我们尚未部署任何网络插件。

 
  

另外,可以看到,CoreDNS这个依赖于网络的Pod处于Pending状态,即调度失败。这当然是符合预期的,因为这个 Master 节点的网络尚未就绪。

 
  

3.3.3.1、安装flannel网络插件

在Kubernetes项目一切皆容器的设计理念指导下,部署网络插件也是采用pod部署。

 
  
  • kube-flannel.yml文件内容
 
  
  • 安装flannel网络插件日志
 
  
  • 网络插件部署完成后,我们可以通过 kubectl get重新检查Pod的状态
 
  
  • 为节点打上“污点”(Taint)的命令是
 
  
  • Pod声明Toleration污点
 
  

这个 Toleration 的含义是,这个Pod能“容忍”所有键值对为foo=bar的Taint(operator: “Equal”,“等于”操作)。

  • kubectl describe检查Master节点的Taint字段
 
  

可以看到,Master节点默认被加上了node-role.kubernetes.io/master:NoSchedule这样一个“污点”,其中“键”是node-role.kubernetes.io/master,而没有提供“值”。

  • 删除master节点的默认污点
    为了方便起见,测试学习环境需要master节点也能被调度pod运行,简单粗暴地为master节点删除掉默认污点。



 
  
  • 执行部署Master节点时生成的kubeadm join指令
 
  
  • worker节点加入集群日志输出
 
  
  • 参考官方部署文档

3.5.1、部署Dashboard可视化插件

 
  
  • kubernetes-dashboard.yaml文件内容
 
  
  • kubernetes-dashboard安装日志
 
  

3.5.2、创建超级管理员的账号用于登录Dashboard

Dashboard是一个Web Server,很多人经常会在自己的公有云上无意地暴露 Dashboard 的端口,从而造成安全隐患。所以,1.7 版本之后的 Dashboard 项目部署完成后,默认只能通过 Proxy的方式在本地访问。

  • 创建用户,并绑定集群admin权限
 
  
  • 生成Bearer Token
 
  

3.5.3、修改kubernetes-dashboard的service

为了更友好的访问dashboard服务,需要修改kubernetes-dashboard.yaml的service配置部分,将service type从ClusterIP修改为NodePort的方式。

 
  
  • 更新以上配置文件后,执行kubectl apply更新资源对象
 
  
  • 查看更新后的service资源对象
 
  

3.5.4、访问kubernetes-dashboard

 
  
  • 更多信息参考rook官网
  • 查看rook github

3.6.1、部署rook存储插件前置条件

以当前最新的rook版本为v1.8.7为例,进行以下的安装步骤。为了配置Ceph存储集群,至少需要以下本地存储选项之一。

  • 原始设备(无分区或格式化文件系统)
  • 原始分区(无格式化文件系统)
  • 可通过block模式从存储类获得PV
  • 集群至少需要三个节点,每个节点至少需要一个OSD(对象存储设备),保证存储类的创建
  • 需要Kubernetesv1.16或更高版本

3.6.2、部署rook存储插件前置准备

由于本次搭建的环境,机器是通过VMware创建出来的,所以可以很方便地为每个虚拟机添加一块全新的硬盘。用于后续rook集群作为一个OSD(对象存储设备)。

  • VMware添加虚拟机硬盘,参考vmware官方文档
 
  

虚拟机添加新硬盘.png

  • 查看磁盘块设备
 
  

说明:注意FSTYPE字段的值,如果为空,则表示当前的设备尚未写入文件系统,例如以上的sdb设备就是刚新增的硬盘设备。

3.6.3、部署rook存储插件前置准备

  • 克隆rook git仓库
 
  
  • 查看rook集群部署的相关K8S资源配置文件
    进入rook/deploy/examples目录,可查看rook项目提供了很多K8S资源配置文件。暂时我们只需要关注个别的资源配置文件。



资源文件 描述 crds.yaml 创建rook集群前,首先需要被创建的CRD资源对象,让k8s认识rook的自定义资源 common.yaml 启动operator和ceph cluster所必须得通用资源,必须先于operator.yaml、cluster.yaml资源被创建 operator.yaml rook operator控制器 cluster.yaml rook-ceph cluster配置 storageclass.yaml 创建存储类,为k8s集群提供动态创建pv的能力 mysql.yaml rook官方提供的mysql测试服务,依赖于storageclass创建的pv持久化 wordpress.yaml rook官方提供的wordpress测试服务,依赖于storageclass创建的pv持久化
 
  

3.6.4、rook存储插件安装

rook各个资源对象依赖的镜像如下所示,这些镜像也是在谷歌的镜像仓库。

 
  
3.6.4.1、创建的CRD资源对象

创建rook集群前,首先需要被创建的CRD资源对象,让k8s认识rook的自定义资源;此资源文件未依赖镜像。

 
  
  • 执行日志
 
  
3.6.4.2、创建通用资源对象

启动operator和ceph cluster所必须得通用资源,必须先于operator.yaml、cluster.yaml资源被创建。此资源文件未依赖镜像。

 
  
  • 执行日志
 
  
3.6.4.3、创建rook operator控制器

依赖于rook/ceph:v1.8.7镜像,此镜像国内网络可以正常拉取。但是也默认依赖CSI相关的镜像,需要访问谷歌镜像仓库。

 
  
  • 如果无法拉取谷歌镜像,请修改相关依赖镜像仓库地址
 
  
  • 修改过镜像后的operator.yaml文件内容
 
  
  • 执行日志
 
  
3.6.4.4、创建rook-ceph cluster
 
  
  • 查看pod状态
 
  
3.6.4.5、创建存储类

创建存储类,为k8s集群提供动态创建pv的能力

 
  
 
  
  • storageclass.yaml资源文件内容
 
  
3.6.4.6、创建rook官方提供的mysql测试服务

rook官方提供的mysql测试服务,依赖于storageclass创建的pv持久化

 
  
 
  
  • mysql.yaml资源文件内容
 
  
3.6.4.7、创建toolbox

默认启动的Ceph集群,是开启Ceph认证的,这样你登陆Ceph组件所在的Pod里,是没法去获取集群状态,以及执行CLI命令,这时需要部署Ceph toolbox。

 
  
3.6.4.8、创建rook官方提供的wordpress测试服务

rook官方提供的wordpress测试服务,依赖于storageclass创建的pv持久化

 
  
 
  

说明:这里的pv会自动创建,当提交了包含StorageClass字段的PVC之后,Kubernetes 就会根据这个StorageClass创建出对应的PV,这是用到的是Dynamic Provisioning机制来动态创建pv。

  • 访问wordpress
 
  

image.png

到此这篇ceph的存储类型(cephrbd存储)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • entware命令(命令enable)2026-04-18 15:36:06
  • qpainterpath 平移(qpainter drawpie)2026-04-18 15:36:06
  • ldrsw指令(ldrh指令)2026-04-18 15:36:06
  • uchari什么意思(uchida是什么意思)2026-04-18 15:36:06
  • 颜色代码 转换(颜色代码转换RGBA)2026-04-18 15:36:06
  • endoport器械(technogym abdominal crunch器械用法)2026-04-18 15:36:06
  • oracle软件使用教程(oracledeveloper使用教程)2026-04-18 15:36:06
  • swagger无法访问(swagger-ui访问不到)2026-04-18 15:36:06
  • swagger2 配置(swagger的配置)2026-04-18 15:36:06
  • theater(theater英文翻译)2026-04-18 15:36:06
  • 全屏图片