初衷
最近面试总是被问:k8s有哪些组件?这些组件它们的功能分别是什么?
想着就记录一下。
架构
一个典型的Kubernetes集群由多个工作节点(worker node)和一个集群控制平面(controlplane,即Master),以及一个集群状态存储系统(etcd)组成。Kubernetes的系统架构大致如下图所示:
Master组件
Master节点负责整个集群的管理工作,为集群提供管理接口,并监控和编排集群中的各个工作节点。
Maser组件如下:
-
API Server
API Server是整个集群的网关,它负责输出RESTful风格的Kubernetes API,它是发往集群的所有REST操作命令的接入点,并负责接收、校验并响应所有的REST请求,结果状态被持久存储于etcd中。
-
controller-manager(控制器管理器)
功能主要包括生命周期功能和API业务逻辑。
- 生命周期功能:包括Namespace创建和生命周期、Event垃圾回收、Pod终止相关的垃圾回收、级联垃圾回收及Node垃圾回收等。
- API业务逻辑:例如,由ReplicaSet执行的Pod扩展等。
-
etcd
Kubernetes集群的所有状态信息都以键值数据持久存储于存储系统etcd中,它提供了监听(watch)机制
,用于监听和推送变更。
etcd是由CoreOS基于Raft协议开发的分布式键值存储,可用于服务发现、共享配置以及一致性保障(如数据库主节点选择、分布式锁等)。注意,etcd是独立的服务组件,并不隶属于Kubernetes集群自身
-
schedule(调度器)
Scheduler根据集群内各节点的可用资源状态,以及要运行的容器的资源需求做出调度决策。另外,Kubernetes还支持用户自定义调度器。
Node组件
Node负责提供运行容器的各种依赖环境,并接受Master的管理,各节点负责以Pod的形式运行容器。
每个Node主要由以下几个组件构成:
-
kubelet
kubelet是运行于工作节点之上的守护进程,它从API Server接收关于Pod对象的配置信息并确保它们处于目标状态。kubelet会在APIServer上注册当前工作节点,定期向Master汇报节点资源使用情况,并通过cAdvisor监控容器和节点的资源占用状况。
-
容器引擎
容器运行时环境每个Node都要提供一个容器运行时(Container Runtime)环境,它负责下载镜像并运行容器。kubelet并未固定链接至某容器运行时环境,而是以插件的方式载入配置的容器环境。这种方式清晰地定义了各组件的边界。目前,Kubernetes支持的容器运行环境至少包括Docker、RKT、cri-o和Fraki等。
-
kube-proxy
每个工作节点都需要运行一个kube-proxy守护进程,它能够按需为Service资源对象生成iptables或ipvs规则,从而捕获访问当前Service的ClusterIP的流量并将其转发至正确的后端Pod对象。
核心附件
-
KubeDNS
在Kubernetes集群中调度运行提供DNS服务的Pod,同一集群中的其他Pod可使用此DNS服务解决主机名。Kubernetes自1.11版本开始默认使用CoreDNS项目为集群提供服务注册和服务发现的动态名称解析服务。
-
Dashboard
Kubernetes集群的全部功能都要基于Web的UI,来管理集群中的应用甚至是集群自身。
-
Heapster
容器和节点的性能监控与分析系统,它收集并解析多种指标数据,如资源利用率、生命周期事件等。新版本的Kubernetes中,其功能会逐渐由Prometheus结合其他组件所取代。 -
Ingress Controller
Service是一种工作于传统层的负载均衡器,而Ingress是在应用层实现的HTTP(s)负载均衡机制。不过,Ingress资源自身并不能进行“流量穿透”,它仅是一组路由规则的集合,这些规则需要通过Ingress控制器(Ingress Controller)发挥作用。目前,此类的可用项目有Nginx、Traefik、Envoy及HAProxy等。