Au cours de vos développements avec un opérateur Kubernetes, vous êtes peut être tombé sur cette erreur en voulant chercher des objets sur un champ particulier.
can not retrieve list of objects using index : Index with name [field path] does not exist
Qu'est-ce qui cause ce problème?
De ce que j'ai pu voir, par défaut les champs qui sont indexés sont ceux qui sont constamment présents comme les champs obligatoires de votre spec.
Par conséquent dès que vous voulez ajouter un filtre sur un autre champ, il y a de grandes chances que vous obteniez l'erreur évoquée précédemment.
Comment résoudre ce problème?
Pour résoudre ce problème, vous pouvez déclarer un nouvel index via votre instance du manager et de votre contexte.
Cet index va vous demander :
- le type d'objet concerné par cet indexation
- le nom de l'index (correspondant généralement au chemin vers le champ désiré)
- la fonction vous retournant la valeur associée de l'index
Exemple
package main
import (
"context"
k8sruntime "k8s.io/apimachinery/pkg/runtime"
"example.com/example-operator/pkg/apis/example/v1alpha1"
"sigs.k8s.io/controller-runtime/pkg/client"
// ...
)
function main() {
// ...
cache := mgr.GetCache()
indexFunc := func(obj client.Object) []string {
return []string{obj.(*v1alpha1.Example).Spec.SomeField}
}
if err := cache.IndexField(ctx, &v1alpha1.Example{}, "spec.someField", indexFunc); err != nil {
panic(err)
}
// ...
}
Par conséquent, bien que ça soit généralement utilisé pour exposer un champ supplémentaire, vous pouvez créer un index qui renverra une valeur dynamique. (Ce qui peut toujours être utile dans certains cas)
J'espère que ça vous aidera et si jamais vous avez des questions, quelles qu'elles soient (Il n'y a jamais de questions bêtes!) ou des points qui ne sont pas clairs pour vous, n'hésitez pas à laisser un message dans les commentaires ou à me joindre directement sur LinkedIn (même pour parler d'autres sujets!).
Top comments (0)