|
| 1 | +--- |
| 2 | +title: Accéder à l'API de Kubernetes depuis un Pod |
| 3 | +content_type: task |
| 4 | +weight: 120 |
| 5 | +--- |
| 6 | + |
| 7 | +<!-- overview --> |
| 8 | + |
| 9 | +Ce guide explique comment accéder à l'API de Kubernetes depuis un Pod. |
| 10 | + |
| 11 | +## {{% heading "prerequisites" %}} |
| 12 | + |
| 13 | +{{< include "task-tutorial-prereqs.md" >}} |
| 14 | + |
| 15 | +<!-- steps --> |
| 16 | + |
| 17 | +## Accéder à l'API depuis un Pod |
| 18 | + |
| 19 | +Lorsque l'on veut accéder à l'API depuis un Pod, localiser et s'authentifier |
| 20 | +auprès du serveur API se passe différement que dans le cas d'un client externe. |
| 21 | + |
| 22 | +Le moyen le plus simple pour interagir avec l'API Kubernetes depuis un Pod est d'utiliser l'une des |
| 23 | +[librairies clientes](/docs/reference/using-api/client-libraries/) officielles. |
| 24 | +Ces bibliothèques peuvent automatiquement découvrir le serveur API et s'authentifier. |
| 25 | + |
| 26 | +### Utilisation des clients officiels |
| 27 | + |
| 28 | +Depuis un Pod, les moyens recommandés pour se connecter à l'API Kubernetes sont: |
| 29 | + |
| 30 | +- Pour un client Go, utilisez la bibliothèque client officielle |
| 31 | + [Go](https://github.com/kubernetes/client-go/). |
| 32 | + La fonction `rest.InClusterConfig()` gère automatiquement |
| 33 | + la découverte de l'hôte API et l'authentification. |
| 34 | + Voir [un exemple ici](https://git.k8s.io/client-go/examples/in-cluster-client-configuration/main.go). |
| 35 | + |
| 36 | +- Pour un client Python, utilisez la bibliothèque client officielle |
| 37 | + [Python](https://github.com/kubernetes-client/python/). |
| 38 | + La fonction `config.load_incluster_config()` gère automatiquement |
| 39 | + la découverte de l'hôte API et l'authentification. |
| 40 | + Voir [un exemple ici](https://github.com/kubernetes-client/python/blob/master/examples/in_cluster_config.py). |
| 41 | + |
| 42 | +- Il existe d'autres bibliothèques disponibles, vous pouvez vous référer à la page |
| 43 | + [Bibliothèques clientes](/docs/reference/using-api/client-libraries/). |
| 44 | + |
| 45 | +Dans tous les cas, les informations d'identification du compte de service du Pod seront utilisées pour communiquer avec le serveur API. |
| 46 | + |
| 47 | +### Accès direct à l'API REST |
| 48 | + |
| 49 | +En s'exécutant dans un Pod, votre conteneur peut créer une URL HTTPS |
| 50 | +pour le serveur API Kubernetes en récupérant les variables d'environnement |
| 51 | +`KUBERNETES_SERVICE_HOST` et `KUBERNETES_SERVICE_PORT_HTTPS`. |
| 52 | +L'adresse du serveur API dans le cluster est également publiée |
| 53 | +dans un Service nommé `kubernetes` dans le namespace `default` |
| 54 | +afin que les pods puissent référencer |
| 55 | +`kubernetes.default.svc` comme nom DNS pour le serveur API. |
| 56 | + |
| 57 | +{{< note >}} |
| 58 | +Kubernetes ne garantit pas que le serveur API dispose d'un certificat valide |
| 59 | +pour le nom d'hôte `kubernetes.default.svc`; |
| 60 | +cependant, le plan de contrôle **doit** présenter un certificat valide |
| 61 | +pour le nom d'hôte ou l'adresse IP que `$KUBERNETES_SERVICE_HOST` représente. |
| 62 | +{{< /note >}} |
| 63 | + |
| 64 | +La manière recommandée pour s'authentifier auprès du serveur API |
| 65 | +est d'utiliser les identifiants d'un |
| 66 | +[compte de service](/docs/tasks/configure-pod-container/configure-service-account/). |
| 67 | +Par défaut, un Pod est associé à un compte de service, |
| 68 | +et un identifiant pour ce compte de service est placé |
| 69 | +dans le système de fichiers de chaque conteneur dans ce Pod, |
| 70 | +dans `/var/run/secrets/kubernetes.io/serviceaccount/token`. |
| 71 | + |
| 72 | +Si disponible, un lot de certificats est placé dans le système de fichiers de chaque conteneur dans `/var/run/secrets/kubernetes.io/serviceaccount/ca.crt` |
| 73 | +et doit être utilisé pour vérifier le certificat du serveur API. |
| 74 | + |
| 75 | +Enfin, le namespace courant dans lequel est déployé le Pod est |
| 76 | +placé dans un fichier `/var/run/secrets/kubernetes.io/serviceaccount/namespace` dans chaque container. |
| 77 | + |
| 78 | +### Avec utilisation du proxy kubectl |
| 79 | + |
| 80 | +Si vous souhaitez interroger l'API sans utiliser de bibliothèque client officielle, |
| 81 | +vous pouvez exécuter `kubectl proxy` en tant que |
| 82 | +[commande](/docs/tasks/inject-data-application/define-command-argument-container/) |
| 83 | +d'un nouveau conteneur sidecar dans le Pod. |
| 84 | +De cette manière, `kubectl proxy` s'authentifiera auprès de l'API |
| 85 | +et l'exposera sur l'interface `localhost` du Pod, |
| 86 | +de sorte que les autres conteneurs dans le Pod puissent l'utiliser directement. |
| 87 | + |
| 88 | +### Sans utiliser de proxy |
| 89 | + |
| 90 | +Il est possible d'éviter l'utilisation du proxy kubectl en passant |
| 91 | +directement les informations d'authentification au serveur API. |
| 92 | +Le certificat interne sécurise la connexion. |
| 93 | + |
| 94 | +```shell |
| 95 | +# Pointe vers le nom d'hôte interne du serveur API. |
| 96 | +APISERVER=https://kubernetes.default.svc |
| 97 | + |
| 98 | +# Chemin du token pour le compte de service |
| 99 | +SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount |
| 100 | + |
| 101 | +# Lire le namespace du Pod |
| 102 | +NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace) |
| 103 | + |
| 104 | +# Lire le token du compte de service |
| 105 | +TOKEN=$(cat ${SERVICEACCOUNT}/token) |
| 106 | + |
| 107 | +# Référence l'authorité de certificat interne |
| 108 | +CACERT=${SERVICEACCOUNT}/ca.crt |
| 109 | + |
| 110 | +# Accéder à l'API avec le token |
| 111 | +curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api |
| 112 | +``` |
| 113 | + |
| 114 | +Le résultat sera similaire à: |
| 115 | + |
| 116 | +```json |
| 117 | +{ |
| 118 | + "kind": "APIVersions", |
| 119 | + "versions": ["v1"], |
| 120 | + "serverAddressByClientCIDRs": [ |
| 121 | + { |
| 122 | + "clientCIDR": "0.0.0.0/0", |
| 123 | + "serverAddress": "10.0.1.149:443" |
| 124 | + } |
| 125 | + ] |
| 126 | +} |
| 127 | +``` |
0 commit comments