k8s组件介绍

架构图

在这里插入图片描述

角色

  • Master:是集群的网关和中枢枢纽,主要作用:暴露API接口,跟踪其他服务器的健康状态、以最优方式调度负载,以及编排其他组件之间的通信。单个的Master节点可以完成所有的功能,但是考虑单点故障的痛点,生产环境中通常要部署多个Master节点,组成Cluster。包括所有的控制平面组件
  • Node:是Kubernetes的工作节点,负责接收来自Master的工作指令,并根据指令相应地创建和销毁Pod对象,以及调整网络规则进行合理路由和流量转发。生产环境中,Node节点可以有N个。包括所有node节点。

控制平面组件(Control Plane Components)

控制平面组件会为集群做出全局决策,比如资源的调度。 以及检测和响应集群事件,例如当不满足部署的 replicas 字段时, 要启动新的 pod)。

控制平面组件可以在集群中的任何节点上运行。 然而,为了简单起见,设置脚本通常会在同一个计算机上启动所有控制平面组件, 并且不会在此计算机上运行用户容器。

kube-apiserver

API 服务器是 Kubernetes 控制平面的组件, 该组件负责公开了 Kubernetes API,负责处理接受请求的工作。 API 服务器是 Kubernetes 控制平面的前端。

apiserver是整个集群的网关

K8S对外的唯一接口,提供HTTP/HTTPS RESTful API,即kubernetes API。所有的请求都需要经过这个接口进行通信。主要负责接收、校验并响应所有的REST请求,结果状态被持久存储在etcd当中,所有资源增删改查的唯一入口

端口
[root@k8s-master ~]# netstat -anplut|egrep LISTEN.*apiserver

在这里插入图片描述

容器
[root@k8s-master ~]# docker ps|grep apiserver
c09166f7c313   ca9843d3b545                                        "kube-apiserver --ad…"   3 minutes ago   Up 3 minutes             k8s_kube-apiserver_kube-apiserver-k8s-master_kube-system_2fc27474246553d4d73cbb5d364b9726_6
8f9429e1d4e6   registry.aliyuncs.com/google_containers/pause:3.2   "/pause"                  5 minutes ago   Up 5 minutes             k8s_POD_kube-apiserver-k8s-master_kube-system_2fc27474246553d4d73cbb5d364b9726_5

etcd

一致且高可用的键值存储,用作 Kubernetes 所有集群数据的后台数据库

负责保存k8s 集群的配置信息和各种资源的状态信息,当数据发生变化时,etcd会快速地通知k8s相关组件。etcd是一个独立的服务组件,并不隶属于K8S集群。生产环境当中etcd应该以集群方式运行,以确保服务的可用性。

etcd不仅仅用于提供键值数据存储,而且还为其提供了监听(watch)机制,用于监听和推送变更。在K8S集群系统中,etcd的键值发生变化会通知到API Server,并由其通过watch API向客户端输出。

端口
[root@k8s-master ~]# netstat -anplut|egrep LISTEN.*etcd

在这里插入图片描述

容器
[root@k8s-master ~]# docker ps |grep etcd
c66803416c06   0369cf4303ff                                        "etcd --advertise-cl…"   6 minutes ago   Up 6 minutes             k8s_etcd_etcd-k8s-master_kube-system_6b17573732d23fd599a67ffecd227455_5
f2847eb09da2   registry.aliyuncs.com/google_containers/pause:3.2   "/pause"                  6 minutes ago   Up 6 minutes             k8s_POD_etcd-k8s-master_kube-system_6b17573732d23fd599a67ffecd227455_5

kube-scheduler

kube-scheduler控制平面的组件, 负责监视新创建的、未指定运行节点(node)Pods, 并选择节点来让 Pod 在上面运行

调度决策考虑的因素包括单个 Pod 及 Pods 集合的资源需求、软硬件及策略约束、 亲和性及反亲和性规范、数据位置、工作负载间的干扰及最后时限。

容器
[root@k8s-master ~]# docker ps|grep scheduler
c179d65f1940   3138b6e3d471                                        "kube-scheduler --au…"   7 minutes ago   Up 7 minutes             k8s_kube-scheduler_kube-scheduler-k8s-master_kube-system_0378cf280f805e38b5448a1eceeedfc4_5
2dbe2c73b36b   registry.aliyuncs.com/google_containers/pause:3.2   "/pause"                  7 minutes ago   Up 7 minutes             k8s_POD_kube-scheduler-k8s-master_kube-system_0378cf280f805e38b5448a1eceeedfc4_5
端口
[root@k8s-master ~]# netstat -anplut|egrep LISTEN.*scheduler

在这里插入图片描述

kube-controller-manager

kube-controller-manager控制平面的组件, 负责运行控制器进程。

负责管理集群各种资源,保证资源处于预期的状态。

