Rook存储:Kubernetes中最优秀的存储

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本文讲的是Rook存储:Kubernetes中最优秀的存储【编者的话】Rook存储集群,其实是在著名的分布式存储系统Ceph的一个封装,以Kubernetes Application的方式运行了监控。
本文讲的是Rook存储:Kubernetes中最优秀的存储【编者的话】Rook存储集群,其实是在著名的分布式存储系统Ceph的一个封装,以Kubernetes Application的方式运行了监控。

【上海站|3天烧脑式微服务架构训练营】培训内容包括:DevOps、微服务、Spring Cloud、Eureka、Ribbon、Feign、Hystrix、Zuul、Spring Cloud Config、Spring Cloud Sleuth等。

在Kubernetes v0.3正式版中,Rook将原生态的云存储系统以Kubernetes Application方式与Kubernetes结合;块存储,对象存储以及分布式文件系统已经直接与Kuberenete Application进行了融合。

Rook存储完全自动化地管理着存储集群,这点与传统上的集群管理员的自动管理方式一样,区别在于:
  • 传统意义上的集群管理员都必须掌握安装和监控系统。而Rook存储的运行是完全自动化的;
  • Rook存储是以通过第三方资源以Kubernetes扩展的形式运行的。

首先,创建一个名为 rook-operator.yaml 的文件:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: rook-operator
spec:
replicas: 1
template:
metadata:
  labels:
    name: rook-operator
spec:
  containers:
  - name: rook-operator
    image: quay.io/rook/rook-operator
    env:
    - name: ROOK_OPERATOR_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace

启动Rook存储。
kubectl create -f rook-operator.yaml

Rook存储运行起来之后,我们可以开始创建一个存储集群了,创建 rook-cluster.yaml 文件:
apiVersion: rook.io/v1beta1
kind: Cluster
metadata:
name: my-rook
spec:
namespace: rook
version: latest
useAllDevices: false

开始创建集群。
kubectl create -f rook-cluster.yaml

就这样,几分钟之后,我们就拥有用于Kubernetes Applications的存储集群了。

Rook存储的目标是确保我们用于正常运行的存储集群,首次运行时,必要的Kubernetes原语都会新建,然后,Rook存储集群将会持续监控所有的存储组件。

如何使用Rook存储集群呢?

声明卷

为了使用Rook块存储,我们Kubernetes Application首先需要创建基于Ceph RBD卷插件的存储类型: rook-storageclass.yaml
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
name: rook-block
namespace: rook
provisioner: kubernetes.io/rbd
parameters:
monitors: INSERT_HERE
adminId: admin
adminSecretName: rook-admin
adminSecretNamespace: rook
pool: rook
userId: rook-rbd-user
userSecretName: rook-rbd-user

你可能已经注意到我们需要在yaml文件中写入monitor节点信息,我们将在下个正式版中简化。Kubernetes的Rook卷插件,虽然这个过程很痛苦。但是现在,我们仍然需要运行以下命令来声明monitor节点信息:
export MONS=$(kubectl -n rook get pod mon0 mon1 mon2 -o json|jq ".items[].status.podIP"|tr -d "\""|sed -e 's/$/:6790/'|paste -s -d, -)

最后,我们可以替换yaml文件中的monitor节点信息,并且创建存储类型:
sed 's#INSERT_HERE#'$MONS'#' rook-storageclass.yaml | kubectl create -f -

现在,我们在Kuberenetes Application中创建一个卷声明,例如:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
annotations:
volume.beta.kubernetes.io/storage-class: rook-block
labels:
app: mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
  storage: 20Gi

我们在容器指定部分使用卷声明:
spec:
  containers:
  - image: mysql:5.6
    name: mysql
    volumeMounts:
    - name: mysql-persistent-storage
      mountPath: /var/lib/mysql
  volumes:
  - name: mysql-persistent-storage
    persistentVolumeClaim:
      claimName: mysql-pv-claim

这个例子中的yaml中可以从 这里 获得,以及可以从 这里 获取详细的介绍。

Rook存储集群客户端

连接Rook存储集群的另一个办法是通过使用Rook 客户端容器,该容器提供了简单的直接测试块设备,对象存储以及文件系统的基础环境;然而这并非是说只能这样来运用Rook存储系统,它仅仅提供了用于更加了解Kububernetes卷插件原理的一个实验环境而已。

启动并进入以下pod,然后我们就有使用rook命令来管理存储集群的基础环境。

创建client Pod:  rook-client.yaml
apiVersion: v1
kind: Pod
metadata:
name: rook-client
namespace: rook
spec:
containers:
- name: rook-client
image: quay.io/rook/rook-client:latest
imagePullPolicy: IfNotPresent
command: ["sleep", "36500d"]
securityContext:
  privileged: true
volumeMounts:
    - mountPath: /dev
      name: dev
    - mountPath: /sys
      name: sys
    - mountPath: /lib/modules
      name: libmodules
