Kubernetes学习笔记
简介
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。
核心特点:自主管理容器
所有容器均在Pod中运行,一个Pod可以承载一个或者多个相关的容器。
当容器创建失败时,容器会被node agent:kubelet自动重启。
Kubernetes提供服务的抽象,提供固定的IP地址和DNS名称,与一系列Pod进行动态关联,当一个Pod容器访问该地址的时候,会转发到本地代理,每台机器上均有一个本地代理,Kube Proxy时刻追踪Pod的动态变化。
设计架构:
Kubernetes Master:
1.Api Server:提供资源操作唯一入口,提供认证、授权、访问控制,Api注册和发现等机制。
2.scheduler:负责资源的调度,按照预定的策略讲Pod调度到对应的机器上。
3.Controller manager:负责维护集群的状态,如故障检测,自动扩展,滚动更新等。
4.etcd:保存了整个集群的状态。
Kubernetes Node:
1.Kubelet:负责维护容器的生命周期。
2.Kube-Proxy:负责为Service提供cluster内部的服务发现和负载均衡。
Kubernetes的设计理念
API设计原则
1.所有API应是声明式的,声明式操作更易于被用户使用,可以使系统向用户隐藏实现的细节,同时保留了系统未来持续优化的可能性。
2.API对象是彼此互补且可组合的,高内聚,低耦合。
3.高层API以操作意图为基础设计,高层设计一定是从业务出发,因此,针对k8s的高层API设计,一定是以k8s的业务为基础出发,也就是以系统调度管理容器的操作意图出发。
4.底层API根据高层API的控制需要设计,实现底层API的目的是为了被高层API使用,也要以需求为基础。
5.尽量避免简单封装,不要有在外部API无法显式知道的内部隐藏机制,内部隐藏机制非常不利于系统维护。
6.API操作复杂度与对象数量成正比,从系统性能角度考虑,要保证整个系统随着系统规模的扩大,性能不会迅速变慢到无法使用。
7.API对象状态不能依赖于网络连接状态,要保证API对象状态能应对网络状态的不稳定。
8.尽量避免让操作机制依赖于全局状态,因为在分布式系统中要实现全局状态的同步是非常困难的。
每个API对象有三大类属性:元数据metadata,规范spec,状态status
每个对象至少有3个元数据:namespace,name,uid,此外还有各种各样的标签labels来匹配不同的对象。
Pod
Pod是在k8s集群当中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。
复制控制器(Replication Controller,RS)
监控运行中的Pod来保证集群中运行指定数目的Pod副本。
副本集(Replica Set,RS)
RS是新一代RC,同样提供高可用能力,区别在于RS能支持更多种类的匹配模式,副本集对象一般不单独使用,而是作为Deployment的理想状态使用。
部署
部署表示用户对集群的一次更新操作,包括创建、更新、删除、滚动升级等。
服务(Service)
在K8s集群中,客户端需要访问的服务就是Service对象,每个Service对象会对应一个集群有效的虚拟ip,集群内部通过虚拟ip访问服务。在K8s集群中微服务的负载均衡是通过kube-proxy来完成的,是一个分布式代理服务器。
任务(Job)
Job是K8s用来控制批处理型任务的API对象。
后台支撑服务集(DaemonSet)
后台支撑型服务的核心关注点在K8s集群中的节点(物理机或虚拟机),要保证每个节点上都有一个此类Pod运行。
有状态服务集(PetSet)
对于RC和RS中的Pod,一般不挂载存储或者挂载共享存储,保存的是所有Pod共享的状态,对于PetSet中的Pod,每个Pod挂载自己独立的存储,如果一个Pod出现故障,从其他节点启动一个同样名字的Pod,要挂载上原来Pod的存储继续以它的状态提供服务。
节点(Node)
K8s集群中的Node也就等同于Mesos集群中的Slave节点,是所有Pod运行所在的工作主机,可以是物理机也可以是虚拟机。不论是物理机还是虚拟机,工作主机的统一特征是上面要运行kubelet管理节点上运行的容器。
名字空间(Namespace)
名字空间为K8s集群提供虚拟的隔离作用,K8s集群初始有两个名字空间,分别是默认名字空间default和系统名字空间kube-system,除此以外,管理员可以可以创建新的名字空间满足需要。
K8s系统最核心的两个设计理念:一个是容错性,一个是易扩展性。容错性实际是保证K8s系统稳定性和安全性的基础,易扩展性是保证K8s对变更友好,可以快速迭代增加新功能的基础。