kube-scheduler: This component is specifically responsible for watching for newly created pods that have no node assigned and selecting a node for them to run on. It makes this decision based on various factors like resource requirements, hardware/software/policy constraints, affinity and anti-affinity specifications, and workload interference. The scheduler essentially determines the placement of pods across the available nodes in your cluster.
kube-apiserver: All administrative tasks and cluster communications go through this API server. It validates and processes RESTful requests that modify the state of API objects like pods, services, and deployments, but it doesn't handle pod scheduling decisions.
kube-proxy: This network proxy runs on each node in your cluster and maintains network rules that allow network communication to your pods from inside or outside the cluster. It's responsible for implementing the Kubernetes Service concept by managing IP forwarding and load balancing, but not for pod scheduling.
kube-controller-manager: This component runs controller processes that regulate the state of the cluster (like node controller, replication controller, endpoints controller, etc.). These controllers watch for changes in the state and work to maintain the desired state, but they don't make the initial pod placement decisions.