在了解Kubernetes应用状态部署前,咱们先看看Kubernetes的高级架构,方便更好的理解Kubernetes的状态。数据库
Kubernetes 的高级架构服务器
包括应用程序部署模型,服务发现和负载均衡,内部/外部路由分离、persistentvolume 的使用,部署节点守护程序,部署有状态分布式系统,做业后台运行,部署数据库,配置管理,凭证管理,滚动更新,自动缩放和包管理。网络
A、Kubernetes的基本设计策略之一就是,无需更改应用程序代码,就能部署在虚拟机上运行的现有应用程序。另外,任何运行在虚拟机上的应用程序均可以经过容器化组件在 Kubernetes 上实现部署。这是经过容器分组、容器编排、覆盖网络、基于第 4 层虚拟IP、服务发现、支持守护程序运行、部署有状态应用程序组件、以及扩展容器编排系统这些核心功能实现的。架构
B、Kubernetes 能够提供一组可动态扩展的主机,能够应用容器运行 workload,并使用一组称为 master 的管理主机来提供管理整个容器基础架构的 API。这些 workload 包括长期运行服务,批处理做业和容器主机的守护程序。为了提供容器到容器的路由,全部容器主机都用覆盖网络链接在一块儿。部署在 Kubernetes 上的应用程序在集群网络中是动态可见的,并可经过传统负载均衡器向外部网络暴露。集群管理器的状态存储在一个高度分布的 key/value 存储(etcd)中,该存储在 master上运行。负载均衡
Kubernetes应用状态部署分布式
在K8s运行的服务,分为无状态服务和有状态服务,下面分别看看K8s是如何运行这两类不一样的服务的微服务
01大数据
“无状态”服务插件
无状态服务,即 Web 服务器、代理和应用程序代码这样的应用程序,它们能够处理数据但不进行存储。编排过程当中,开发者比较喜欢使用它们,由于它们易于部署且易于扩展。若是流量上升,则只需添加更多的负载平衡。更重要的是,它们是“不变更的”;上游容器镜像和基础架构中正在运行的容器其实几乎没有区别。这意味着它们能够随时被替代,并且容器实例切换过程当中几乎不须要耗费“切换成本”。设计
无状态服务,K8s使用Replicaset来保证一个服务的实例数量,若是说某个Pod实例因为某个缘由被crash了,RC会当即用一个Pod的模板新启一个Pod来替代它,因为是无状态的服务,新启的Pod与原来健康状态下的Pod是如出一辙。当Pod被重建后它的IP地址可能发生变化,为了对外提供一个稳定的访问接口,K8s引入了Service的概念,一个Service后面能够挂多个Pod,实现服务的高可用。
在Kubernetes中,Deployment和Replicasets都是运用无状态服务的有效手段。
02
“有状态”服务
有状态的服务,即路由器、CDN(内容传送网络)、streaming 服务器和认证服务器。从部署开始,这些容器就开始与上游镜像不一样了,时间越长它们的差别越大。这种差别就被称为“state(状态)”。事实上,每一个运行的应用程序都至少有一个小状态(差别),但对于“无状态”应用程序来讲,状态(差别)很小,并且能够进行快速替换。
普通有状态服务,和无状态服务相比,它多了状态保存的需求,K8s提供了以Volmume和Peristent Volmume为基础的存储系统,能够实现服务的状态保存。
而在容器化应用程序最困难的任务之一,就是设计有状态分布式组件的部署体系结构。因为无状态组件可能没有预约义的启动顺序、集群要求、点对点 TCP 链接、惟一的网络标识符、正常的启动和终止要求等,所以能够很容易地进行容器化。诸如数据库,大数据分析系统,分布式 key/value 存储和 message brokers 可能有复杂的分布式体系结构,均可能用到上述功能。
Kubernetes 引入了 StatefulSets 资源来支持这种复杂的需求,用来管理POD部署和扩容,并为这些pod提供顺序和惟一性的保证。
03
StatefulSet部署—有状态应用
用于解决各个pod实例独立生命周期管理,提供各个实例的启动顺序和惟一性。
使用StatefulSet的前提是:
一、Kubernetes集群的版本≥1.5;
二、安装好DNS集群插件,版本≥15。
StatefulSet为何适合有状态的程序,看看它的特性:
A、稳定,惟一的网络标识符。能够发现集群内部的其余成员。
B、稳定的持久化存储。经过Kubernetes的PV/PVC或者外部存储(预先提供)来实现。
C、启动或关闭时有序。有序的,优雅的部署和扩展。有序,优雅的删除和终止。有序的自动滚动更新。实现部署和扩容保证。
04
运用StatefulSet会带来什么好处呢?
部署和扩容的保证
对于带有N个副本集的StatefulSet,当pod被部署,它们将按0到N-1的顺序被建立。
当一Pod被删除时,它们将按照N-1到0的顺序被终止。
在进行Pod扩容前,全部依赖的Pod应该都已在运行和准备好。
在Pod被终止前,全部的依赖它的Pod都必须彻底中止。
若是你的系统是微服务构成的生态系统,就会比较繁琐的交付新服务,若是更近一步,服务是有状态的,那么kubernetes的自动化和健壮性特性会对你有很大的帮助,StatefulSet的目的就是给众多的有状态负载提供正确的控制器支持。