Kubernetes是一个工业级的容器编排平台。
Kubernetes核心功能
- 服务发现和负载均衡。
- 容器的自动装箱,调度(scheduling),按照容器的规格(需要的cpu和内存等)确定一个容器存放到集群中的哪一个机器上。
- 进行自动化的容器恢复,在集群中,因为宿主机出现问题导致容器不可用,k8s会自动对不可用的容器进行恢复。
- 应用的自动发布与应用的回滚,以及与应用相关的配置密文的管理。
- 对job类任务做批量的执行。
- 为了让这个集群,这个应用更富有弹性,Kubernetes 也支持水平的伸缩。
Kubernetes架构
Kubernetes架构是一个比较典型的二层架构和server-client架构 。Master作为中央管控节点,会与Node进行连接。UI和cli只和Master进行连接下发想要执行的命令和希望的状态,然后Master会把这些命令或状态下发给相应的节点,进行最终的执行。
Master
Master包含4个主要的组件:API Server、Controller、Scheduler以及etcd。
- API Server:顾名思义是用来处理 API 操作的,Kubernetes 中所有的组件都会和 API Server 进行连接,组件与组件之间一般不进行独立的连接,都依赖于API Server进行消息的传送;
- Controller:是控制器,它用来完成对集群状态的一些管理。比如对容器进行修复和水平扩张,是由Kubernetes中的Controller来进行完成;
- Scheduler:是调度器,完成调度的操作, 负责把一个用户提交的 Container,依据它对CPU、对memory请求大小,找一台合适的节点,进行放置;
- etcd:是一个分布式的一个存储系统,API Server 中所需要的这些原信息都被放置在etcd中,etcd 本身是一个高可用系统,通过 etcd保证整个Kubernetes的Master组件的高可用性。
Node
Node是真正运行业务负载的,每个业务负载会以Pod的形式运行,一个Pod中运行一个或多个容器。Node不会直接和user进行交互,只会通过Master进行交互。
- Kubelet:运行node中Pod的组件,它通过 API Server 接收到所需要 Pod 运行的状态。
- Container Runtime:配置容器和容器的运行环境
- Storage Plugin:负责配置存储
- Network Plugin:负责网络
- Kube-proxy:进行service组网
部署一个Pod的流程:
- 用户可通过UI或CLI提交一个Pod给Kubernetes进行部署,首先Pod会被CLI或UI提交给Kubernetes API Server。
- API Server会把这个信息写入到存储系统etcd中。
- 之后Scheduler会通过API Server的watch或者叫做notification机制得到这个信息:有一个Pod需要被调度。
- 这个时候Scheduler会根据它的内存状态进行一次调度决策,在完成这次调度之后,它会向 API Server report 说:“OK!这个Pod需要被调度到某一个节点上。”
- API Server接收到这次操作之后,会把这次的结果再次写到etcd 中,然后API Server会通知相应的节点进行这次Pod真正的执行启动。
- 相应节点的kubelet会得到这个通知,kubelet就会去调Container runtime来真正去启动配置这个容器和这个容器的运行环境,去调度Storage Plugin来去配置存储,network Plugin去配置网络。
Kubernetes的核心概念和API
- Pod 是 Kubernetes的一个最小调度以及资源单元。Pod简单来说是对一组容器的抽象,它里面会包含一个或多个容器。Pod中的多个容器共享运行环境和网络环境,Pod与Pod之间,是互相隔离的。
- Volume是声明在Pod中的容器可访问的文件目录,可以被挂载在Pod中的一个或者多个容器的指定路径下。支持本地存储、分布式存储、云存储等多种后端存储的抽象。
- Deployment定义一组Pod的副本数目、版本等。通过控制器自动恢复失败的Pod来维持Pod的数目,通过控制器指定的策略控制版本。
- Service提供访问一个或多个Pod实例的稳定访问地址,支持多种访问方式实现,包括Cluster IP、nodePort、 LoadBalancer等。
- Namespace是用来做一个集群内部的逻辑隔离的,它包括鉴权、资源管理等。
- Kubernetes API是由HTTP+JSON组成