一、Kubernetes介绍
k8s是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了资源调度、部署管理、服务发现、扩容缩容、监控,维护等一整套功能,努力成为跨主机集群的自动部署、扩展以及运行应用程序容器的平台。 它支持一系列容器工具, 包括Docker、Containerd等。
Kubernetes 的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。它的目的就是实现资源管理的自动化,主要提供了如下的功能:
- 自我修复:一旦某一个容器崩溃,能够在1秒左右迅速启动新的容器。
- 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整。
- 服务发现:服务可以通过自动发现的形式找到它所依赖的服务。
- 负载均衡:如果一个服务启动了多个容器,能够自动实现请求的负载均衡。
- 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本。
- 存储编排:可以根据容器自身的需求自动创建存储卷。
服务编排:将一个服务在合适的时间放在一个合适的地方,让其按照规划的方式运行。
二、整体架构
image.png 运行流程.png- API server :对外公开K8s API
- etcd:持久化所有的数据内容
- Scheduler:负责监听新创建的,未指定运行节点(node)的Pods,选择Pod运行节点
- Controller manager管理所有的控制器
- kubelet:每个node上运行的代理,保证容器运行在指定节点中
- Deployment:保证其管理的Pod数量永远符合用户的期望
三、组件
image.png一个 kubernetes 集群主要由
控制节点(master)
、工作节点(node)
构成,每个节点上都会安装不同的组件。
1.控制节点(master):集群的控制平面,负责集群的决策。
对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的 replicas
字段时,启动新的 pod)。
控制平面组件可以在集群中的任何节点上运行。 然而,为了简单起见,设置脚本通常会在同一个计算机上启动所有控制平面组件, 并且不会在此计算机上运行用户容器。
-
API Server:集群操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制。
组件公开了 Kubernetes API。 API 服务器是 Kubernetes 控制面的前端。
Kubernetes API 服务器的主要实现是 kube-apiserver。 kube-apiserver 设计上考虑了水平伸缩,它可通过部署多个实例进行伸缩。 可以运行 kube-apiserver 的多个实例,并在这些实例之间平衡流量。 -
Scheduler:负责集群资源调度,按照预定的调度策略将 Pod 调度到相应的 node 节点上。
负责监视新创建的、未指定运行节点(node)的 Pods,选择节点让 Pod 在上面运行。
调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。 -
ControllerManager:负责维护集群的状态,比如程序部署安排、故障检测、自动扩展和滚动更新等。
-
Etcd:负责存储集群中各种资源对象的信息。
是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库
2.工作节点(node):集群的数据平面,负责为容器提供运行环境。
-
Kubelet:负责维护容器的生命周期,即通过控制 Docker ,来创建、更新、销毁容器。
一个在集群中每个节点(node)上运行的代理。 它保证容器(containers)都运行在 Pod 中。
kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。 kubelet 不会管理不是由 Kubernetes 创建的容器。 -
KubeProxy:负责提供集群内部的服务发现和负载均衡。
kube-proxy 是集群中每个节点上运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。
kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
如果操作系统提供了数据包过滤层并可用的话,kube-proxy 会通过它来实现网络规则。否则, kube-proxy 仅转发流量本身。 - Docker:负责节点上容器的各种操作。
3.组件调用关系
部署一个 Nginx 服务, Kubernetes 系统各个组件调用关系:
- 1.Kubernetes 环境启动之后,master 和 node 都会将自身的信息存储到etcd数据库中。
- 2.一个Nginx服务的安装请求首先会被发送到 master 节点上的 API Server 组件。
- 3.API Server 组件会调用 Scheduler 组件来决定到底应该把这个服务安装到那个 node 节点上。此时,它会从 etcd 中读取各个 node 节点的信息,然后按照一定的算法进行选择,并将结果告知 API Server 。
- 4.API Server 调用 Controller-Manager 去调用 Node 节点安装 Nginx 服务。
- 5.Kubelet 接收到指令后,会通知 Docker ,然后由 Docker 来启动一个 Nginx 的 Pod 。Pod 是 Kubernetes 的最小操作单元,容器必须跑在 Pod 中。
- 6.一个 Nginx 服务就运行了,如果需要访问 Nginx ,就需要通过 kube-proxy 来对 Pod 产生访问的代理,这样,外界用户就可以访问集群中的 Nginx 服务了。
四、kubernetes 概念
● Master:集群控制节点,每个集群要求至少有一个 Master 节点来负责集群的管控。
● Node:工作负载节点,由 Master 分配容器到这些 Node 工作节点上,然后 Node 节点上的 Docker 负责容器的运行。
● Pod:Kubernetes 的最小控制单元,容器都是运行在 Pod 中的,一个 Pod 中可以有一个或多个容器。
● Controller:控制器,通过它来实现对 Pod 的管理,比如启动 Pod 、停止 Pod 、伸缩 Pod 的数量等等。
● Service:Pod 对外服务的统一入口,其下面可以维护同一类的多个 Pod 。
● Label:标签,用于对 Pod 进行分类,同一类 Pod 会拥有相同的标签。
● NameSpace:命名空间,用来隔离 Pod 的运行环境。
网友评论