我正在寻找创建一个自定义 Kubernetes 控制器;在这种情况下,我的意思是控制器,因为我不想创建 CRD,因此,不是操作员。基本上,它类似于外部 DNS项目,因为它监视注释,并根据该注释的存在/不存在采取行动。
有这样的简单例子吗?我找到的大部分资源都是用于操作员和创建 CRD,但我的用例只涉及查看注释。
我正在寻找创建一个自定义 Kubernetes 控制器;在这种情况下,我的意思是控制器,因为我不想创建 CRD,因此,不是操作员。基本上,它类似于外部 DNS项目,因为它监视注释,并根据该注释的存在/不存在采取行动。
有这样的简单例子吗?我找到的大部分资源都是用于操作员和创建 CRD,但我的用例只涉及查看注释。
我知道这是一个老问题,但对于任何有兴趣的人来说,这里有一个没有 CRD 的简单运算符:https ://github.com/busser/label-operator
此运算符仅使用 Pod 类型:
// SetupWithManager sets up the controller with the Manager.
func (r *PodReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&corev1.Pod{}). // <<< here
Complete(r)
}
检查 pod 上是否有标签,并在必要时进行更改:
labelShouldBePresent := pod.Annotations[addPodNameLabelAnnotation] == "true"
labelIsPresent := pod.Labels[podNameLabel] == pod.Name
if labelShouldBePresent == labelIsPresent {
// The desired state and actual state of the Pod are the same.
// No further action is required by the operator at this moment.
log.Info("no update required")
return ctrl.Result{}, nil
}
if labelShouldBePresent {
// If the label should be set but is not, set it.
if pod.Labels == nil {
pod.Labels = make(map[string]string)
}
pod.Labels[podNameLabel] = pod.Name
log.Info("adding label")
} else {
// If the label should not be set but is, remove it.
delete(pod.Labels, podNameLabel)
log.Info("removing label")
}
我希望我在某种程度上有所帮助。