本文尝试从Kubernetes Controller的种类、交互逻辑、最佳实践、伪代码示例及历史演进5个方面对其进行详细阐述,希望对您有所帮助!
Kubernetes Controller Manager 是 Kubernetes 集群的核心组件之一,负责管理和协调集群内各种控制器。控制器是实现 Kubernetes 集群自动化管理的核心部分,通过持续协调集群的实际状态和期望状态,确保资源的正确配置和运行。
Kubernetes Controller Manager 包含多个控制器,每个控制器负责特定的资源和任务。以下是一些主要控制器及其功能:
Node Controller
Replication Controller
Endpoint Controller
Service Account & Token Controllers
Namespace Controller
Job Controller
CronJob Controller
DaemonSet Controller
StatefulSet Controller
Deployment Controller
ReplicaSet Controller
Horizontal Pod Autoscaler (HPA) Controller
Vertical Pod Autoscaler (VPA) Controller
Garbage Collector Controller
Certificate Signing Request (CSR) Controller
这些控制器通过不断检查集群的实际状态和期望状态,执行必要的操作来确保 Kubernetes 集群的稳定和可靠运行。
Kubernetes Controller Manager 包含的控制器非常多,以下是一些更高级的或特定于某些功能的控制器:
Ingress Controller
ResourceQuota Controller
LimitRange Controller
PersistentVolume Controller
PersistentVolumeClaim Controller
StorageClass Controller
Certificate Controller
PodDisruptionBudget (PDB) Controller
NetworkPolicy Controller
Service Controller
TTL Controller for Finished Resources
EndpointSlice Controller
CSIDriver and CSINode Controllers
VolumeAttachment Controller
ServiceAccountToken Controller
这些控制器涵盖了 Kubernetes 集群中广泛的资源和功能,通过不断协调和管理这些资源,确保集群的自动化操作、资源管理和高可用性。
以下是一些更为细分和特定功能的控制器:
CSIDriver Controller
CSINode Controller
VolumeSnapshot Controller
CronJob Controller
ResourceClaim and ResourceClaimTemplate Controllers
CustomResourceDefinition (CRD) Controller
Event Controller
Garbage Collector
Priority and Fairness (P&F) Controller
TokenCleaner Controller
PodSecurityPolicy (PSP) Controller
CertificateSigningRequest (CSR) Controller
RuntimeClass Controller
EndpointSlice Controller
MutatingAdmissionWebhook and ValidatingAdmissionWebhook Controllers
ClusterRole and ClusterRoleBinding Controllers
Role and RoleBinding Controllers
Lease Controller
APIService Controller
这些控制器共同工作,确保 Kubernetes 集群的自动化管理、资源调度、安全性和高可用性。通过这些控制器,Kubernetes 实现了对集群资源的全面管理和高效运行。

