kube-controller-manager
1. kube-controller-manager là gì?
- Là một tiến trình nền (daemon) của Control Plane, chạy các vòng lặp điều khiển (control loop) để giữ trạng thái thực tế của cluster khớp với trạng thái mong muốn (desired state).
- Bên trong có nhiều controller, mỗi controller lo một việc: theo dõi Node, giữ đủ số Pod, tạo Endpoint cho Service…
2. Node Controller
| Thông số | Mặc định | Ý nghĩa |
|---|---|---|
| Node Monitor Period | 5 giây | Cứ 5s kiểm tra trạng thái Node qua apiserver |
| Node Monitor Grace Period | 40 giây | Mất heartbeat 40s → đánh dấu Node NotReady / unreachable |
| Pod Eviction Timeout | 5 phút | Node không hồi phục sau 5 phút → evict Pod, tạo lại trên Node khỏe (nếu Pod thuộc ReplicaSet) |
ghi chú
Evict Pod (pod eviction) là việc hệ thống chủ động dừng và đẩy một Pod ra khỏi Node.
3. ReplicaSet Controller
ReplicaSet không lưu danh sách tên pod. Nó nhận biết "pod của mình" bằng label selector:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: web
spec:
replicas: 3 # mong muốn (desired state)
selector:
matchLabels:
app: web # "Pod nào có label app=web là của tôi"
template: # khuôn để tạo pod mới khi thiếu
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx
- Thực tế = đếm số pod đang sống có label khớp selector.
- Thực tế < replicas → tạo thêm từ
template. - Thực tế > replicas → xóa bớt.
- Bằng nhau → không làm gì.
Phân chia trách nhiệm khi một Pod chết
💡 Ghi nhớ
Controller chỉ tạo object Pod. Scheduler chọn node. kubelet chạy container. Ba việc, ba thành phần.
Deployment → ReplicaSet → Pod
- Deployment Controller chỉ quản lý ReplicaSet. Khi đổi image, nó tạo RS mới, tăng dần RS mới và giảm dần RS cũ.
- ReplicaSet Controller chỉ quản lý Pod.
- Mỗi object con có trường
ownerReferencestrỏ về cha. Nhờ vậy khi xóa Deployment, Garbage Collector (cũng là một controller) xóa luôn RS và Pod con.
4. Các controller bên trong
| Controller | Watch | Hành động | Ví dụ |
|---|---|---|---|
| Node | Heartbeat của Node | Đánh dấu NotReady, gắn taint, evict pod | Node chết → pod chuyển sang node khác |
| ReplicaSet | ReplicaSet, Pod | Tạo/xóa Pod cho đủ replicas | Xóa pod → pod mới mọc lại |
| Deployment | Deployment | Tạo và scale ReplicaSet | kubectl set image → rolling update |
| Namespace | Namespace bị xóa | Xóa mọi object bên trong | kubectl delete ns dev |
| EndpointSlice | Service, Pod | Cập nhật danh sách IP pod của Service | Service tự biết pod nào Ready |
| ServiceAccount | Namespace mới | Tạo SA default | Namespace nào cũng có SA default |
| Job, CronJob | Job, CronJob | Tạo pod chạy đến khi xong | Backup lúc 2h sáng |
| PV binder | PVC, PV | Ghép PVC với PV phù hợp | PVC Pending → Bound |
5. Cấu hình
ExecStart=/usr/local/bin/kube-controller-manager \
--kubeconfig=/var/lib/kubernetes/kube-controller-manager.kubeconfig \
--cluster-signing-cert-file=/var/lib/kubernetes/ca.crt \
--cluster-signing-key-file=/var/lib/kubernetes/ca.key \
--root-ca-file=/var/lib/kubernetes/ca.crt \
--service-account-private-key-file=/var/lib/kubernetes/service-account.key \
--service-cluster-ip-range=10.32.0.0/24 \
--cluster-cidr=10.244.0.0/16 \
--allocate-node-cidrs=true \
--leader-elect=true \
--node-monitor-period=5s \
--node-monitor-grace-period=40s \
--controllers=*,bootstrapsigner,tokencleaner \
--v=2
| Option | Ý nghĩa |
|---|---|
--kubeconfig | ⭐ Cách tìm và xác thực với apiserver. Controller-manager không nối etcd nên không có --etcd-servers |
--node-monitor-period, --node-monitor-grace-period | Các con số 5s và 40s ở trên |
--controllers=*,... | * = bật mọi controller mặc định. Thêm -tên để tắt, ví dụ *,-nodelifecycle |
--cluster-signing-* | CA dùng để ký certificate khi duyệt CSR (học ở phần Security) |
--cluster-cidr, --allocate-node-cidrs | Chia dải IP pod cho từng node |
--leader-elect=true | Khi HA, chỉ một controller-manager hoạt động tại một thời điểm |