2025年ceph的存储类型(cephrbd存储)

ceph的存储类型(cephrbd存储)为了便于学习容器编排 实践容器编排 本篇文章记录在本地虚拟机搭建一个准生产级别的 Kubernetes 集群 在此 k8s 集群的基础上 我们可以尝试着容器化工作或者学习场景中的各种中间件集群 以及微服务应用 从学习的目的出发 准备搭建一个控制节点和两个工作节点的集群 为了节约成本 需要支持 pod 被调度到控制节点上 虚拟机 节点角色 系统配置 安装组件 k8s master01 主节点

大家好,我是讯享网,很高兴认识大家。



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

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

虚拟机节点角色系统配置安装组件k8s-master01主节点centos7,2核6Gkube-apiserver、kube-scheduler、kube-controller-manager、etcd、kube-proxy、kubeadm、kubelet、kubectl、dockerk8s-workder01工作节点centos7,2核6Gkubeadm、kubelet、kubectl、kube-proxy、dockerk8s-workder02工作节点centos7,2核6Gkubeadm、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 这几个二进制文件都会被自动安装好
讯享网

说明:kubelet现在每隔几秒就会重启,因为它陷入了一个等待kubeadm指令的死循环。
注意:如果校验签名报错,关闭校验,设置(gpgcheck=0、repo_gpgcheck=0)即可

 
讯享网

说明: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.yamlrook operator控制器cluster.yamlrook-ceph cluster配置storageclass.yaml创建存储类,为k8s集群提供动态创建pv的能力mysql.yamlrook官方提供的mysql测试服务,依赖于storageclass创建的pv持久化wordpress.yamlrook官方提供的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

小讯
上一篇 2025-05-15 20:50
下一篇 2025-05-26 08:29

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/208389.html