加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 酷站推荐 > 酷站 > 正文

利用Kubernetes实现容器的持久化存储

发布时间:2019-02-20 19:29:41 所属栏目:酷站 来源:谢涛
导读:【技术】可以说,容器化彻底改变了我们对应用程序开发的思考方式,它带来很多好处:开发和生产之间的一致环境、使用共享的资源但容器之间相互隔离、云环境之间的可移植性、快速部署……等等不胜枚举。容器所固有的短暂性是它之所以伟大的核心原因:不可变的

  这是因为存储“供应”和存储“消费”之间存在明显的分离。与静态创建的存储类相比,使用存储类创建的持久卷的消耗有一些巨大的优势,最大的优点之一是能够操作仅在资源创建时可用的存储资源值。这意味着我们可以准确地提供用户请求的存储量,而无需集群管理员进行任何手动干预。由于存储类需要由集群管理员提前定义,因此它们仍然会控制哪些类型的存储对最终用户可用,同时抽象出所有供应逻辑。

  存储类和持久卷声明的要点:

  *存储类和持久卷声明允许最终用户使用存储资源的动态供应,从而消除集群管理员所需的任何手动干预。

  *存储类抽象了存储供应的细节,而依赖于指定的供应程序来处理供应逻辑。

  应用程序状态

  当我们考虑状态时,持久存储是至关重要的。我的数据在哪里?当我的应用程序故障时,它是如何做到持久化的?而某些应用程序本身也需要状态管理,不仅仅是持久化数据。这在利用多个不可互换Pod的应用程序中最容易看到(例如,主数据库Pod及其某些分布式应用程序如Zookeeper或Elasticsearch的副本)。诸如此类的应用程序要求能够在任何重新调度期间为每个Pod hat分配惟一标识符。Kubernetes通过使用StatefulSet提供了这种功能。

  Kubernetes StatefulSets

  Kubernetes StatefulSet提供类似于ReplicaSets 和Deployments的功能,但是具有稳定的重新调度。对于需要稳定标识符和有序部署、伸缩和删除的应用程序来说,这种差异非常重要。StatefulSet有几种不同的特性,可以帮助提供这些必要的功能。

  惟一网络标识符——StatefulSet中的每个Pod都从StatefulSet的名称和Pod的序号派生其主机名。这个Pod的标识是粘滞的,不管这个Pod被调度到哪个节点,也不管它被重新调度了多少次。这种功能对于会形成不可互换的Pod逻辑“组”的应用程序特别有用,这类应用程序典型例子是分布式系统中的数据库副本和代理。识别单个Pod的能力是StatefulSet的优势的核心。

  有序的部署、伸缩和删除——StatefulSet中的Pod标识符不仅是惟一的,而且是有序的。StatefulSet中的Pod是按顺序创建的,在转移到下一个Pod之前,等待中的上一个Pod处于健康状态。这种行为也扩展到了Pod的伸缩和删除,在Pod的所有前身都处于健康状态之前,任何Pod都不能进行更新或扩展。类似地,在Pod终止之前,必须关闭所有后续的Pod。这些功能允许对StatefulSet进行稳定的、可预测的更改。

  下面是StatefulSet定义的一个示例:

  apiVersion: v1

  kind: StatefulSet

  metadata:

        name: web

  spec:

        selector:

              matchLabels:

                    app: nginx # has to match .spec.template.metadata.labels

        replicas: 3

        template:

              metadata:

                    labels:

                          app: nginx # has to match .spec.selector.matchLabels

              spec:

              terminationGracePeriodSeconds: 10

              containers:

              — name: nginx

                    image: nginx

                    ports:

                    — containerPort: 80

                          name: web

                    volumeMounts:

                    — name: www

                          mountPath: /usr/share/nginx/html

        volumeClaimTemplates:

              — metadata:

                    name: www

              spec:

                    storageClassName: mysc

                    resources:

                          requests:

                                storage: 1Gi

  如上所示,StatefulSet的名称在metada下的name中指定,在创建封闭的Pod时将使用该名称。这个StatefulSets定义将产生名为web-0、web-1和web-2的三个Pod。

  这个特定的StatefulSet通过spec下的volumeClaimTemplates字段利用Pvc,以便将持久卷附加到每个Pod。

  StatefulSet的关键要点:

  * StatefulSet将其封闭的pod命名为唯一的,允许存在需要不可互换pod的应用程序

  *以有序的方式处理StatefulSet的部署、扩展和删除

  虽然StatefulSet提供了部署和管理不可互换Pod的能力,但仍然存在一个问题:我如何找到和使用它们。这就是Headless Service发挥作用的地方。

  Kubernetes Headless服务

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读