1. API设计原则
系统的api设计是一个系统的灵魂,整个复杂的系统都会隐藏在api下面,也都会随着api的变化而变化,如果api设计的不好,底层系统就不可能做的好
K8s所有的api都是声明式的
如,要pod扩容为2个实例,只需要将replicaset指定为2就可以了
从概念上来说声明式,是对于重复的操作是稳定的,所有的api对象都是名词,而不是动词
如,service/pod,以用户期望的样子,系统会很容易确定用户期望的是什么,应该是什么样子,以及当前系统的样子是不是满足了用户的需求,这就避免了为了明确用户的目的而引起不必要的麻烦
还有,所有的Api以操作的意图为基础的设计
上层设计一定是以业务出发的,而不是以技术实现出发的
Kubernetes的api是以业务基础出发,以系统调度管理容器的意图作为基础来设计的
2. 控制机设计原则
程序内部的一些实现的通用的原则
一个是假定任何错误的可能,并做容错处理;在分布式系统中出现局部错误和临时错误是非常大概率的事件,错误可能是来自物理系统的故障/磁盘/网络/外部系统故障,也可能是来自与系统本身代码的问题,因此在设计上要考虑到任何可能的错误,并且做容错处理;
第二个是每个模块都可以在出现错误后自动恢复;由于分布式系统中无法保证每个模块都是始终连接的,因此任何模块都要有自我修复的能力,保证不会因为无法连接到某一个模块导致的自我崩溃;
还有一个是每个模块在必要的时候可以优雅降级
优雅降级是指要求在设计的过程中要清晰的划分基本功能/高级功能,保证基本功能不会依赖高级功能,这样就同时保证了不会因为高级功能应为出现了故障而导致整个模块的崩溃,也会更容易快速的增加高级功能,而不用担心因为引入高级功能而影响了原有的基本功能;