从逻辑上讲, 每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在同一个进程中运行。

这些控制器包括:

  • 节点控制器(Node Controller):负责在节点出现故障时进行通知和响应
  • 任务控制器(Job Controller):监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
  • 端点分片控制器(EndpointSlice controller):填充端点分片(EndpointSlice)对象(以提供 Service 和 Pod 之间的链接)。
  • 服务账号控制器(ServiceAccount controller):为新的命名空间创建默认的服务账号(ServiceAccount)。
  • 副本控制器:指定pod里的容器数,缺少几个就自动补齐
  • 部署控制器:帮助部署软件
  • 计划任务控制器:帮助监控计划任务
端口
[root@k8s-master ~]# netstat -anplut|egrep LISTEN.*kube-controlle

在这里插入图片描述

容器
[root@k8s-master ~]# docker ps |grep kube-controlle
3ea62f3d0381   b9fa1895dcaa                                        "kube-controller-man…"   10 minutes ago   Up 10 minutes             k8s_kube-controller-manager_kube-controller-manager-k8s-master_kube-system_5c575d17517839b576ab4817fd06353f_5
8d65ce545508   registry.aliyuncs.com/google_containers/pause:3.2   "/pause"                  10 minutes ago   Up 10 minutes             k8s_POD_kube-controller-manager-k8s-master_kube-system_5c575d17517839b576ab4817fd06353f_5

cloud-controller-manager

一个 Kubernetes 控制平面组件, 嵌入了特定于云平台的控制逻辑。 云控制器管理器(Cloud Controller Manager)允许你将你的集群连接到云提供商的 API 之上, 并将与该云平台交互的组件同与你的集群交互的组件分离开来。

cloud-controller-manager 仅运行特定于云平台的控制器。 因此如果你在自己的环境中运行 Kubernetes,或者在本地计算机中运行学习环境, 所部署的集群不需要有云控制器管理器。

kube-controller-manager 类似,cloud-controller-manager 将若干逻辑上独立的控制回路组合到同一个可执行文件中, 供你以同一进程的方式运行。 你可以对其执行水平扩容(运行不止一个副本)以提升性能或者增强容错能力。

下面的控制器都包含对云平台驱动的依赖:

  • 节点控制器(Node Controller):用于在节点终止响应后检查云提供商以确定节点是否已被删除
  • 路由控制器(Route Controller):用于在底层云基础架构中设置路由
  • 服务控制器(Service Controller):用于创建、更新和删除云提供商负载均衡器

Node组件

Kubelet

它保证容器都运行在Pod中。

单独的程序,在宿主机里运行,不是在容器里运行的

kubelet 会在集群中每个节点(node)上运行。 它保证容器(containers)都运行在 Pod 中。

kubelet是node的agent,当Scheduler确定在某个Node上运行Pod后,会将Pod的具体配置信息(image、volume等)发送给该节点的kubelet,kubelet会根据这些信息创建和运行容器,并向master报告运行状态

端口
[root@k8s-master ~]# netstat -anplut|grep kubelet

在这里插入图片描述

进程
[root@k8s-master ~]# ps aux|grep kubelet

在这里插入图片描述

Kube-proxy

单独的程序,在宿主机里运行,不是在容器里运行的

kube-proxy 是集群中每个节点(node)上所运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。

kube-proxy 维护节点上的一些网络规则, 这些网络规则会允许从集群内部或外部的网络会话与 Pod 进行网络通信。

如果操作系统提供了可用的数据包过滤层,则 kube-proxy 会通过它来实现网络规则。 否则,kube-proxy 仅做流量转发。

代理模式(负载均衡)
  • ipvs,生产环境建议开启ipvs
  • iptables,默认使用,效率低
端口
[root@k8s-master ~]# netstat -anplut|grep LISTEN.*kube-proxy

在这里插入图片描述

进程
[root@k8s-master ~]# ps aux|grep kube-proxy
root       3485  0.5  1.5 744064 28764 ?        Ssl  12:41   0:04 /usr/local/bin/kube-proxy --config=/var/lib/kube-proxy/config.conf --hostname-override=k8s-master
root      14987  0.0  0.0 112824   992 pts/0    S+   12:54   0:00 grep --color=auto kube-proxy

核心插件

网络通信组件

Calico

实现在overlay网络类型的宿主机间通信,适合大规模的集群

所有的k8s主机都会运行

flannel

适合小规模的集群

Core DNS

K8S集群中调度并运行提供DNS服务的Pod,同一集群内的其他Pod可以使用该DNS服务来解决主机名。K8S自1.11版本开始默认使用CoreDNS项目来为集群提供服务注册和服务发现的动态名称解析服务。

Dashboard

K8S集群的全部功能都要基于Web的UI,来管理集群中的应用和集群自身。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