Chuyển tới nội dung chính

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 Period5 giâyCứ 5s kiểm tra trạng thái Node qua apiserver
Node Monitor Grace Period40 giâyMất heartbeat 40s → đánh dấu Node NotReady / unreachable
Pod Eviction Timeout5 phútNode 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 ownerReferences trỏ 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​

ControllerWatchHành độngVí dụ
NodeHeartbeat của NodeĐánh dấu NotReady, gắn taint, evict podNode chết → pod chuyển sang node khác
ReplicaSetReplicaSet, PodTạo/xóa Pod cho đủ replicasXóa pod → pod mới mọc lại
DeploymentDeploymentTạo và scale ReplicaSetkubectl set image → rolling update
NamespaceNamespace bị xóaXóa mọi object bên trongkubectl delete ns dev
EndpointSliceService, PodCập nhật danh sách IP pod của ServiceService tự biết pod nào Ready
ServiceAccountNamespace mớiTạo SA defaultNamespace nào cũng có SA default
Job, CronJobJob, CronJobTạo pod chạy đến khi xongBackup lúc 2h sáng
PV binderPVC, PVGhép PVC với PV phù hợpPVC 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-periodCá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-cidrsChia dải IP pod cho từng node
--leader-elect=trueKhi HA, chỉ một controller-manager hoạt động tại một thời điểm

Chia dải IP pod cho từng node (Node IPAM)​

--allocate-node-cidrs=true     # bật tính năng
--cluster-cidr=10.244.0.0/16 # dải tổng cho TẤT CẢ pod
--node-cidr-mask-size=24 # (mặc định) mỗi node nhận một mảnh /24
💡 Ví von

--cluster-cidr là cả khu đô thị. Controller chia thành từng phường (mỗi node một /24 = 256 địa chỉ, ghi vào node.spec.podCIDR). Pod là nhà trong phường.

Vì sao gộp mọi controller vào một process?​

Lý doGiải thích
Đơn giảnMột binary, một static pod, một bộ cert thay vì 30+ process
Dùng chung cacheShared informer: một kết nối watch cho mỗi loại object, chia cho mọi controller → giảm tải apiserver
Leader electionCluster 3 master có 3 controller-manager, chỉ một làm leader. Nếu không, 3 con cùng thấy thiếu 1 pod sẽ tạo ra 3 pod