Ceph在Kubernetes中的一些应用

很抱歉,前两周我还在说没发现Kubernetes有扩展API来对接Ceph创建RBD卷,这两天翻阅文档才看到原来Kubernetes已经在1.2的Alpha中支持了,在1.4中就release这个特性。

StoragaClass

StoragaClass,从表面上看像是在Kubernetes资源中定义了一个存储的方法。官方wiki介绍如下:

Each StorageClass contains the fields provisioner and parameters, which are used when a PersistentVolume belonging to the class needs to be dynamically provisioned.The name of a StorageClass object is significant, and is how users can request a particular class. Administrators set the name and other parameters of a class when first creating StorageClass objects, and the objects cannot be updated once they are created.Administrators can specify a default StorageClass just for PVCs that don’t request any particular class to bind to: see the PersistentVolumeClaim section for details.

简单来说,每个StorageClass包括provisionerparameters两个资源,当PV需要绑定动态卷的时候便会用到。

那么什么是provisionerparameters?

Provisioner

Storage classes have a provisioner that determines what volume plugin is used for provisioning PVs. This field must be specified. During beta, the available provisioner types are kubernetes.io/aws-ebs and kubernetes.io/gce-pd.

Storage Classes中的provisioner字段决定着部署PV的插件。

Parameters

Storage classes have parameters that describe volumes belonging to the storage class. Different parameters may be accepted depending on the provisioner. For example, the value io1, for the parameter type, and the parameter iopsPerGB are specific to EBS. When a parameter is omitted, some default is used.

Storage Classes 的parameter字段用来描述属于该storage class的volume。不同的provisioner其参数也不同。简单来说就是存储的配置信息。

目前StorageClass也封装好了几类存储的实现方法;

  • AWS
  • GCE
  • Glusterfs
  • OpenStack Cinder
  • vSphere
  • Ceph RBD
  • Quobyte
  • Azure Disk

本文着重引用Ceph RBD的方式来做实例,环境还是写前两片文章用到的那个Ceph测试环境

Ceph RBD

  apiVersion: storage.k8s.io/v1beta1
  kind: StorageClass
  metadata:
    name: ceph-chengdu
  provisioner: kubernetes.io/rbd
  parameters:
    monitors: 192.168.68.53:6789,192.168.68.54:6789,192.168.68.57:6789
    adminId: kube
    adminSecretName: ceph-secret
    adminSecretNamespace: kube-system
    pool: kube
    userId: kube
    userSecretName: ceph-secret

关于Ceph的Secret可以参看以前的文章,将Ceph的keyring导入进去就好了。简单介绍下storageclass里字段的含义

  • monitors: Ceph Monitor的地址,可以用都好分割
  • adminId: Ceph客户端用于创建块设备的用户;
  • adminSecretNamespace:admin的namespaces
  • adminSecret:admin的SecretID
  • pool: RBD的pool存储池
  • userId: 用于块设备映射的用户ID,默认可以和admin一致
  • userSecretName: Ceph-Secret的ID

创建PVC

在导入StoragaClass后,就可以在创建PVC里面引用这个方法了。

 {
  "kind": "PersistentVolumeClaim",
  "apiVersion": "v1",
  "metadata": {
    "name": "magine1989",
    "annotations": {
        "volume.beta.kubernetes.io/storage-class": "ceph-chengdu"
    }
  },
  "spec": {
    "accessModes": [
      "ReadWriteOnce"
    ],
    "resources": {
      "requests": {
        "storage": "10Gi"
      }
    }
  }
}

我这里定义了一个名叫magine1989的RBD块,其容量为10G。简单看下PVC和Ceph的状态。

$ kubectl get pvc
NAME                 STATUS    VOLUME                                     CAPACITY   ACCESSMODES   AGE
magine1989           Bound     pvc-0023420f-103d-11e7-9489-52540095b1e1   10Gi       RWO           3h

$ kubectl get pv
NAME                                       CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS    CLAIM                        REASON    AGE
pvc-0023420f-103d-11e7-9489-52540095b1e1   10Gi       RWO           Delete          Bound     default/magine1989                     4h

$ rbd ls kube --name client.kube
kubernetes-dynamic-pvc-eca2e400-103c-11e7-b8c8-52540095b1e1

$ rbd info kube/kubernetes-dynamic-pvc-eca2e400-103c-11e7-b8c8-52540095b1e1 --name client.kube
rbd image 'kubernetes-dynamic-pvc-eca2e400-103c-11e7-b8c8-52540095b1e1':
    size 10240 MB in 2560 objects
    order 22 (4096 kB objects)
    block_name_prefix: rb.0.c3b7.2ae8944a
    format: 1

可以看到在创建pvc的时候,k8s已经帮我们在Ceph的存储池里面创建一个10G的RBD块,然后创建好PV后绑定上该PVC。这样一来用户在申请PVC的时候就更方便了,不必像以前还需要系统管理员在底层手动创建好PV在通知用户创建PVC。

StatefulSet

