Saltar al contenido principal

Capítulo 9.2 - Service Accounts

Objetivos de Aprendizaje​

Al final de este capítulo, usted será capaz de:

  • Comprender qué es un Service Account
  • Crear y utilizar Service Accounts
  • Vincular Service Accounts a Pods
  • Comprender los tokens y secrets
  • Gestionar los permisos con RBAC
  • Utilizar Service Accounts para el acceso a la API

Introducción​

Una Service Account proporciona una identidad para los Pods que se ejecutan en el clúster. Permite que las aplicaciones interactúen con la API de Kubernetes de manera segura.


¿Qué es un Service Account?​

Un Service Account es una identidad de Kubernetes utilizada por los Pods para:

  • Autenticarse ante la API de Kubernetes
  • Acceder a los recursos según los permisos de RBAC
  • Interactuar con otros servicios en el clúster

Por defecto: Cada namespace tiene un Service Account default.


Creación de un Service Account​

Service Account Básico​

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

Service Account con Anotaciones​

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

Uso en un Pod​

Especificar el Service Account​

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

Resultado: El Pod utiliza my-app-sa en lugar del Service Account por defecto.

Service Account Automático​

Si no se especifica serviceAccountName, el Pod utiliza el Service Account default del namespace.


Tokens y Secrets​

Token Automático​

Kubernetes crea automáticamente un token (Secret) para cada Service Account:

# Ver los secrets creados automáticamente
kubectl get secrets | grep my-app-sa

# Detalles del token
kubectl describe secret my-app-sa-token-xxxxx

Montaje del Token​

El token se monta automáticamente en el Pod en /var/run/secrets/kubernetes.io/serviceaccount/:

# Dentro del 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

Permisos RBAC​

Vincular un Service Account a 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

Ejemplo Completo​

Paso 1: Crear el Service Account

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

Paso 2: Crear el Role

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

Paso 3: Crear el 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

Paso 4: Usar en un Pod

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

Resultado: El Pod puede leer los Pods en el namespace default.


Acceso a la API de Kubernetes​

Usar el Token en la Aplicación​

import os
import requests

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

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

# Llamada a la 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​

Los Service Accounts pueden tener imagePullSecrets para acceder a registros Docker privados:

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

Resultado: Todos los Pods que utilicen este Service Account pueden extraer imágenes del registro privado.


Service Account por Defecto​

Desactivar el Montaje Automático​

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

Resultado: El token no se monta en los Pods que utilizan este Service Account.

A Nivel de 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

Buenas Prácticas​

1. Service Account por Aplicación​

Crear un Service Account dedicado para cada aplicación.

2. Principio de Menor Privilegio​

Otorgar solo los permisos necesarios mediante RBAC.

3. No usar el Service Account por Defecto​

Evitar utilizar el Service Account default en producción.

4. Desactivar el Token si No es Necesario​

Utilizar automountServiceAccountToken: false si la aplicación no necesita acceder a la API.

5. Rotación de Tokens​

Los tokens son renovados automáticamente por Kubernetes.


Comandos Útiles​

Gestión​

# Crear un Service Account
kubectl create serviceaccount my-app-sa

# Ver los Service Accounts
kubectl get serviceaccounts
kubectl get sa

# Detalles
kubectl describe serviceaccount my-app-sa

# Ver los secrets asociados
kubectl get secrets | grep my-app-sa

Uso​

# Crear un Pod con un Service Account
kubectl run my-pod --image=my-app:1.0 --serviceaccount=my-app-sa

# Ver el token en un Pod
kubectl exec my-pod -- cat /var/run/secrets/kubernetes.io/serviceaccount/token

Resumen​

En este capítulo, usted ha aprendido:

Service Account: Identidad para los Pods en Kubernetes
Creación: Recurso de Kubernetes sencillo
Uso: A través de serviceAccountName en los Pods
Tokens: Creados automáticamente y montados en /var/run/secrets/kubernetes.io/serviceaccount/
RBAC: Vincular Service Accounts a Roles para los permisos
Acceso API: Usar el token para llamar a la API de Kubernetes
Image Pull Secrets: Para acceder a registros privados
Buenas prácticas: Service Account por aplicación, menor privilegio


Próximos Pasos​

Capítulo 9.3: Network Policies
Capítulo 9.4: Pod Security Standards
Lab 9.2: Service Accounts y Permisos


Capítulo creado el: Diciembre 2024