Node 组件运行在每一个节点上(包括 master 节点和 worker 节点),负责维护运行中的 Pod 并提供 Kubernetes 运行时环境。
kubelet
此组件是运行在每一个集群节点上的代理程序。它确保 Pod 中的容器处于运行状态。Kubelet 通过多种途径获得 PodSpec 定义,并确保 PodSpec 定义中所描述的容器处于运行和健康的状态。Kubelet不管理不是通过 Kubernetes 创建的容器
每个节点上都运行一个kubelet服务进程,默认监听10250端口
- 接收并执行master发来的指令
- 管理Pod及Pod中的容器
- 每个kubelet进程会在API Server 上注册节点自身信息,定期向 master 节点汇报节点的资源使用情况,并通过cAdvisor 监控节点和容器的资源。
如下 kubelet 内部组件结构图所示,Kubelet 由许多内部组件构成
- Kubelet API,包括 10250 端口的认证 API、4194 端口的 cAdvisor API、10255 端口的只读 API 以及 10248 端口的健康检查 API
- syncLoop:从 API 或者 manifest 目录接收 Pod 更新,发送到 podWorkers 处理,大量使用 channel 处理来处理异步请求
- 辅助的 manager,如 cAdvisor、PLEG、Volume Manager 等,处理 syncLoop 以外的其他工作
- CRI:容器执行引擎接口,负责与 container runtime shim 通信
- 容器执行引擎,如 dockershim、rkt 等(注:rkt 暂未完成 CRI 的迁移)
- 网络插件,目前支持 CNI 和 kubenet
启动 kubelet 示例
/usr/bin/kubelet \ --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \ --kubeconfig=/etc/kubernetes/kubelet.conf \ --pod-manifest-path=/etc/kubernetes/manifests \ --allow-privileged=true \ --network-plugin=cni \ --cni-conf-dir=/etc/cni/net.d \ --cni-bin-dir=/opt/cni/bin \ --cluster-dns=10.96.0.10 \ --cluster-domain=cluster.local \ --authorization-mode=Webhook \ --client-ca-file=/etc/kubernetes/pki/ca.crt \ --cadvisor-port=0 \ --rotate-certificates=true \ --cert-dir=/var/lib/kubelet/pki
kube-proxy
kube-proxy 是一个网络代理程序,运行在集群中的每一个节点上,是实现 Kubernetes Service 概念的重要部分。目前kube-proxy有如下三种工作模式:
- User space 模式
最早的负载均衡方案,它在用户空间监听一个端口,所有服务通过 iptables 转发到这个端口,然后在其内部负载均衡到实际的 Pod。该方式最主要的问题是效率低,有明显的性能瓶颈。
- iptables 模式
目前推荐的方案,完全以 iptables 规则的方式来实现 service 负载均衡。该方式最主要的问题是在服务多的时候产生太多的 iptables 规则,非增量式更新会引入一定的时延,大规模情况下有明显的性能问题
- IPVS模式
为解决 iptables 模式的性能问题,v1.11 新增了 ipvs 模式(v1.8 开始支持测试版,并在 v1.11 GA),采用增量式更新,并可以保证 service 更新期间连接保持不断开
注意:
使用 ipvs 模式时,需要预先在每台 Node 上加载内核模块
- nf_conntrack_ipv4
- ip_vs
- ip_vs_rr
- ip_vs_wrr
- ip_vs_sh
# load module <module_name>modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 # to check loaded modules, uselsmod | grep -e ip_vs -e nf_conntrack_ipv4 # orcut -f1 -d " " /proc/modules | grep -e ip_vs -e nf_conntrack_ipv4
- kube-proxy 详解_IT小菜鸟@的博客-CSDN博客
- 核心组件 - kube-proxy - 《Kubernetes指南(Kubernetes Handbook)(202005)》 - 书栈网 · BookStack
容器引擎
容器引擎负责运行容器。Kubernetes支持多种容器引擎:Docker(opens new window)、containerd(opens new window)、cri-o(opens new window)、rktlet(opens new window)以及任何实现了 Kubernetes容器引擎接口(opens new window)的容器引擎。
容器运行时(Container Runtime),运行于 k8s 集群的每个节点,负责容器的整个生命周期。k8s 最开始的容器运行时是 Docker, 后来为了适用更多的容器运行时,k8s 提出了 CRI(Container Runtime Interface)容器运行时接口,kubelet 通过 CRI 来与容器运行时通信。
CRI 是 k8s 定义的一组gRPC 服务,kubelet 作为客户端,基于 gRPC 框架,通过Socket 和容器运行时通信。
它包括两类服务:
- 镜像服务:提供下载、检查和删除镜像的远程程序调用。
- 运行时服务:包含用于管理容器生命周期,以及与容器交互的调用的远程程序调用。