Оператор 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")
}

Я надеюсь, что я помог в некотором роде.

Другие вопросы по тегам