0

我正在寻找创建一个自定义 Kubernetes 控制器;在这种情况下,我的意思是控制器,因为我不想创建 CRD,因此,不是操作员。基本上,它类似于外部 DNS项目,因为它监视注释,并根据该注释的存在/不存在采取行动。

有这样的简单例子吗?我找到的大部分资源都是用于操作员和创建 CRD,但我的用例只涉及查看注释。

4

1 回答 1

0

我知道这是一个老问题,但对于任何有兴趣的人来说,这里有一个没有 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")
}

我希望我在某种程度上有所帮助。

于 2022-01-20T15:55:15.547 回答