Comment accéder à l'API de votre cluster Kubernetes depuis vos pods

0
63

L'API Kubernetes vous permet d'inspecter et de gérer les opérations de votre cluster. Vous pouvez utiliser l'API à l'aide de la CLI Kubectl, d'outils tels que curl ou des bibliothèques d'intégration officielles pour les langages de programmation courants.

L'API est également disponible pour les applications de votre cluster. Les pods Kubernetes ont automatiquement accès à l'API et peuvent s'authentifier à l'aide d'un compte de service fourni. Vous effectuez des interactions en consommant les variables d'environnement et les fichiers de certificat injectés pour établir des connexions à partir du client de votre choix.

Pourquoi accéder à l'API Kubernetes dans Pods ?

Il existe plusieurs cas d'utilisation pour l'accès à l'API in-Pod. Cette technique permet aux applications d'inspecter dynamiquement leur environnement, d'appliquer les modifications Kubernetes et de collecter des métriques de plan de contrôle qui fournissent des informations sur les performances.

Certaines organisations développent leurs propres outils autour de Kubernetes. Ils peuvent déployer une application spéciale dans le cluster qui utilise l'API pour exposer des fonctionnalités supplémentaires. Opérer à partir du cluster peut être plus sûr que d'effectuer des appels d'API à partir d'un script externe, car vous n'avez pas besoin d'ouvrir votre environnement ou de partager des comptes de service et des jetons d'authentification.

Utilisation des bibliothèques clientes de l'API

La méthode la plus simple et recommandée pour accéder à l'API Kubernetes à partir d'un pod consiste à utiliser une bibliothèque cliente. Des options entièrement prises en charge sont disponibles pour C, .NET, Go, Haskell, Java, JavaScript, Perl, Python et Ruby. Il existe des solutions équivalentes gérées par la communauté pour la plupart des autres langages de programmation populaires.

Les bibliothèques clientes ont une prise en charge intégrée pour découvrir l'environnement de cluster dans lequel elles s'exécutent. Chaque implémentation fournit une fonction que vous pouvez appeler et qui configurera la bibliothèque pour se connecter au bon serveur d'API.

Ici& #8217;s un exemple de la façon de répertorier les pods de votre cluster dans une application Python :

depuis kubernetes import client, config   config.load_incluster_config()   api = client.CoreV1Api()   # Effectuer les interactions API nécessaires # pods = api.list_pod_for_all_namespaces()

Cette approche est facile à utiliser et ne nécessite aucune configuration manuelle. Parfois, vous ne pourrez pas utiliser une bibliothèque cliente. Dans ces cas, il est toujours possible d'accéder manuellement à l'API à l'aide du compte de service fourni par Kubernetes.

Effectuer des interactions manuelles avec l'API

< p>Pour appeler l'API, vous devez connaître deux choses : le nom d'hôte du cluster sur lequel il est exposé et le jeton de compte de service qui authentifiera votre pod.

Le nom d'hôte de l'API est toujours kubernetes.default.svc. Le fournisseur DNS Kubernetes résoudra ce nom sur le serveur d'API du plan de contrôle. Vous pouvez également utiliser la variable d'environnement $KUBERNETES_SERVICE_HOST pour découvrir l'adresse IP du serveur API :

$ echo $KUBERNETES_SERVICE_HOST 10.96.0.1

L'API est uniquement disponible via HTTPS. Vous pouvez trouver le fichier d'autorité de certification pour votre cluster sur /var/run/secrets/kubernetes.io/serviceaccount/ca.crt dans votre pod. Kubernetes le dépose dans le système de fichiers chaque fois qu'un nouveau conteneur est créé.

Vous devrez vous authentifier pour obtenir quoi que ce soit d'utile avec l'API. Kubernetes crée un nouveau compte de service pour chaque pod et fournit son jeton à l'adresse /var/run/secrets/kubernetes.io/serviceaccount/token. Cela doit être inclus avec chaque requête HTTP en tant que jeton de support dans l'en-tête d'autorisation.

En mettant tout ensemble, voici un exemple de création d'une requête d'API Kubernetes dans le pod de base à l'aide de curl :

$ curl –cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H “Autorisation : Porteur $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)” https : //kubernetes.default.svc/api { “kind”: “APIVersions”, “versions”: [ “v1” ], “serverAddressByClientCIDRs”: [ { “clientCIDR”: “0.0.0.0/0”, “serverAddress”: “192.168.49.2:8443” } ]

Le serveur Kubernetes a répondu avec les versions d'API disponibles. Cela confirme qu'une connexion réussie a été établie à l'aide du nom d'hôte kubernetes.default.svc et du compte de service fourni.

Gestion du RBAC

Bien qu'une demande d'API ait été effectuée avec succès, la plupart des autres seront hors limites si RBAC est activé pour votre cluster. Les comptes de service nouvellement créés ne reçoivent pas automatiquement les rôles. Votre pod ne pourra donc pas demander des points de terminaison d'API protégés.

Vous pouvez résoudre ce problème en créant vos propres objets Rôle et en les liant au compte de service fourni à vos pods. Créez d'abord un nouveau rôle :

