Requêter l'API de Kubernetes

Requêter l'API de Kubernetes

En utilisant les commandes Kubernetes d'administration avec l'outil en ligne de commande kubectl, revient à interroger une API à l'aide de ce client là. Regardons dans cet article comment interroger l'API de Kubernetes sans utiliser le client kubectl.

Introduction

Tout comme Docker, Kubernetes fournit une API REST avec laquelle il est possible d’interagir avec un simple client HTTP.
Pour suivre mon article sur le sujet que j'ai rédigé pour Docker :

Requêter l’API du Docker Engine
Lorsque nous utilisons les commandes Docker, en réalité, il s’agit tout simplement d’un client qui interroge une API. Regardons dans cet article comment interroger l’API du Docker Engine sans utiliser le client Docker. Introduction Nous le savons, l’architecture de Docker est un peu complexe aux…

Rappelons brièvement l'architecture de Kubernetes :

On peut voir que c'est bien le client kubectl qui intéragit avec l'API REST de Kubernetes.

L'authentification

Pour pouvoir s'authentifier auprès d'un cluster Kubernetes, il existe plusieurs méthodes. La plus courante est l'utilisation du fichier .kubeconfig.
Voici à quoi peut ressembler son contenu :

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: HOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeE1URXlPREEzTlRrd05Wb1hEVE14TVRFeU9EQTNOVGt3TlZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTUlJCmR2aHVaWGlDbUtnZmxCS05Va1NsUjVhd0tZNUJwOTk3aytwdFdsbGoySTdIQ3c0WnVQekF5Z3Fram01aU9FeFgKajc5TnAxNVJrQ2puQit3L0I1VDZGNzE2WXA3ejl5a29uQlVqRXlnSHRXbHlvVkZSQmM0TGUrbE1IM0pXMWk3ZgovRFhEZWxYK0pCS09uQ3VnbzdkdndUQ09NWG1WZktxMENyVDdJZktJSFlRaHdnczBvLzI1WnpPS1c1UlNSTXJtCnlIV1Y5bFZVNHBPTEpCTU5xNjNQM3N2NDl1bUtLZmVJaCtScVpwMXpvK1BKMzhrT3RSYk55QXA2dXE4Q2gyL1gKWW1UdDdWK1Q4NnFxMTZmdUdxNEZlsdqO923UJDSTTBFVGdZR0VQVU5tYnA5M0U3Qk8rOWcxQUxpRkx5dHUzUG5zZmREanZUlWd084Q1hqbkwwbDdVdFYyNTdqbEU2QlpWSFgzUQpyZStDakpPMlZEd29IbmxtbFhMcnRrV0Racm1TNUZwRTNQR0trNXlPRXA0d2NsSFkxWnRPOTJkM29TNnlGbGR6CitDLzNKRXhXaXo4OU92QkpCYXBtdHZHc2tLRFFsMEIyVy9lUzVVTzhDeHB4em1SNVN3dlR5ZXBZeEtRR2pOc0QKZ1A2Ty9JcGM2Z01oakY1NFhLYk0wZjhyVnBJUkNWTnFkcEhaMkEvb1pWMjNDS0NOOGp3SHg4L3Q0d3JKYUlzLwpOL1QzUk5Cd1lMN2t0V1pxdDRFTGYzOGJwOTNITHF4T0syWnIysErxzeGFVZndIZ2VOWHNxakJIdXpRUHZ==
    server: https://mon-cluster-kube.com:6443
  name: mon-cluster
contexts:
- context:
    cluster: mon-cluster
    user: user@mon-cluster-mon-namespace-token-user
  name: mon-namespace
current-context: mon-namespace
kind: Config
preferences: {}
users:
- name: user@mon-cluster-mon-namespace-token-user
  user:
    token: eyJhbGciOiJSUzI1NiIsImtpZCI6Ik5aNHhHY2ZHR240U2ZvWjN1UEZHVDh5NmIyWlJDd1ZEaDV2MjVIQXhnQ0kifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJzeW5vbGlhLWF3eC12YWwiLCJrdWJlcm5sdiafunn8384UJKShb1ckscj_-sryYNPfi93GwNcGaSbptBbWR4ZfoWF3af_5uayXbwwM44LRnmkU2B7ZWdrYLFmXrTqApElPpmyDqj8sd282qYN0rqyI-63M_8NDv1qw0UqZfBzf1ruGbamma6w13U_kySC5csmyO9ziOsaP9i3sE_vDli8H7a1eZN9JRJ364DYo3YOyzJjpBunPJuGpYrwH8XI2gklLM

Ce fichier contient beaucoup d'informations et ce qui nous intéresse est le token. Il s'agit d'un token JWT que nous allons injecter dans les headers de nos requêtes API en tant que Bearer Token.

Il est possible de connaître la configuration de son cluster Kubernetes avec la commande kubectl suivante :

kubectl config view --kubeconfig

Ou bien d'afficher le contenu de son fichier .kubeconfig tout simplement.

Les Pods

Pour lister les pods Kubernetes en cours d'exécution :

curl -k -X GET \
  -H "Authorization: Bearer <YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  https://your-kubernetes-api-server/api/v1/namespaces/<NAMESPACE>/pods
Voici l'équivalent avec  kubectl :
kubectl get pods -n MON-NAMESPACE --kubeconfig ~/.kube/MON-KUBECONFIG

Les Namespaces

Pour lister les namespaces présents au sein d'un cluster Kubernetes en requêtant l'API :

curl -k -X GET \
  -H "Authorization: Bearer <YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  https://your-kubernetes-api-server/api/v1/namespaces
Voici l'équivalent avec kubectl :
kubectl get ns --kubeconfig ~/.kube/MON-KUBECONFIG

Les Deployments

Pour lister les Deployments présents au sein d'un cluster Kubernetes en requêtant l'API :

curl -k -X GET \
  -H "Authorization: Bearer <YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  https://your-kubernetes-api-server/apis/apps/v1/deployments
Voici l'équivalent avec kubectl :
kubectl get deploy --kubeconfig ~/.kube/MON-KUBECONFIG

Pour créer un Déployment avec un appel API en utilisant cURL :

curl -X POST \
  -H "Authorization: Bearer <your_token>" \
  -H "Content-Type: application/json" \
  -d @deployment.yaml \
  https://your-kubernetes-api-server/apis/apps/v1/namespaces/<namespace>/deployments
Voici l'équivalent avec kubectl :
kubectl create -f deployment.yaml -n namespace --kubeconfig ~/.kube/MON-KUBECONFIG

Les SDKs

Il est aussi possible de requêter l'API de Kubernetes autrement qu'avec cURL ou un tout autre client HTTP, regardons comment le faire avec un module Python.

Voici le repository Github du client Kubernetes pour Python :

GitHub - kubernetes-client/python: Official Python client library for kubernetes
Official Python client library for kubernetes. Contribute to kubernetes-client/python development by creating an account on GitHub.

Pour lister les Pods en langage Python en utilisation le module kubernetes, on fera ceci :

from kubernetes import client, config

# Configs can be set in Configuration class directly or using helper utility
config.load_kube_config()

v1 = client.CoreV1Api()
print("Listing pods with their IPs:")
ret = v1.list_pod_for_all_namespaces(watch=False)
for i in ret.items:
    print("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))

Il est donc parfois utile de requêter l'API de Kubernetes autrement qu'avec le client kubectl !