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项目来为集群提供服务注册和服务发现的动态名称解析服务。文章来源:https://www.toymoban.com/news/detail-765650.html
Dashboard
K8S集群的全部功能都要基于Web的UI,来管理集群中的应用和集群自身。文章来源地址https://www.toymoban.com/news/detail-765650.html
到了这里,关于k8s学习笔记(二):k8s的组件介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!