The CKA exam domain 'Cluster Architecture, Installation & Configuration' is what this chapter directly addresses. The core components of a Kubernetes cluster — kube-apiserver, kube-controller-manager, kube-scheduler, and kubelet — are the brain, nervous system, and muscles that make a cluster run. By learning how to configure these components, you learn how to control, secure, and troubleshoot an entire cluster, which is exactly what the CKA exam tests.
Jump to a section
A simple way to picture Configuring Core Cluster Components
The Head Chef of a busy restaurant kitchen orchestrates the entire operation, ensuring every dish is perfect and every station works together. The kube-apiserver is like the Head Chef: it is the only one who talks to customers (users) and takes their orders, it checks that the orders follow the menu (validates configuration), and it tells every other station what to do. The kube-scheduler is the Sous Chef who decides which specific cook (node) will prepare each dish (pod) based on who is free and what ingredients are available. The kube-controller-manager is the Kitchen Manager who constantly walks around to make sure each station has enough supplies, that no dish is forgotten, and that if a cook drops a plate, a new one is made immediately. The kubelet is the Line Cook at each station: they don't leave their station, they just follow the orders sent to them and report back if something is burning or missing. When you "configure core components," you are setting the Head Chef's schedule (API server flags), the Sous Chef's rules (scheduler policies), the Kitchen Manager's checklists (controller settings), and each Line Cook's instructions (kubelet config). Without precise configuration, the kitchen descends into chaos: orders get lost, dishes get sent to the wrong table, and nobody knows who is responsible for fixing a broken stove.
The crucial detail is that each role communicates only through the Head Chef (API server). No Line Cook talks directly to the Kitchen Manager. This centralisation makes the restaurant scalable: you can add a hundred new Line Cooks and the Head Chef's orders still flow correctly. In Kubernetes, this is called "declarative state management" — the Head Chef agrees on a menu (the desired state) and the rest of the team works to make that menu a reality. Configuring these components means deciding how the Head Chef authenticates customers, how the Sous Chef selects a cook, and how the Kitchen Manager handles a broken stove. Each setting changes the behaviour of the entire kitchen.
Kubernetes is an open-source system for managing software workloads across multiple computers (called nodes). Think of it as an operating system for a data centre. Just like your laptop has a kernel that manages processes and hardware, Kubernetes has a set of core components that manage containers (lightweight software units) across a cluster (group of machines).
The absolute centre of everything is the kube-apiserver. This is a single program that expose an API (Application Programming Interface) — a set of rules that allow other programs to talk to it. Every single action in Kubernetes goes through the kube-apiserver: when you run a command like 'kubectl create deployment', your command is sent as a request to the kube-apiserver. It validates that your request is correctly formatted and that you have permission to make it. If everything is fine, it stores your request in a database called etcd. No other component can write to etcd; they all must go through the api-server. Configuring the kube-apiserver means setting its command-line flags. You can set things like which encryption keys to use for secrets, which authentication methods to accept (e.g., client certificates, bearer tokens, or identity services like Microsoft Entra ID), and what port number it listens on. The default configuration is fine for learning, but in a real business you need to lock it down. For example, you might set the '--authorization-mode' flag to 'RBAC' (Role-Based Access Control) to restrict who can see what.
The kube-controller-manager is a single binary that bundles many smaller controllers into one program. Each controller is a loop that constantly watches the current state of the cluster and tries to move it toward the desired state. For example, the Node Controller watches each machine: if a machine stops sending heartbeats (signals of life), the Node Controller marks it as dead. The Replication Controller ensures the correct number of pod copies (called replicas) are running. If someone accidentally kills a pod, the Replication Controller sees that the current count is lower than the desired count and creates a new pod to replace it. The Deployment Controller manages rolling updates — changing a software version without downtime. Configuring the kube-controller-manager involves setting flags like '--node-monitor-period' (how often it checks for dead nodes) and '--leader-elect' (for high availability clusters where multiple machines act as one).
The kube-scheduler is responsible for deciding which node should run a new pod. It does not actually start the pod; it just makes a decision and writes that decision to the api-server. The scheduler works in two phases: filtering and scoring. Filtering removes nodes that cannot run the pod (e.g., they are full, or do not have enough memory). Scoring ranks the remaining nodes based on various criteria, like how many other pods they are running, or how close the pod's data is. The node with the highest score wins. Configuring the scheduler means setting flags like '--policy-config-file' to load custom rules, or using '--kubeconfig' to point it to a specific cluster. For the CKA exam, you often need to know how to use taints and tolerations with the scheduler: you can mark a node with a taint so that only pods that explicitly tolerate that taint are scheduled there.
The kubelet is the node agent — it runs on every machine in the cluster, even the master. It acts as the bridge between the control plane (the api-server, controller, scheduler) and the container runtime (like Docker or containerd). The kubelet takes the pod specification it receives from the api-server and ensures the containers described in that spec are actually running. It constantly reports the health of the node and its pods back to the api-server. Configuring the kubelet is done through a configuration file or command-line flags. Key settings include '--node-ip' (the IP address of the node), '--cluster-dns' (the IP of the DNS service for the cluster), and '--register-node' (whether this node should automatically join the cluster). One critical configuration is authentication: the kubelet needs a certificate to talk securely to the api-server. If you set '--anonymous-auth' to 'false', only authenticated requests are processed.
These four components work together in a loop: you send a desired state (like "run 3 copies of my app") to the api-server, which stores it in etcd. The controller-manager notices the desired state and creates a pod record. The scheduler assigns that pod to a node. The kubelet on that node sees the assignment and starts the container. The controller-manager keeps checking the actual state until it matches the desired state. Each component has its own configuration file or set of flags, and changing any one of them can dramatically change cluster behaviour.
Identify the Component Type
Determine whether the component (kube-apiserver, kube-controller-manager, kube-scheduler) is running as a static pod or a systemd service. This tells you where to find its configuration file. Static pod manifests are in /etc/kubernetes/manifests/. Systemd services have unit files in /etc/systemd/system/.
Locate the Configuration File
For static pods, open the YAML file (e.g., /etc/kubernetes/manifests/kube-apiserver.yaml). For systemd services, run 'systemctl cat kubelet' to see the unit file. The configuration is usually in the command section of the container spec or in the ExecStart line.
Edit the Flag or Value
Add or modify the relevant command-line flag. For example, to enable RBAC, add '--authorization-mode=RBAC' to the kube-apiserver command. Use a text editor like vim or nano. Be careful to maintain valid YAML formatting.
Apply the Change
For static pods, saving the file is enough because the kubelet detects the change and restarts the pod automatically. For systemd services, run 'systemctl daemon-reload' then 'systemctl restart <component>'. For the kubelet, also run 'systemctl restart kubelet'.
Verify the Configuration
Check if the component is running with the new configuration. For static pods, use 'kubectl get pods -n kube-system' to see the pod restarted. For kubelet, check 'kubectl get nodes' to ensure the node is healthy. Verify the flag took effect by checking logs or using 'kubectl describe pod' on the component.
An IT professional managing a Kubernetes cluster for a financial services company spends significant time configuring these core components to meet security and reliability requirements.
The first task is securing the kube-apiserver. The company policy requires that all administrative access be authenticated through Microsoft Entra ID. The engineer starts by enabling OIDC (OpenID Connect) authentication on the api-server. They set the '--oidc-issuer-url' flag to their Microsoft Entra ID tenant, and '--oidc-client-id' to the registered application ID. This means when the engineer runs 'kubectl get pods', their identity token is validated by the api-server against Microsoft Entra ID. They also set '--authorization-mode=RBAC' and create a Role that grants only read access to a specific namespace. They set '--enable-admission-plugins=PodSecurityPolicy' to prevent developers from running containers as root.
Next, they configure the kube-controller-manager. They set '--node-monitor-grace-period=40s' so that the cluster marks a node as unhealthy if it hasn't reported for 40 seconds. They also set '--pod-eviction-timeout=5m' — if a node goes down, the controller waits 5 minutes before evicting its pods and recreating them elsewhere. For a financial application that cannot afford data loss, they set '--terminated-pod-gc-threshold' to handle cleanup carefully. The engineer configures the controller to use a leader election flag for high availability, ensuring a backup controller takes over if the primary fails.
The kube-scheduler is configured with custom priorities. The company runs GPU-intensive machine learning workloads alongside regular web servers. They create a custom scheduler policy that gives higher weight to nodes with GPU devices. They also set resource quotas via the api-server bindings. To isolate sensitive workloads, they apply a taint to a dedicated set of nodes: 'kubectl taint nodes gpu-nodes dedicated=gpu:NoSchedule'. Only pods with a matching toleration can land there.
Finally, each node's kubelet is configured. The engineer sets '--kubelet-extra-args' during bootstrap to specify the node's internal IP (--node-ip) for secure communication behind a firewall. The '--cluster-dns' is set to the IP of the CoreDNS service. They enable node status updates every 10 seconds with '--node-status-update-frequency'. To make the node non-schedulable for maintenance without killing pods, they set '--register-schedulable=false' temporarily.
All of these configurations are deployed as static pod manifests or via configuration files passed to the kubeadm tool. The outcome is a production cluster that meets PCI-DSS compliance, enables secure multi-tenancy, and guarantees 99.9% uptime for trading applications.
The CKA exam will test your ability to configure these core components through practical tasks. Expect questions that require you to modify kube-apiserver flags, taint nodes, or change scheduler behaviour.
First, you must know how to find and edit static pod manifests. The kube-apiserver, kube-controller-manager and kube-scheduler are often run as static pods on a master node. Their YAML manifests live in /etc/kubernetes/manifests/. The exam will ask you to add a flag like '--service-cluster-ip-range' to the api-server by editing its manifest and saving the file. The kubelet automatically detects the change and restarts the pod. A common trap is editing the manifest file but forgetting that the kubelet watches that directory. You do not need to manually restart the api-server process; just editing the YAML is enough.
Second, the exam tests kubelet configuration. You might be asked to change the kubelet's port or authentication method. The kubelet configuration is typically at /var/lib/kubelet/config.yaml. You edit this file, then run 'systemctl daemon-reload && systemctl restart kubelet' to apply changes. A trick: the exam might change the kubelet's node-ip address, causing it to register with the wrong IP. You must know to check the '--node-ip' flag in the kubelet's systemd unit or config file.
Third, expect questions on taints and tolerations. The scenario: 'Configure the scheduler to prevent pods from being scheduled on node N unless they tolerate a specific taint.' You will use 'kubectl taint nodes node-name key=value:NoSchedule'. Then you must add a toleration to a pod's YAML. The trap is using the wrong taint effect (NoSchedule, PreferNoSchedule, or NoExecute). NoSchedule blocks new pods. PreferNoSchedule is a soft block. NoExecute evicts existing pods. The CKA often uses NoSchedule.
Fourth, know the kube-controller-manager flags for node monitoring. Set '--node-monitor-grace-period' and '--pod-eviction-timeout'. The exam may ask: 'A node has been unreachable for 2 minutes. What happens?' You need to reason from the default values: node-monitor-grace-period is 40s, so after 40 seconds the node is marked as NotReady. Then after pod-eviction-timeout (default 5 minutes), pods are rescheduled.
Fifth, the exam loves static pods versus daemonsets. You may be asked to create a static pod by writing a manifest in /etc/kubernetes/manifests/. They will expect you to know that static pods are managed by the kubelet, not by the api-server's scheduler. Therefore, static pods ignore taints and tolerations. This is a frequent trap.
Finally, security configuration: you may need to enable RBAC on the api-server and create a ClusterRole and ClusterRoleBinding. Alternatively, you might need to disable anonymous authentication by setting '--anonymous-auth=false' on the kubelet. The correct answer pattern is always: find the correct config file, edit the specific flag, restart the component if it is not a static pod, and verify with 'kubectl get componentstatuses' or systemctl status.
The kube-apiserver is the only component that writes to etcd; all other components communicate only through it.
The kube-controller-manager runs multiple control loops that continuously reconcile the cluster's actual state with its desired state.
The kube-scheduler uses a two-phase process (filter and score) to assign pods to nodes.
The kubelet runs on every node and is the primary agent that ensures containers are running as defined.
You configure core components by editing their static pod manifests in /etc/kubernetes/manifests/ or their systemd unit files.
Taints and tolerations restrict which pods can be scheduled on which nodes, and 'NoSchedule' is the most common effect tested in CKA.
These come up on the exam all the time. Here's how to tell them apart.
Static Pod
Configuration is placed directly in /etc/kubernetes/manifests/ on the node.
Managed entirely by the kubelet, ignoring the scheduler.
Typically used for core control plane components like kube-apiserver.
DaemonSet
Configuration is an API object defined in a YAML file submitted to the api-server.
Managed by the kube-controller-manager and respects scheduling and taints.
Used for cluster-wide services like log collectors or monitoring agents.
kube-apiserver
Accepts all API requests and validates them.
Writes desired state to etcd.
Requires authentication and authorisation configuration.
kube-scheduler
Only reads unscheduled pods from the api-server.
Decides which node a pod runs on and writes the binding back.
Can be replaced with a custom scheduler per pod.
kube-controller-manager
Runs on the control plane node(s) as a single process.
Watches cluster state via the api-server and reacts.
Manages cluster-wide controllers like Node and Replication.
kubelet
Runs on every node in the cluster.
Directly manages containers via the container runtime.
Reports node and pod status back to the api-server.
Taint
Applied to a node to repel pods that do not tolerate it.
Has an effect: NoSchedule, PreferNoSchedule, or NoExecute.
Used to dedicate nodes for specific workloads.
Toleration
Applied to a pod to allow it to be scheduled on a tainted node.
Must match the taint's key, value, and effect to be effective.
Does not prevent the pod from being scheduled on untainted nodes.
Mistake
The kube-scheduler actually starts containers on nodes.
Correct
The kube-scheduler only decides which node should run a pod; the kubelet on that node is responsible for starting the containers.
Beginners see the word 'scheduler' and assume it does the scheduling work itself. In reality, it only makes binding decisions.
Mistake
The kube-controller-manager and kube-scheduler are optional — they can be replaced by third-party tools.
Correct
They are core components required for a functional cluster. You must configure them, even if you use custom schedulers as additional options.
Reading about custom schedulers leads people to think the default scheduler is optional. In fact, the controller-manager is always needed for basic operations like node lifecycle.
Mistake
You can configure the kube-apiserver by editing a ConfigMap inside the cluster.
Correct
The kube-apiserver is configured through command-line flags passed to its process, usually defined in a static pod manifest file on the master node.
People familiar with deploying apps using ConfigMaps assume all components use the same pattern. Core components are managed as static pods or systemd services, not ConfigMaps.
Mistake
The kubelet runs only on worker nodes, not on master nodes.
Correct
The kubelet runs on every node in the cluster, including master nodes. Master nodes run the control plane components as static pods managed by the kubelet.
The term 'master node' suggests it is different from a worker node. In reality, the master runs the kubelet too, which is crucial for static pod management.
Mistake
If you change a kube-apiserver flag in the manifest file, you must manually restart the kube-apiserver process.
Correct
The kubelet watches the manifest directory and automatically restarts the pod when the file changes. No manual restart is needed.
People are used to managing services with systemctl restart. Static pods are auto-managed by the kubelet, so the manual step is skipped.
Reveal each answer, then mark whether you got it right. Score 60%+ to unlock the next chapter.
You set the '--insecure-port' or '--secure-port' flag in the kube-apiserver's static pod manifest file. The default secure port is 6443.
kube-controller-manager runs cluster-internal controllers like node and replication controllers. cloud-controller-manager runs controllers that interact with a cloud provider's API, such as load balancers or storage.
Yes, you can run multiple schedulers. Each pod can be assigned a specific scheduler by using the 'schedulerName' field in its pod spec.
The kube-controller-manager marks the node as NotReady after a grace period (default 40s). After another timeout (default 5 minutes), the controller evicts and reschedules the pods from that node.
No, the kubelet automatically detects the change and restarts the kube-apiserver pod. You just need to save the file.
Set the '--container-runtime' flag in the kubelet's configuration file or systemd unit. Common runtimes are 'docker', 'containerd', or 'remote'.
You've finished Configuring Core Cluster Components. Continue through the CKA study guide to build a complete picture of the exam.
Done with this chapter?