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。 每个工作节点都有一个 kubelet和kube-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
为服务提供外网入口(七层代理)。