apiVersion : rbac.authorization.k8s.io/v1 type : Métadonnées de rôle : espace de noms : nom par défaut : < /strong>demo-rolerègles : – apiGroups : [“"]ressources : ["pods" ] verbes : ["obtenir", "liste"& #93 ;

Appliquez-le à votre cluster avec Kubectl :

$ kubectl apply -f role.yaml

Liez ensuite le rôle au compte de service :

apiVersion : rbac.authorization.k8s.io/v1 genre : RoleBinding métadonnées : espace de noms : nom par défaut : demo-role-binding sujets : – genre : ServiceAccount nom : default apiGroup : "" roleRef : genre : Nom du rôle : demo-roleapiGroup< /strong> : ""

Le compte de service par défaut est sélectionné comme sujet de la liaison de rôle. Les pods sont toujours fournis avec ce compte de service, limité à l'espace de noms dans lequel ils ont été créés. Dans cet exemple, l'espace de noms par défaut est utilisé, mais cela doit être modifié sur les objets Role et RoleBinding si votre pod existe dans un espace de noms différent.

Ajoutez le RoleBinding à votre cluster :

$ kubectl apply -f role-binding.yaml

Désormais, vos pods seront autorisés à obtenir et à répertorier d'autres objets pod dans l'espace de noms par défaut. Vous pouvez le vérifier en envoyant une requête API au point de terminaison des pods avec espace de noms :

$ curl –cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H “Authorization: Bearer $( cat /var/run/secrets/kubernetes.io/serviceaccount/token)” https://kubernetes.default.svc/api/v1/namespaces/default/pods { “kind”: “PodList”, “apiVersion”: ” v1″ … }

Les pods peuvent identifier leur propre espace de noms en lisant le fichier /var/run/secrets/kubernetes.io/serviceaccount/namespace :

$ cat /var/run/secrets/kubernetes.io/serviceaccount/namespace default

Cela fournit une méthode pratique pour interpoler l'espace de noms actif dans les URL de point de terminaison :

$ curl –cacert /var/run/secrets /kubernetes.io/serviceaccount/ca.crt -H “Autorisation : Porteur $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)” https://kubernetes.default.svc/api/v1/espaces de noms/$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)/pods { “kind”: “PodList”, “apiVersion”: “v1” … }

Choisir un compte de service différent

Kubernetes fournit automatiquement aux pods le compte de service par défaut dans leur espace de noms. Vous pouvez éventuellement injecter un compte de service différent à la place en définissant le champ spec.serviceAccountName sur vos pods :

apiVersion : v1genre : podmétadonnées : nom: demo spec : serviceAccountName : demo-sa < p>Dans cet exemple, le Pod s'authentifiera en tant que jeton demo-sa. Vous pouvez créer ce compte de service manuellement et lui associer les rôles dont vous avez besoin.

$ kubernetes create serviceaccount demo-sa

Le compte de service doit exister dans le même espace de noms que le pod.

Désactivation du montage du compte de service

L'injection automatique de compte de service n'est pas toujours souhaitable. Cela peut constituer un risque pour la sécurité, car une compromission réussie du pod offre un accès immédiat à l'API de votre cluster Kubernetes. Vous pouvez désactiver les montages de jetons de compte de service avec le champ manifeste du pod spec.automountServiceAccountToken :

apiVersion : v1 type : pod métadonnées :nom : démospécification :automountServiceAccountToken : faux

Kubernetes n'injectera pas le fichier /var/run/secrets/kubernetes.io/serviceaccount/token. Cela empêchera le pod de s'authentifier auprès de l'API Kubernetes, sauf si vous fournissez manuellement les informations d'identification à l'aide d'une méthode différente. Ce champ est également pris en charge sur les objets de compte de service, ce qui les rend inéligibles pour être montés automatiquement dans n'importe quel pod.

Si vous utilisez le montage de compte de service, définissez des politiques RBAC appropriées pour restreindre le jeton à vos cas d'utilisation prévus . Éviter les accès hautement privilégiés réduira le risque de dommages si un attaquant accède à votre pod.

Résumé

Accéder au serveur d'API Kubernetes depuis votre cluster permet d'exécuter les applications inspectent et modifient les charges de travail voisines. Vous pouvez ajouter des fonctionnalités supplémentaires sans ouvrir votre cluster à un accès API externe.

Les bibliothèques clientes officielles facilitent la mise en place et l'exécution, si elles conviennent à votre cas d'utilisation. Dans d'autres situations, vous devrez adresser manuellement des requêtes à https://kubernetes.default.svc, en fournissant le fichier d'autorité de certification et le jeton de compte de service que Kubernetes injecte dans vos conteneurs Pod. Quelle que soit l'approche que vous utilisez, le compte de service doit être correctement configuré avec les liaisons de rôle RBAC afin que le pod soit autorisé à effectuer les actions prévues.

LIRE LA SUITE

  • &rsaquo ; Qu'est-ce que DLSS 3 et pouvez-vous l'utiliser sur du matériel existant ?
  • › Notre manette préférée pour les jeux sur PC ne coûte que 45 $ aujourd'hui
  • &rsaquo ; La NASA et SpaceX veulent donner un coup de pouce au télescope Hubble
  • &rsaquo ; Qu'est-ce que le “clic de la mort” ? dans un disque dur, et que devez-vous faire ?
  • › Le concurrent RTX 3060 d'Intel coûte moins de 300 $
  • › Spotify ou Audible : lequel est le meilleur pour les livres audio ?