kubectl / CLI 与 API Server 的交互:
API Server 与 etcd 的交互:
API Server 与 Scheduler 的交互:
API Server 与 Controller Manager 的交互:
Controller Manager 内部控制器的交互:
API Server 与 Kubelet 的交互:
Kubelet 与 Container Runtime 的交互:
Kubelet 与 Pod Network 的交互:
Kubelet 与 kube-proxy 的交互:
Controller Manager 与 Persistent Storage 的交互:
通过这样的示意图和详细说明,可以更直观地理解 Kubernetes 各主要组件和控制器之间的交互关系。
在 Kubernetes 中,控制器(Controller)是保持系统实际状态与期望状态一致的关键组件。为了确保控制器的高效、可靠和安全运行,以下是一些最佳实践:
Idempotency(幂等性)
Reconciliation Loop(协调循环)
Event Handling(事件处理)
Error Handling(错误处理)
Rate Limiting(限流)
Scalability(可扩展性)
Resource Management(资源管理)
Observability(可观察性)
Security(安全性)
Controller Libraries and Frameworks(控制器库和框架)
Testing(测试)
Documentation(文档)
Redundancy(冗余)
Health Checks(健康检查)
Graceful Shutdown(优雅停机)
通过遵循这些最佳实践,可以确保 Kubernetes 控制器的高效、可靠和安全运行,有助于维护集群的稳定性和高可用性。
为了实现一个遵循最佳实践的 Kubernetes 控制器,以下是一个使用 Go 语言编写的伪代码示例。该控制器监控自定义资源 Foo,并确保每个 Foo 对象对应一个名为 bar-{foo_name} 的 ConfigMap 存在。
package main
import (
"context"
"fmt"
"log"
"time"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/cache"
"k8s.io/client-go/util/retry"
"k8s.io/client-go/util/workqueue"
"k8s.io/apimachinery/pkg/util/wait"
)
// FooController 定义控制器结构体
type FooController struct {
clientset *kubernetes.Clientset
informer cache.SharedIndexInformer
workqueue workqueue.RateLimitingInterface
}
// NewFooController 创建新的控制器实例
func NewFooController(clientset *kubernetes.Clientset, informer cache.SharedIndexInformer) *FooController {
workqueue := workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "Foo")
informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) {
key, err := cache.MetaNamespaceKeyFunc(obj)
if err == nil {
workqueue.Add(key)
}
},
UpdateFunc: func(oldObj, newObj interface{}) {
key, err := cache.MetaNamespaceKeyFunc(newObj)
if err == nil {
workqueue.Add(key)
}
},
DeleteFunc: func(obj interface{}) {
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
if err == nil {
workqueue.Add(key)
}
},
})
return &FooController{
clientset: clientset,
informer: informer,
workqueue: workqueue,
}
}
// Run 启动控制器
func (c *FooController) Run(stopCh <-chan struct{}) {
defer c.workqueue.ShutDown()
go c.informer.Run(stopCh)
if !cache.WaitForCacheSync(stopCh, c.informer.HasSynced) {
log.Fatalf("Error syncing cache")
return
}
wait.Until(c.runWorker, time.Second, stopCh)
}
// runWorker 处理队列中的项目
func (c *FooController) runWorker() {
for c.processNextItem() {
}
}
// processNextItem 处理队列中的下一个项目
func (c *FooController) processNextItem() bool {
key, quit := c.workqueue.Get()
if quit {
return false
}
defer c.workqueue.Done(key)
err := c.syncHandler(key.(string))
if err != nil {
c.workqueue.AddRateLimited(key)
} else {
c.workqueue.Forget(key)
}
return true
}
// syncHandler 同步资源状态
func (c *FooController) syncHandler(key string) error {
namespace, name, err := cache.SplitMetaNamespaceKey(key)
if err != nil {
return fmt.Errorf("invalid resource key: %s", key)
}
// 获取 Foo 对象
foo, err := c.informer.GetIndexer().ByNamespace(namespace).Get(name)
if err != nil {
if cache.IsNotFound(err) {
// Foo 对象已被删除
return nil
}
return err
}
// 确保对应的 ConfigMap 存在
configMapName := fmt.Sprintf("bar-%s", name)
configMap, err := c.clientset.CoreV1().ConfigMaps(namespace).Get(context.TODO(), configMapName, metav1.GetOptions{})
if err != nil {
if cache.IsNotFound(err) {
// 创建 ConfigMap
configMap = &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: configMapName,
Namespace: namespace,
},
Data: map[string]string{
"foo": name,
},
}
_, err = c.clientset.CoreV1().ConfigMaps(namespace).Create(context.TODO(), configMap, metav1.CreateOptions{})
if err != nil {
return err
}
} else {
return err
}
}
return nil
}
func main() {
config, err := rest.InClusterConfig()
if err != nil {
log.Fatalf("Error building kubeconfig: %s", err.Error())
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
log.Fatalf("Error building kubernetes clientset: %s", err.Error())
}
informerFactory := informers.NewSharedInformerFactory(clientset, time.Minute)
fooInformer := informerFactory.Core().V1().ConfigMaps().Informer()
controller := NewFooController(clientset, fooInformer)
stopCh := make(chan struct{})
defer close(stopCh)
go controller.Run(stopCh)
<-stopCh
}
初始化控制器
NewFooController 函数初始化控制器,设置事件处理程序,将资源事件添加到工作队列。运行控制器
Run 方法启动控制器,运行 Informer 并同步缓存,然后启动工作线程处理队列中的项目。处理队列中的项目
runWorker 方法从队列中提取项目并调用 processNextItem 处理它们。processNextItem 方法调用 syncHandler 同步资源状态,并根据处理结果决定是否重新调度该项目。同步资源状态
syncHandler 方法获取 Foo 对象,并确保对应的 ConfigMap 存在。如果不存在,则创建它。syncHandler 实现协调循环,保持实际状态与期望状态一致。RateLimitingInterface 控制工作队列的处理速率。Kubernetes Controller Manager 作为 Kubernetes 集群的核心组件之一,其功能和架构在不同版本的 Kubernetes 中不断演进。以下是 Kubernetes Controller Manager 的历史演进概述:
在 Kubernetes 的早期版本中,Controller Manager 的概念并不明确。早期的控制器逻辑直接内置在 API Server 中,负责管理 Pod 和其他资源的生命周期。随着 Kubernetes 的发展,控制器逻辑逐渐被抽象和独立出来,形成了一个单独的组件。
kube-controller-manager 运行。这种设计简化了部署和管理,但缺乏灵活性。Kubernetes Controller Manager 的演进体现了 Kubernetes 不断扩展和增强其功能以满足各种需求的过程。随着 Kubernetes 的发展,Controller Manager 添加了许多新功能和控制器,以更好地管理和调度集群资源,提升系统的自动化和智能化水平。这些演进帮助 Kubernetes 成为一个强大且灵活的容器编排平台。
完。
希望对您有用!关注锅总,及时获得更多花里胡哨的运维实用操作!

锅总微信公众号

锅总个人博客
https://gentlewok.blog.csdn.net/