节点上的Pod由Master管理。每个节点都必须运行kubelet、kube-proxy服务,而这些服务由Node Controller管理,当节点启动后会自动向Master注册自己,这样Master能够识别到该节点。Node Controller在节点出现故障时会进行相应处理。
kubelet
kubelet是主要的“节点代理”,它会监视分配给该节点的Pods,并确保这些Pods按照Kubernetes API中描述的那样运行。kubelet不直接跟Master通信,而是通过kube-apiserver这个接口,并且每个节点上都会运行一个kubelet服务进程。
kube-proxy
kube-proxy负责为Pod网络提供服务。它维护节点上的一些网络规则,这些网络规则允许网络会话到达Pod。kube-proxy使用iptables管理这些网络规则。在Kubernetes 1.2中,引入了一个新的代理模式,该模式使用用户空间代理进行流量转发,而不是iptables规则。这一模式仍在开发中,并可能在未来的版本中替代iptables模式。
容器运行时
要运行容器,Kubernetes使用一个容器运行时。Kubernetes本身并不直接包含任何容器运行时;相反,它设计成了一个可插拔的接口,可以支持多种容器运行时,例如Docker、rkt、containerd、CRI-O等。
节点状态
节点有三种状态:Ready、SchedulingDisabled和Unknown。如果节点处于Ready状态,kubelet能够正常工作,并且节点能够接收新的Pods。如果节点处于SchedulingDisabled状态,kubelet正常工作,但是Master不会将新的Pods调度到该节点上。如果节点处于Unknown状态,则kubelet没有正常报告节点的状态,此时Master会自动停止将新的Pods调度到该节点上。
节点组件间的交互
节点上的kubelet通过与kube-apiserver交互来管理Pods和其容器。具体来说,kubelet会定期从kube-apiserver获取节点的期望状态(即运行在节点上的Pods的期望状态),然后确保节点的实际状态与期望状态一致。如果实际状态与期望状态不一致,kubelet会尝试修复它。
kube-proxy则负责实现Kubernetes服务(Service)的概念。它会监听kube-apiserver中Service和Endpoint对象的变化,并据此更新节点上的网络规则,确保客户端能够正确地访问到Pods提供的服务。
容器运行时则负责实际运行容器。当kubelet决定需要创建或删除一个容器时,它会通过容器运行时的接口来执行相应的操作。
这些组件之间的交互使得Kubernetes能够在分布式环境中高效地管理和调度容器化应用。