3 votes

Définir ObjectMeta sur la ressource Istio- avec go-client

J'essaie de travailler avec Istio à partir de Go, et nous utilisons Kubernetes et le code go-client d'Istio.

Le problème que je rencontre est que je ne peux pas spécifier ObjectMeta o TypeMeta dans mon Istio- ServiceRole objet. Je peux seulement spécifier rules qui se trouvent à l'intérieur de la spec .

Vous pouvez voir ci-dessous ce que j'ai réussi à faire fonctionner :

import (
    v1alpha1 "istio.io/api/rbac/v1alpha1"
)

func getDefaultServiceRole(app nais.Application) *v1alpha1.ServiceRole {
    return &v1alpha1.ServiceRole{
        Rules: []*v1alpha1.AccessRule{
            {
                Ports: []int32{2},
            },
        },
    }
}

Ce que je voudrais faire, c'est que ce code fonctionne :

func getDefaultServiceRole(app *nais.Application) *v1alpha1.ServiceRole {
    return &v1alpha1.ServiceRole{
        TypeMeta: metav1.TypeMeta{
            Kind:       "ServiceRole",
            APIVersion: "v1alpha1",
        },
        ObjectMeta: metav1.ObjectMeta{
            Name:      app.Name,
            Namespace: app.Namespace,
        },
        Spec: v1alpha1.ServiceRole{
            Rules: []*v1alpha1.AccessRule{
                {
                    Ports: []int32{2},
                },
            },
        },
    },
}

Quelqu'un peut-il m'indiquer la bonne direction ?

4voto

Zack Butcher Points 706

Ah - c'est un point assez douloureux : Istio a besoin des métadonnées du wrapper CRD de Kubernetes (principalement l'élément name y namespace ), mais ces champs ne font pas partie des objets de l'API eux-mêmes et ne sont pas représentés dans les protos. (Ceci est en train de changer avec la nouvelle API MCP pour la configuration des composants - que Galley utilise -). encode ces champs comme des protobufs mais cela n'est pas utile pour votre cas d'utilisation). Au lieu de cela, vous devriez utiliser les types dans istio.io/istio/pilot/pkg/config/kube/crd qui mettent en œuvre l'interface CRD de K8s.

La manière la plus simple de travailler avec les objets Istio dans golang est d'utiliser les bibliothèques de Pilot, en particulier le module istio.io/istio/pilot/pkg/model y istio.io/istio/pilot/pkg/config/kube/crd ainsi que les paquets model.Config struct. Vous pouvez soit passer autour de la structure complète model.Config (pas génial car spec a un type proto.Message vous avez donc besoin d'assertions de type pour extraire les données qui vous intéressent), ou faire circuler l'objet interne en l'enveloppant dans un fichier de type model.Config avant de le pousser. Vous pouvez utiliser le model.ProtoSchema pour faciliter la conversion de et vers YAML et JSON. Le pilote ne définit que ProtoSchema objets pour l'API de mise en réseau le type est public et vous pouvez en créer pour des types arbitraires.

Donc, en utilisant votre exemple de code, je pourrais essayer quelque chose comme :

import (
    v1alpha1 "istio.io/api/rbac/v1alpha1"
   "istio.io/istio/pilot/pkg/model"
)

func getDefaultServiceRole() *v1alpha1.ServiceRole {
    return &v1alpha1.ServiceRole{
        Rules: []*v1alpha1.AccessRule{
            {
                Ports: []int32{2},
            },
        },
    }
}

func toConfig(app *nais.Application, role *v1alpha1.ServiceRole) model.Config {
    return &model.Config{
        ConfigMeta: model.ConfigMeta{
            Name:      app.Name,
            Namespace: app.Namespace,
        },
        Spec: app,
    }
}

type Client model.ConfigStore
func (c Client) CreateRoleFor(app nais.Application, role *v1alpha1.ServiceRole) error {
    cfg := toConfig(app, role)
    _, err := c.Create(cfg)
    return err
}

Pour un exemple plus complet, nous avons construit l'opérateur Istio CloudMap dans ce style. Voici l'essentiel de ce qui pousse la configuration vers les K8 avec les bibliothèques Pilot. Voici l'incantation pour créer une instance de model.ConfigStore à utiliser pour créer des objets . Enfin, je tiens à rappeler explicitement que cela n'est qu'implicite dans l'exemple : lorsque vous appelez Create sur le model.ConfigStore le ConfigStore s'appuie sur les métadonnées de la ProtoSchema les objets utilisés pour le créer. Veillez donc à initialiser le magasin avec ProtoSchema pour tous les types d'objets avec lesquels vous allez travailler.


Vous pouvez réaliser la même chose en utilisant uniquement les bibliothèques clientes de K8s et le programme istio.io/istio/pilot/pkg/config/kube/crd mais je ne l'ai pas fait moi-même et je n'ai pas d'exemples sous la main.

4voto

user13245577 Points 31

Istio prend désormais en charge :

import (
    istiov1alpha3 "istio.io/api/networking/v1alpha3"
    istiogov1alpha3 "istio.io/client-go/pkg/apis/networking/v1alpha3"
)

VirtualService := istiogov1alpha3.VirtualService{
        TypeMeta:   metav1.TypeMeta{
            Kind: "VirtualService",
            APIVersion: "networking.istio.io/v1alpha3",
        },
        ObjectMeta: metav1.ObjectMeta{
            Name: "my-name",
        },
        Spec:       istiov1alpha3.VirtualService{},
}

Donde istiov1alpha3.VirtualService{} est un objet istio.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X