Оператор Kubernetes без CRD
Я ищу создать собственный контроллер Kubernetes; Я имею в виду контроллер в этом случае, потому что я не собираюсь создавать CRD и, следовательно, не являюсь оператором. По сути, он будет похож на проект External DNS в том, что он отслеживает аннотации и выполняет действия на основе наличия / отсутствия этой аннотации.
Есть ли простой пример чего-то подобного? Большинство ресурсов, которые я нахожу, предназначены для операторов и создания CRD, но мой вариант использования включает только просмотр аннотации.
1 ответ
Я знаю, что это старый вопрос, но для всех, кто заинтересован, вот простой оператор без 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)
}
Проверяет, есть ли на поде метка и при необходимости меняет ее:
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")
}
Я надеюсь, что я помог в некотором роде.