StatefulSet在1.5版本以前叫PetSet,除了名字改了,API对象并没有太多变化。对于将现有老的,有状态的,需要容器化的项目,StatefulSet提供非常有效的支持。
我们知道,Deploymentreplicasets类型可以非常快速的创建Pod副本,但是前提是这些都是无状态的应用,这对于一些有状态的应用就非常尴尬了。
目前采用StatefulSet类型的容器结合一些共享存储的方案,可以解决一些这类有状态的应用在业务pod出现漂移,业务pod扩容引发的问题。

那么采用StatefulSe的应用场景如下:

  • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
  • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
  • 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
  • 有序收缩,有序删除(即从N-1到0)
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 3
  volumeClaimTemplates:
  - metadata:
      name: test 
      annotations:
        volume.beta.kubernetes.io/storage-class: ceph-chengdu
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 5Gi 
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: magine1989
        image: nginx:1.11.10
        volumeMounts:
        - mountPath: "/mnt/rbd"
          name: test
      nodeSelector:
        ceph: up

这里介绍下volumeClaimTemplates,这个主要在容器在使用volumes时候,动态创建和映射容器和PVC的关系。我这里结合StorageClass就可以实现每个应用副本对应一个Volumes。

$ kubectl get pod
NAME                    READY     STATUS    RESTARTS   AGE
web-0                   1/1       Running   0          3h
web-1                   1/1       Running   0          3h
web-2                   1/1       Running   0          3h

$ kubectl get pvc
NAME                 STATUS    VOLUME                                     CAPACITY   ACCESSMODES   AGE
test-web-0           Bound     pvc-a202a0dc-1042-11e7-9489-52540095b1e1   5Gi        RWO           3h
test-web-1           Bound     pvc-a2052fad-1042-11e7-9489-52540095b1e1   5Gi        RWO           3h
test-web-2           Bound     pvc-a2070608-1042-11e7-9489-52540095b1e1   5Gi        RWO           3h

$ kubectl get pod web-0  -o yaml
.....
  volumes:
  - name: test
    persistentVolumeClaim:
      claimName: test-web-0
  .....

这里看到POD和PVC的关系是有序的对应上的。

扩展和收缩

前面说道,对于有状态的应用扩容需要结合initcontainer来实现容器运行前的操作。inicontainer我放在后面几期文章里介绍。
这里的扩容只为证明StatefulSet在部署和收缩的时候是有序进行的。

扩展

#将刚刚的3个副本扩容至5个
$ kubectl scale statefulset web --replicas=5

#这个时候观察pod调度状态
$ kubectl get pod
web-0                   1/1       Running             0          3h
web-1                   1/1       Running             0          3h
web-2                   1/1       Running             0          3h
web-3                   0/1       ContainerCreating   0          4s

$ kubectl get pod
web-0                   1/1       Running             0          3h
web-1                   1/1       Running             0          3h
web-2                   1/1       Running             0          3h
web-3                   1/1       Running             0          10s
web-4                   0/1       ContainerCreating   0          0s

$ kubectl get pod
web-0                   1/1       Running   0          3h
web-1                   1/1       Running   0          3h
web-2                   1/1       Running   0          3h
web-3                   1/1       Running   0          35s
web-4                   1/1       Running   0          25s

收缩

#将刚刚的5个副本扩容至2个
$ kubectl scale statefulset web --replicas=2

#只保留了最初的2个POD
$ kubectl get pod
NAME                    READY     STATUS    RESTARTS   AGE
web-0                   1/1       Running   0          3h
web-1                   1/1       Running   0          3h

#PVC保留没有删除
$ kubectl get pvc
NAME                 STATUS    VOLUME                                     CAPACITY   ACCESSMODES   AGE
test-web-0           Bound     pvc-a202a0dc-1042-11e7-9489-52540095b1e1   5Gi        RWO           4h
test-web-1           Bound     pvc-a2052fad-1042-11e7-9489-52540095b1e1   5Gi        RWO           4h
test-web-2           Bound     pvc-a2070608-1042-11e7-9489-52540095b1e1   5Gi        RWO           4h
test-web-3           Bound     pvc-294b1fa7-1064-11e7-9489-52540095b1e1   5Gi        RWO           7m
test-web-4           Bound     pvc-294def6e-1064-11e7-9489-52540095b1e1   5Gi        RWO           7m

这里发现删除StatefulSet时不会删除PVC

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • kubernetes 简介 一个迅速过一遍kubernetes 非常不错的资源:基于Kubernetes构建Doc...
    bradyjoestar阅读 15,277评论 2 7
  • Kubernetes PV & pvc 介绍 PersistentVolume(pv)和PersistentVol...
    YichenWong阅读 39,213评论 10 10
  • 原因:2017年4月14日 星期五 学习记录。说明:整理ceph资料。我的博客 : http://minichao...
    nicocoi阅读 8,181评论 1 9
  • 是心的不自在,飘荡乎 是情的太慷慨,茫然乎 是舍去是离分,让一份感情这样无措。 归来吧 归来吧 归来吧 当我发觉你...
    北城外的春暖花开阅读 385评论 1 0
  • 每次在伤心绝望的时候,总是容易陷入极端的思想状态 每个人我想都会在某个时间段陷入一种不顺利,不顺心的状态之中,所以...
    Me_sunshine阅读 144评论 0 0