2、Kubernetes 组件概念

149 阅读4分钟

kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写,是 Google 团队发起的一个开源项目,它的目标是管理跨多个主机的容器,用于自动部署、扩展和管理容器化的应用程序,主要实现语言为 Go 语言。

Kubernetes 中的绝大部分概念都抽象成 Kubernetes 管理的一种资源对象,主要有 master、etcd、kube-apiserver、kube-controller-manager、kube-scheduler、node、kubelet、kube-proxy等等,下面我们注意开始介绍。

Master

Master 节点负责管理集群,部署集群所需组件etcd,kube-apiserver,kube-controller-manager,kube-scheduler。这些组件负责协调集群中的所有活动,例如调度应用程序、维护应用程序的所需状态、扩展应用程序和滚动更新等任务,Master 会一直与Node节点进行联系,确保容器运行的万无一失。当然Master节点可以不只有一个,如果有多个,我们会将其称之为高可用集群。

Node

节点是 Kubernetes 集群中的工作节点,用于托管正在运行的应用程序 Pod。 每个工作节点都有一个 kubeletkube-proxy,它是管理Node并与 Kubernetes Master 节点进行通信的代理。节点上还应具有容器(Kubernetes 负责容器的编排,实际运行程序的还是容器),如 Docker 、Containerd、Podman等。

集群组件

Etcd

键值存储数据库,维护集群内各个节点状态的一致性,保存集群的状态及配置(集群中的所有重要数据都在ETCD中进行存储)。

ETCD特点:分布式(分布式集群结构)、可信赖(基于Raft 最终一致算法)、键值存储(key-value),被视为 Kubernetes 集群的最终事实来源。在 ETCD 集群中每一台服务器只会处于 Leader、Follower以及Candidate三种状态,处于正常状态时,集群中只会存在一个Leader和其他的所有Follower,所以增加ETCD机器只会增加稳定性,对于并发没有任何帮助,所以无法提高性能。

ETCD V2版本:数据全部写入内存中进行存储,落盘机制较差,可能会因为突然断电导致数据丢失(Kubernetes v1.11版本已经弃用)。

ETCD V3版本:数据全部写入磁盘,提供缓存加速功能,建议磁盘使用SSD。

kube-apiserver

处理资源操作的请求,并提供认证、授权、访问控制、API 注册和发现等机制。(所有请求的统一入口、无状态服务、Kubectl+Web UI)

我们与 Kubernetes 集群进行交互,实际上就是与 kube-apiserver 进行交互,它是 Kubernetes 所有请求的统一入口,并且是无状态服务(查询相关数据时需要请求ETCD),操作方法 Kubectl、Web UI。

kube-controller-manager

控制器管理,负责维护集群的状态,如故障检测、自动扩展、滚动更新等。

kube-scheduler

Kubernetes 调度器,负责资源的调度,按照预定的调度策略将 Pod 调度到相应的节点(控制 Kubernetes 集群资源利用率)。

kubelet

负责维护容器的生命周期, Pod 的创建、启动、监控、重启、销毁等工作,处理Master节点(kube-apiserver)下发到本节点的任务。

Container runtime Interface (容器运行时接口)

负责镜像管理以及 Pod 和容器的真正运行(CRI)。

由于每种容器运行时各有所长,许多用户都希望Kubernetes支持更多的运行时。在Kubernetes v1.5发布版里,Kubernetes 引入了CRI,一个能让kubelet无需编译就可以支持多种容器运行时的插件接口。CRI包含了一组protocol buffers,gRPC API,相关的库,以及在活跃开发下的额外规范和工具。

kube-proxy

负责为 Service 提供集群内部的服务发现和负载均衡。

通过监听Master节点(kube-apiserver)下发到本节点的任务,调用Linux内核Netlink接口来创建IPVS、控制NetFilter。

Flannel/calico

网络插件, 负责为整个集群提供网络服务。

kube-dns/coredns

负责为整个集群提供 DNS 服务。

Ingress Controller

为服务提供外网入口(七层代理)。