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 :
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 :
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
!