Kubernetes设计理念与分布式系统

分析和理解Kubernetes的设计理念可以使我们更深入的了解Kubernetes系统,更好的利用它管理分布式部署的云原生应用,另一方面也可以让我们借鉴其在分布式系统设计方面的经验。

API设计原则

对于云计算系统,系统API实际上处于系统设计的统领地位,正如本文前面所说,k8s集群系统每支持一项新功能,引入一项新技术,一定会引入对应的API对象,支持对该功能的管理操作,理解掌握的API,就好比抓住了k8s系统的关键。k8s系统API的设计有以下几条原则:

  • 所有API应该是声明式的。声明式的操作,相对命令式操作,对于重复操作的效果是稳定的,这对于容易出现数据丢失或重复的分布式环境来说是很重要的。另外,声明式操作更容易被用户使用,可以使系统向用户隐藏实现细节,隐藏实现细节的同时也就保留了 系统未来持续优化的可能性。此外,声明式API同时隐含了所有的API对象都是名词性质的,例如Service、Volume这些API名词描述了用户所期望得到的一个目标分布式对象。
  • API对象是彼此互补而且可组合的。这里面实际是鼓励API对象尽量实现面向对象设计时的要求,即“高内聚,松耦合”,对业务相关的概念有一个合适的分解,提高分解出来的对象的可重用性。事实上,k8s这种分布式系统管理平台也是一种业务系统,只不过它的业务就是调度和管理容器服务。
  • 高层API以操作意图为基础设计。如何能够设计好API,跟如何能用面向对象的方法设计好应用系统有想通的地方,高层设计一定从业务出发,而不是过早的从技术实现出发。因此,针对k8s的高层API设计,一定是以k8s的业务为基础出发,也就是提供调度管理容器的操作意图为设计基础的。
  • 底层API根据高层API的控制需求设计。设计实现底层API的目的是为了被高层API使用,考虑减少冗余、提高重用性的目的,底层API的设计也要以需求为基础,要尽量抵抗受技术实现影响的诱惑。
  • 尽量避免简单封装、不要在外部API无法显示知道的内部隐藏的机制。简单的封装,实际没有提供新功能,反而增加了对所封装的API的依赖性。内部隐藏的机制也是非常不利于系统维护的设计方式,例如PetSet和ReplicaSet,本来就是两种Pod集合,那么K8s就用不同的API对象来定义他们,而不会说只用一个ReplicaSet,内部通过特殊的算法再来区分这个ReplicaSet是有状态还是无状态的。
  • API操作复杂度与对象数量成正比。这一条主要是从系统的性能角度考虑,要保证整个系统随着系统规模的扩大,性能不会迅速变慢到无法使用,那么最低的限定就是API的操作复杂度不能超过O(N),N是对象数量,否则系统就不具备水平伸缩性了。
  • API对象状态不能依赖于网络连接状态。由于众所周知,在分布式环境下,网络连接断开是经常发生的事情,因此要保证API对象状态能应对网络的不稳定,PAI对象的状态就不能依赖于网络连接状态。
  • 尽量避免让操作机制依赖于全局状态,因为分布式系统中药保证全局状态的同步是非常困难的。

控制机制设计原则

Kubernetes的核心技术概念和API对象

Pod

复制控制器(Replication Controller,RC)

副本集(ReplicaSet,RS)

部署(Deployment)

服务(Service)

任务(Job)

后台支撑服务集(DaemonSet)

有状态服务集(PetSet)

集群联邦(Federation)

存储卷(Volume)

持久存储卷(Persistent Volume,PV)和持久存储卷声明(Persistent Volume Claim,PVC)

节点(Node)

秘钥对象(Secret)

用户账户(User Account)和服务账户(Service Account)

命名空间(Namespace)

RBAC访问授权

