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

本文讲的是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中最优秀的存储

时间: 2024-12-21 09:36:10

Rook存储:Kubernetes中最优秀的存储的相关文章

哪位大神指导一下,关于Oracle数据库中类型varchar2(2) 存储汉字的问题

问题描述 哪位大神指导一下,关于Oracle数据库中类型varchar2(2) 存储汉字的问题 大神们跪求招数:orcale数据库中的一个字段YXQDW(有效期单位) 类型varchar2(2) 才两字节 用来存一个汉字,比如"年",我的项目(C#)一个汉字占用3个字节, 写SQL语句 insert不进去啊,提示字段范围超出了.难不成要像blob字段那样写?或者有什么更好的方式能将该字段插入呢?万分感激! 解决方案 可以换成nvarchar(2),这个是可变长度

关于数据库中客户基本资料存储信息分类的设计说明

设计|数据|数据库 关于数据库中存储信息分类的设计说明 zyx zyx 2 112 2002-11-14T03:56:00Z 2002-11-20T01:46:00Z 2002-11-20T01:46:00Z 3 259 1480 ufosft nanjing 12 2 1817 9.2812 7.8 磅 0 2 关于数据库中客户基本资料存储信息分类的设计说明   在进行系统数据库设计时,经常使用对客户基本资料的分类处理,如对商业客户的分类处理,一般的设计人员可以使用下面几种方法去实现:    

Windows Server 2008中的可移动存储访问组策略设置

在Windows Server 2008 中,管理员可以应用组策略来控制用户是否可以对使用可移动介质的任何设备进行读取或写入.这些策略可用于帮助禁止将敏感或机密材料写入可移动介质或包含存储区域的可移动设备后带走. 此策略设置可以在两个位置找到.在"计算机配置\管理模板\系统\可移动存储访问"中找到的策略设置将影响计算机和登录计算机的每个用户.在"用户配置\管理模板\系统\可移动存储访问"中找到的策略设置仅影响对其应用了策略设置的用户,包括组(如果使用 Active

如何把spinner中的dropdown item存储到sqlite数据库?

问题描述 如何把spinner中的dropdown item存储到sqlite数据库? 我想存储 spinner中的dropdown值到数据库.我可以按照android开发网站的说明中获得dropdown,但是当用户点击保存按钮时,不能把dropdown的值存储到数据库中.请问如何把spinner中的dropdown item存储到sqlite数据库? 我用的是下面的代码: public class Akshay extends Activity { @Override public void

区域-pci 总线中总线域和存储域转换问题

问题描述 pci 总线中总线域和存储域转换问题 pci设备只能访问在存储器域有映射的区域,但是这个映射关系是初始化pci后就固定了还是可以再修改的?因为pci与存储器域的映射有限,倘若我下次访问另外一块存储器地址咋办? 解决方案 http://blog.sina.com.cn/s/blog_6472c4cc0100qg5i.html

散列函数-利用单向hash函数找k阶碰撞过程中如何实现高位存储

问题描述 利用单向hash函数找k阶碰撞过程中如何实现高位存储 我用SHA作为散列函数,希望在2^160的空间中找2^30个k阶碰撞数据.但是我申请不了这么大的数组,急求有没有什么方法或思想可以实现? 解决方案 http://bbs.csdn.net/topics/391821832http://hunteagle.iteye.com/blog/118551

机制- 关于Azure存储账户中存储虚拟机VHD文件的注意事项

问题描述 关于Azure存储账户中存储虚拟机VHD文件的注意事项 1C 我们在使用Azure时经常都会在Azure存储账户中放一些文件,包括Azure虚机的VHD文件也都是放在存储账户中的.建议用户要注意监控Azure存储账户的每秒请求数量等指标,以免超出上限而导致触发限制机制. 解决方案 每个Azure存储账户可以提供最多500 TB的存储,以及上至每秒20000个请求Azure存储账户中的每个blob对象,可以提供上至每秒500个请求或者是每秒60MB的数据传输,注意超过这两项其中任何一项即

java中的几个存储机制

问题描述 java中的几个存储机制 新人初学java,有几个问题一直搞不懂,所以求教各位,感激不尽 1.关于堆栈和堆得问题,现在有这样一种说法,说是变量的存储机制是根据他的作用域决定的,一个方法里定义的变量,则这个变量在这个方法结束后,就会被销毁,所以他的存储的生命期是定好的,所以会存到栈里(堆栈),然后如果是定义的全局变量,是放在堆里的,但是我又看到书上说一般基本数据类型(byte,short,int long,float,double,char)这些是存放在栈里的,而引用数据类型,数组,对象

.net项目编译时,无法在证书存储区中找到清单签名证书

  编译.net项目时,出现无法找到清单签名证书的状况,用方法3解决了.用方法1和2只能顺利编译,但不能发布.   最直接有效的方法是1,2和1效果一样只不过是处理的步骤多几步: 1.工程->属性->签名->为ClickOnce清单签名   2.用记事本打开对应csproj文件.将 <SignManifests>true</SignManifests>改为 <SignManifests>false</SignManifests>.