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