Kubernetes-设计理念(三)的更多相关文章

  1. Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress(转发)

    原文 http://cloud.51cto.com/art/201804/570386.htm Kubernetes的三种外部访问方式:NodePort.LoadBalancer和Ingress 最近 ...

  2. 一个简单的例子理解Kubernetes的三种IP地址类型

    很多Kubernetes的初学者对Kubernetes里面三种不同的IP地址和工作机制理解得不是很清楚. 本文我们通过一个最简单的例子来学习. 用如下命令行创建一个基于nginx的deployment ...

  3. Kubernetes service 三种类型/NodePort端口固定

    Kubernetes service 三种类型 • ClusterIP:默认,分配一个集群内部可以访问的虚拟IP(VIP)• NodePort:在每个Node上分配一个端口作为外部访问入口• Load ...

  4. kubernetes实战(三):k8s v1.11.1 持久化EFK安装

    1.镜像下载 所有节点下载镜像 docker pull kibana: docker tag kibana: docker.elastic.co/kibana/kibana: docker pull ...

  5. Kubernetes系列三:二进制安装Kubernetes环境

    安装环境: # 三个节点信息 192.168.31.11 主机名:env11 角色:部署Master节点/Node节点/ETCD节点 192.168.31.12 主机名:env12 角色:部署Node ...

  6. Kubernetes系列(三) Deployment

    作者: LemonNan 原文地址: https://juejin.im/post/6865672466939150349/ Kubernetes 系列 Kubernetes系列(一) Pod Kub ...

  7. Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress

    NodePort,LoadBalancer和Ingress之间的区别.它们都是将集群外部流量导入到集群内的方式,只是实现方式不同. ClusterIP ClusterIP服务是Kubernetes的默 ...

  8. 【Kubernetes 系列三】Kubernetes 学习文档推荐

    标题 地址 备注 Kubernetes 官方文档 https://kubernetes.io/docs 英文文档,全面 Kubernetes Handbook ttps://jimmysong.io/ ...

  9. Kubernetes的三种探针

    k8s支持存活livenessProbe和就绪readinessProbe两种探针 两种探针都支持以下三种方式 1.exec 通过执行shell命令的方式,判断退出状态码是否是0 示例 exec: c ...

  10. kubernetes 实践三:使用kubeadm安装k8s1.16.0

    环境版本说明: 三台vmware虚拟机,系统版本CentOS7.6. Kubernetes 1.16.0,当前最新版. flannel v0.11 docker 18.09 使用kubeadm可以简单 ...

随机推荐

  1. web开发路径问题解决

     使用监听器解决路径问题 监听器:

  2. win10下安装pytorch,torchvision

    电脑里以前安装了 tensorflow,现在因为学习需要,需要安装pytorch.还是在原来安装tensorflow的位置安装pytorch. 由于采用在线安装太慢了,而且中途还会因为网速不稳定终端! ...

  3. Kubernetes JSONpath Support

    export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=test-nginx,ap ...

  4. day1 python 介绍、基本语法、流程控制

    请查看我的云笔记链接: http://note.youdao.com/noteshare?id=0ea7425d3e3669800cb0d73f7ec8865d&sub=D87B4BF820C ...

  5. 【转】Js中Prototype、__proto__、Constructor、Object、Function关系介绍

    一    Prototype.__proto__与Object.Function关系介绍        Function.Object:Js自带的函数对象.         prototype,每一个 ...

  6. caffe的卷积层的乘积运算的优化

    https://hal.inria.fr/file/index/docid/112631/filename/p1038112283956.pdf caffe的卷积计算的优化来自这篇paper,实际上就 ...

  7. Ubuntu14.04(或Ubuntu16.04)安装openCV并测试python/C++

    网上关于opencv的安装已经有了不少资料,但是没有一篇资料能让我一次性安装成功,因此花费了大量时间去解决各种意外,希望这篇能给一些人带去便利,节省时间. 1.安装OpenCV所需的库 1 sudo ...

  8. JDBC Like 参数化查询

    构造SQL 语句: String sql = "select id,name,age,gender,birth from student where name like ?"; 参 ...

  9. 01_常用 Linux 命令的基本使用

    01. 学习 Linux 终端命令的原因 Linux 刚面世时并没有图形界面,所有的操作全靠命令完成,如 磁盘操作.文件存取.目录操作.进程管理.文件权限 设定等 在职场中,大量的 服务器维护工作 都 ...

  10. 大专生自学web前端前前后后

    先做个自我介绍,我13年考上一所很烂专科民办的学校,学的是生物专业,具体的学校名称我就不说出来献丑了.13年我就辍学了,我在那样的学校,一年学费要1万多,但是根本没有人学习,我实在看不到希望,我就退学 ...