K8S的核心功能:
1、 服务发现和负载均衡
2、 容器排编和调度
3、 故障自动处理
4、 批量执行job任务
5、 水平伸缩,弹性扩展
6、 自动发布、应用回滚、持续交付
举例说明:
1、 调度: Kubernetes 可以把用户提交的容器放到 Kubernetes 管理的集群的某一台节点上去。Kubernetes
的调度器是执行这项能力的组件,它会观察正在被调度的这个容器的大小、规格。 比如说它所需要的 CPU以及它所需要的
memory,然后在集群中找一台相对比较空闲的机器来进行一次
placement,也就是一次放置的操作。在这个例子中,它可能会把红颜色的这个容器放置到第二个空闲的机器上,来完成一次调度的工作。
2、 自动修复: Kubernetes
有一个节点健康检查的功能,它会监测这个集群中所有的宿主机,当宿主机本身出现故障,或者软件出现故障的时候,这个节点健康检查会自动对它进行发现。
3、 水平伸缩: Kubernetes 有业务负载检查的能力,它会监测业务上所承担的负载,如果这个业务本身的 CPU
利用率过高,或者响应时间过长,它可以对这个业务进行一次扩容。
K8S的架构
K8S是一个典型的二层架构,K8S是一个server-client架构模式,master是一个中央的管控节点,而work节点作为工作节点,master节点主要用于接受来自user、ui的指令,并下发到相应的节点,相应的节点再进行处理和执行。
Kubernetes 的 Master 包含四个主要的组件:API Server、Controller、Scheduler 以及 etcd。如下图所示:
1、 API Server:api server 主要用于处理api操作,通过上图我们知道k8s的所有的组件都会和api server进行连接,而组件之间都是通过api server来进行消息的传递,这是一个高内聚的设计。
2、 Controller:控制器用于实现对容器的管理。主要用于实现对容器的性能的扩展和错误恢复。
3、 Scheduler:调度器主要实现对容器资源的调度,实现了cgroups的功能,对容器的资源进行分配和扩展。调度器和控制器也是通过api server 进行联系的。;
4、 etcd:是一个分布式的一个存储系统,api server所有的信息都存放在etcd中,etcd有K8S集群中的重要数据信息,容器的部署信息都将会在etcd中留存,因此etcd的高可用是保障集群的可用性的关键。
Kubernetes中的Node
Node是在K8S架构中的工作节点,它实现了业务的负载。每一个业务在K8S中都称之为POD,POD是K8S管理的基本单位,POD中可能运行了一个或者多个容器,而Kubelet组件来负责运行这些pod,在我们的实战过程中,如果kubelet无法运行,那么我们是没有办法通过kubeadm来运行pod的。
而pod本身是一个独立的文件系统、进程资源独立,视图上就是一台独立资源的虚拟机器,因此,我们需要通过网络插件来实现网络资源功能。
而Kube-proxy组件实现了服务的网络组件,通过这个组件我们能够实现我们的应用能够提供内网和外网的访问。
Kubernetes中的Volume
Volume是卷的概念,也就是我们通过chroot独立出了一个容器的文件系统资源,而volume就是对这个独立的文件系统资源的抽象,而我们宿主机的文件系统资源中开辟一个独立文件存储系统,用这种抽象的卷的概念来表述,那么我们在我们的容器中,能够直接以挂载的方式使用这个共享的文件资源。
而这种Volume本身由于是文件系统的抽象,这也可以是一个NFS的文件系统或者是Samba的文件系统,或者google云盘、AWS云盘等网络存储基础设施。
Kubernetes中的deployment
Deployment是一个基于POD抽象的抽象,它类比于namespace技术是基于操作系统对进程的抽象的抽象,deployment主要的目的还是对POD的资源进行进一步的管理和资源分配,类似于Namespace方式来分割POD类型。它也可以定义POD的副本数量和POD版本,继承了k8S的基本功能来使用Deplyment管理POD。
而通过Controller组件,我们通过Deployment中POD的数量来判断是否有Pod组件出现故障,那么如果我们检测到了POD组件的问题,那么我们的Controller会帮助deployment中的pod进行故障的恢复和处理。
Kubernetes中的Service
一个Deployment中可能有两个甚至更多个完全相同的Pod。那么就需要我们来设置这个deployment的对应的服务,服务如果是对内的那么我们无需进行VIP的设置,如果是对外的那么我们需要以Node的形式对外设置VIP来提供网络服务。
这类似于NAT网络地址转换,在我们的宿主机上开通一个端口来实现外部对内POD的访问。
Kubernetes的Namespace
Namespace类似于os中对进程资源的隔离,在集群内布,namespace主要实现集群内布的逻辑隔离和资源管理。
Kubernetes的API
API采用HTTP+JSON的形式来实现。
我们采用kubectl对kubernetes进行管理时,就是使用http访问的方式发送请求,而返回的结果则通过json方式返回。