volumes:
  - name: dev
    hostPath:
      path: /dev
  - name: sys
    hostPath:
      path: /sys
  - name: libmodules
    hostPath:
      path: /lib/modules

运行client pod:
kubectl create -f rook-client.yml

等到pod处于运行状态,然后进入pod:
kubectl exec -it rook-client bash 

该工具将自动载入管理API的配置以及管理Rook集群的配置;

查看集群中的节点信息:
rook node ls

查看集群状态:
rook status

创建S3存储:
rook object create

查看所有的使用方法,可以查看 readme
或者使用help:
rook --help

Kubernetes资源规划

该存储通过创建若干Kubernetes原生资源来自动完成集群初始化,然后监控资源以保证集群的健康状态。

密钥

集群首次运行,cephx admin【这里为什么是ceph admin呢,因为rook cluster仅仅是ceph cluster的封装而已】和monitor密钥将自动生成并保存在Kubernetes密钥对中。

服务

三个Ceph monitor运行以Pods形式集群中运行;这些Pods对保证存储集群的健康是至关重要的。

在集群中至少有三个节点,由于反亲和性在默认情况下是被指定的;所以故障域必须是跨节点的。

在Pods运行之后,集群将在通知Ceph osd之前等待Ceph monitor选举确定;集群将启用一个Go协程来监控monitor pods的健康状态。

服务集合

在标明为存储节点的机器中一对damon set将为Ceph OSDs而运行;因为osd pod运行在各个机器上,存储配置将存储为空目录形式; 默认情况下,数据将存放在该目录下,在未来,我们将赋予存储集群管理员指定节点上使用设备或目录来进行存储的能力;

pod将监控本地OSD的运行状态;

第三方资源

如果管理员需要更改集群的配置,Rook提供了TPR(third party resources )的方式来指导该如何配置;集群将监控TPR(third party resources )以及应用该修改在集群中,将来,TPR将拥有兼容s3/swift的ceph RGW,分布式文件系统(mds),管理Ceph用户(这些用户可以使用rbd卷)等等功能。

管理 API

RooK API Deployment用以提供RESTful形式的管理平台以及简化集群周边的管理任务,API则提供了查看集群健康状态以及更新集群配置的功能,最典型的API示例就是rook client tool。

可靠性

假如Rook存储由于某些原因停止运行,存储集群依然会像预期那样继续运行,Ceph Mons、OSDs、MDS和RGW服务与Rook存储没有耦合,最基础的集群监控是通过Kubernetes自身来运行的,如果Rook存储再次运行,更加完善的健康检测系统将会恢复;并且维护第三方资源的健康状态。

周边

Rook存储的目标是使用集群来完成自动存储,维持集群的可靠性,维护数据的安全性;Rook存储现阶段仍旧处于起步阶段;我们期待您的反馈以及为将来的版本做出贡献;查看更多文档以及简单yaml文件,查看 rook Githup

原文链接:Rook Operator: First class storage for Kubernetes(翻译:程鹏)

原文发布时间为:2017-03-14

本文作者:程鹏

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:Rook存储:Kubernetes中最优秀的存储

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
存储 Kubernetes 容器
Kubernetes 存储选项:持久化卷与存储类
【8月更文第29天】随着容器化的普及,越来越多的应用程序需要持久化数据以保持状态信息。Kubernetes 提供了一套完整的解决方案来管理和配置持久化存储,包括持久卷 (Persistent Volume, PV)、持久卷声明 (Persistent Volume Claim, PVC) 和存储类 (StorageClass)。本文将详细介绍这些概念,并通过实际示例来演示如何在 Kubernetes 中配置存储。
83 1
|
2月前
|
存储 Kubernetes 容器
k8s创建NFS动态存储
k8s创建NFS动态存储
|
3月前
|
存储 Kubernetes 应用服务中间件
k8s使用rbd作为存储
k8s使用rbd作为存储
48 6
|
2月前
|
存储 Kubernetes 数据安全/隐私保护
在K8S中,如果后端nfs存储的ip发生变化如何解决?
在K8S中,如果后端nfs存储的ip发生变化如何解决?
|
2月前
|
存储 缓存 Kubernetes
在K8S中,业务Pod数据如何存储?
在K8S中,业务Pod数据如何存储?
|
2月前
|
存储 JSON Kubernetes
在K8S中,存储敏感信息方式有哪些?
在K8S中,存储敏感信息方式有哪些?
|
2月前
|
存储 Kubernetes Cloud Native
在k8S中,rook概念是什么?
在k8S中,rook概念是什么?
|
2月前
|
存储 Kubernetes 容器
在k8S中,所支持的存储供应模式有哪些?
在k8S中,所支持的存储供应模式有哪些?
|
2月前
|
存储 Kubernetes 调度
在k8S中,共享存储的作用是什么?
在k8S中,共享存储的作用是什么?
|
2月前
|
存储 Kubernetes 测试技术
在k8s中,有哪些存储?
在k8s中,有哪些存储?
下一篇
无影云桌面