2 回答
TA贡献1805条经验 获得超10个赞
根据这个github源代码,您应该能够使用EnqueueRequestForObject
. 但是,不可能(目前)只关注特定的秘密 CRUD 更改。
EnqueueRequestForObject以监视您的 CRD 资源更改。在您的 CRD 协调器中,您将使用基于搜索定义的标签选择器获取所有 TLS 机密,然后使用匹配的机密运行您的合并逻辑。
EnqueueRequestFromMapFunc以监视秘密更改并触发一个或多个 CR 的协调。在您的映射器函数中,您将获取所有 CR。对于每个具有与传递的秘密匹配的搜索定义的 CR,您将为 CR 创建一个新的 reconcile.Request,并返回请求列表,这将为每个匹配的 CR 触发您的 CRD 协调器。
最干净的方法是使用标签选择器,然后将结果与现有代码合并。这篇文章中给出了使用标签选择器的示例:
func GetSecret(version string) (retVal interface{}, err error){
clientset := GetClientOutOfCluster()
labelSelector := metav1.LabelSelector{MatchLabels: map[string]string{"version":version}}
listOptions := metav1.ListOptions{
LabelSelector: labels.Set(labelSelector.MatchLabels).String(),
Limit: 100,
}
secretList, err := clientset.CoreV1().Secrets("namespace").List(listOptions)
retVal = secretList.Items[0]
return retVal, err
}
TA贡献1829条经验 获得超13个赞
这是可能的,以一种迂回的方式。您需要将选择器配置到用于设置协调器的控制器管理器中。
您可以为此使用标签或字段选择器。您可以使用 为所有类型的对象设置相同的选择器DefaultSelector,也可以SelectorsByObject为不同类型的对象设置不同的选择器。
import (
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/selection"
"k8s.io/client-go/rest"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/cache"
"sigs.k8s.io/controller-runtime/pkg/manager"
)
func startReconciler(cnf *rest.Config) error {
mgr, err := ctrl.NewManager(cnf, manager.Options{
NewCache: func(conf *rest.Config, opts cache.Options) (cache.Cache, error) {
// Use this selector for everything that is not mentioned in SelectorsByObject
opts.DefaultSelector = cache.ObjectSelector{
Label: labels.SelectorFromSet(labels.Set{"foo": "bar"}),
}
// Specific selectors per type of object
opts.SelectorsByObject[&corev1.Secret{}] = cache.ObjectSelector{
Label: labels.SelectorFromSet(labels.Set{"foo": "bar"}),
}
return cache.New(conf, opts)
},
})
if err != nil {
return err
}
r := &InvReconciler{}
if err := r.SetupWithManager(mgr); err != nil {
return err
}
- 2 回答
- 0 关注
- 129 浏览
添加回答
举报