Aller au contenu principal

Chapitre 9.2 - Service Accounts

Objectifs d'Apprentissage​

À la fin de ce chapitre, vous serez capable de:

  • Comprendre ce qu'est un Service Account
  • Créer et utiliser des Service Accounts
  • Lier des Service Accounts à des Pods
  • Comprendre les tokens et secrets
  • Gérer les permissions avec RBAC
  • Utiliser des Service Accounts pour l'accès API

Introduction​

Un Service Account fournit une identité pour les Pods qui s'exécutent dans le cluster. Il permet aux applications d'interagir avec l'API Kubernetes de manière sécurisée.


Qu'est-ce qu'un Service Account?​

Un Service Account est une identité Kubernetes utilisée par les Pods pour:

  • S'authentifier auprès de l'API Kubernetes
  • Accéder aux ressources selon les permissions RBAC
  • Interagir avec d'autres services dans le cluster

Par défaut: Chaque namespace a un Service Account default.


Création d'un Service Account​

Service Account Basique​

apiVersion: v1
kind: ServiceAccount
metadata:
name: my-app-sa
namespace: default

Service Account avec Annotations​

apiVersion: v1
kind: ServiceAccount
metadata:
name: my-app-sa
namespace: default
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/my-role

Utilisation dans un Pod​

Spécifier le Service Account​

apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
serviceAccountName: my-app-sa
containers:
- name: app
image: my-app:1.0

Résultat: Le Pod utilise my-app-sa au lieu du Service Account par défaut.

Service Account Automatique​

Si serviceAccountName n'est pas spécifié, le Pod utilise le Service Account default du namespace.


Tokens et Secrets​

Token Automatique​

Kubernetes crée automatiquement un token (Secret) pour chaque Service Account:

# Voir les secrets créés automatiquement
kubectl get secrets | grep my-app-sa

# Détails du token
kubectl describe secret my-app-sa-token-xxxxx

Montage du Token​

Le token est automatiquement monté dans le Pod à /var/run/secrets/kubernetes.io/serviceaccount/:

# Dans le Pod
cat /var/run/secrets/kubernetes.io/serviceaccount/token
cat /var/run/secrets/kubernetes.io/serviceaccount/namespace
cat /var/run/secrets/kubernetes.io/serviceaccount/ca.crt

Permissions RBAC​

Lier un Service Account à un Role​

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: app-role-binding
namespace: default
subjects:
- kind: ServiceAccount
name: my-app-sa
namespace: default
roleRef:
kind: Role
name: app-role
apiGroup: rbac.authorization.k8s.io

Exemple Complet​

Étape 1: Créer le Service Account

apiVersion: v1
kind: ServiceAccount
metadata:
name: pod-reader-sa
namespace: default

Étape 2: Créer le Role

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]

Étape 3: Créer le RoleBinding

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-reader-binding
namespace: default
subjects:
- kind: ServiceAccount
name: pod-reader-sa
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io

Étape 4: Utiliser dans un Pod

apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
serviceAccountName: pod-reader-sa
containers:
- name: app
image: my-app:1.0

Résultat: Le Pod peut lire les Pods dans le namespace default.


Accès à l'API Kubernetes​

Utiliser le Token dans l'Application​

import os
import requests

# Lire le token
with open('/var/run/secrets/kubernetes.io/serviceaccount/token', 'r') as f:
token = f.read().strip()

# Lire le namespace
with open('/var/run/secrets/kubernetes.io/serviceaccount/namespace', 'r') as f:
namespace = f.read().strip()

# Appel API
api_url = f"https://kubernetes.default.svc/api/v1/namespaces/{namespace}/pods"
headers = {
'Authorization': f'Bearer {token}',
'Content-Type': 'application/json'
}

response = requests.get(api_url, headers=headers, verify='/var/run/secrets/kubernetes.io/serviceaccount/ca.crt')
print(response.json())

Image Pull Secrets​

Les Service Accounts peuvent avoir des imagePullSecrets pour accéder aux registres Docker privés:

apiVersion: v1
kind: ServiceAccount
metadata:
name: private-registry-sa
namespace: default
imagePullSecrets:
- name: regcred

Résultat: Tous les Pods utilisant ce Service Account peuvent pull des images du registre privé.


Service Account par Défaut​

Désactiver le Montage Automatique​

apiVersion: v1
kind: ServiceAccount
metadata:
name: no-token-sa
namespace: default
automountServiceAccountToken: false

Résultat: Le token n'est pas monté dans les Pods utilisant ce Service Account.

Au Niveau du Pod​

apiVersion: v1
kind: Pod
metadata:
name: no-token-pod
spec:
serviceAccountName: my-app-sa
automountServiceAccountToken: false
containers:
- name: app
image: my-app:1.0

Bonnes Pratiques​

1. Service Account par Application​

Créer un Service Account dédié pour chaque application.

2. Principe du Moindre Privilège​

Donner seulement les permissions nécessaires via RBAC.

3. Pas de Service Account par Défaut​

Éviter d'utiliser le Service Account default en production.

4. Désactiver le Token si Non Nécessaire​

Utiliser automountServiceAccountToken: false si l'application n'a pas besoin d'accéder à l'API.

5. Rotation des Tokens​

Les tokens sont automatiquement renouvelés par Kubernetes.


Commandes Utiles​

Gestion​

# Créer un Service Account
kubectl create serviceaccount my-app-sa

# Voir les Service Accounts
kubectl get serviceaccounts
kubectl get sa

# Détails
kubectl describe serviceaccount my-app-sa

# Voir les secrets associés
kubectl get secrets | grep my-app-sa

Utilisation​

# Créer un Pod avec un Service Account
kubectl run my-pod --image=my-app:1.0 --serviceaccount=my-app-sa

# Voir le token dans un Pod
kubectl exec my-pod -- cat /var/run/secrets/kubernetes.io/serviceaccount/token

Résumé​

Dans ce chapitre, vous avez appris:

Service Account: Identité pour les Pods dans Kubernetes
Création: Ressource Kubernetes simple
Utilisation: Via serviceAccountName dans les Pods
Tokens: Créés automatiquement et montés dans /var/run/secrets/kubernetes.io/serviceaccount/
RBAC: Lier des Service Accounts à des Roles pour les permissions
Accès API: Utiliser le token pour appeler l'API Kubernetes
Image Pull Secrets: Pour accéder aux registres privés
Bonnes pratiques: Service Account par application, moindre privilège


Prochaines Étapes​

Chapitre 9.3: Network Policies
Chapitre 9.4: Pod Security Standards
Lab 9.2: Service Accounts et Permissions


Chapitre créé le: Décembre 2024