蜂巢(现已更名为网易云计算基础服务)上线的微服务有两大类,有状态和无状态,两者有很大区别,除了有状态服务可以挂盘、带公网这种比较表面的区别以外,其实它们在底层调用k8s的实现上也有很大区别。这里列出两个不同类型的服务的结构简图。
有状态服务:
无状态服务:
可以看出来pod无论在无状态服务和有状态服务都是一个核心概念。而在服务创建过程中pod的运行状态至关重要。跟服务的可用性息息相关。下面就简单分析一下pod的生命周期以及可能出现的状态。
需要注意的是pod的生命周期和container的生命周期有一定的联系,但是不能完全混淆一致。pod状态相对来说要简单一些。这里首先列出pod的状态
3、Terminated:终止状态。 如果没有任何异常的情况下,container应该会从Waiting状态变为Running状态,这时容器可用。
但如果长时间处于Waiting状态,container会有一个字段reason表明它所处的状态和原因,如果这个原因很容易能标识这个容器再也无法启动起来时,例如ContainerCannotRun,整个服务启动就会迅速返回。(这里是一个失败状态返回的特性,不详细阐述)
当一个容器已经运行起来以后,pod和container的状态是如何关联起来的呢,下面给一些举例来更加形象化其中的关系。
需要注意的是这里都是基于重启策略是always的方式。而kubernate本身实际上是支持多种重启策略的。包括Onfailue,Never这其他两种,分别代表只有错误退出的时候才拉起,以及从不拉起的策略。其他两种策略下continer退出的话pod的状态会略有不同。由于我们微服务没有采用其他两种策略,因此不在此阐述。
pod和container的状态让我们对微服务底层的对象和状态有了更加深入的认识,并且有利于帮助定位问题。
本文来自网易实践者社区,经作者崔晓晴授权发布。