CKA · Módulo 2 K8s v1.34 parte de Cluster Arch 25%

RBAC y seguridad del cluster

Quién puede hacer qué, y cómo. El módulo que más confunde por su vocabulario, pero que se vuelve simple con un solo modelo mental: QUIÉN + QUÉ, conectados por un BINDING.

Duración60 min
PrerequisitoMódulo 1 (API server)
DificultadMedia-alta
Cae en examenSeguido
RBAC (Role-Based Access Control) controla quién puede hacer qué contra el API server. Suena complejo por los cuatro objetos con nombres parecidos (Role, ClusterRole, RoleBinding, ClusterRoleBinding), pero todos encajan en un modelo simple. Lo bueno: ya tenés la base del Módulo 1 — sabés que todo pasa por el API server. RBAC es justamente el portero que decide qué dejás pasar.

El modelo mental que resuelve todo RBAC

QUIÉN
Subject
User, Group o ServiceAccount. La identidad que quiere hacer algo.
+
QUÉ
Role / ClusterRole
Un conjunto de permisos: qué verbos (get, create...) sobre qué recursos.
=
CONECTADOS POR
Binding
RoleBinding o ClusterRoleBinding. Le da el QUÉ al QUIÉN.
Un permiso solo "existe" cuando un Binding conecta un Subject (quién) con un Role (qué). El Role sin Binding no hace nada. El Binding es el pegamento.
2.1
Roles y ClusterRoles
El QUÉ: definir permisos. Namespaced vs cluster-wide.
2.2
RoleBindings y ClusterRoleBindings
El pegamento: conectar permisos con identidades. Las combinaciones válidas.
2.3
ServiceAccounts
La identidad de los pods. Cómo se vincula al pod.
2.4
auth can-i
Verificar permisos. Tu herramienta de diagnóstico de RBAC.
2.5
Certificados y kubeconfig
Contexts, users, clusters. Cómo kubectl sabe quién sos.
2.1
El QUÉ · 20 min

Roles y ClusterRoles

Definen permisos. La diferencia es el alcance: un namespace vs todo el cluster.
Práctica · Crear permisos

Role — permisos en UN namespace

# Imperativo: role que puede ver pods en el ns actual
k create role pod-reader \
  --verb=get,list,watch \
  --resource=pods

# Con $do para ver el YAML
k create role pod-reader \
  --verb=get,list,watch --resource=pods $do

El YAML resultante:

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

ClusterRole — permisos en TODO el cluster

# Mismo formato, pero sin namespace (es cluster-wide)
k create clusterrole node-reader \
  --verb=get,list,watch \
  --resource=nodes $do
El apiGroups: [""] (string vacío) es el "core group" — pods, services, configmaps, etc. Para otros recursos cambia: apps (deployments), rbac.authorization.k8s.io (roles), etc. Si no sabés el group, k api-resources te lo dice.
Teoría · El alcance

Role vs ClusterRole

RoleClusterRole
Alcance1 namespaceTodo el cluster
Tiene namespaceNo
Para recursosNamespaced (pods, etc.)Namespaced O cluster-scoped (nodes, PVs)

Las 3 partes de un rule

  • apiGroups: a qué grupo de API pertenece el recurso
  • resources: qué recursos (pods, deployments...)
  • verbs: qué acciones (get, list, create...)

Los verbos comunes

get, list, watch (lectura) · create, update, patch (escritura) · delete, deletecollection (borrado)

Un Role/ClusterRole por sí solo no le da permisos a nadie. Es solo una definición de permisos "flotando". Recién sirve cuando un Binding la conecta a un Subject (sección 2.2).
2.2
El pegamento · 15 min

RoleBindings y ClusterRoleBindings

Conectan el QUIÉN con el QUÉ. Acá vive la lógica que más confunde.
Práctica · Conectar

RoleBinding — da permisos en UN namespace

# Darle el role 'pod-reader' al usuario 'juan'
k create rolebinding juan-pods \
  --role=pod-reader \
  --user=juan $do

# A un ServiceAccount en vez de user:
k create rolebinding sa-pods \
  --role=pod-reader \
  --serviceaccount=default:miapp $do

ClusterRoleBinding — da permisos en TODO el cluster

k create clusterrolebinding juan-nodes \
  --clusterrole=node-reader \
  --user=juan $do

El patrón útil: ClusterRole + RoleBinding

# Definís el permiso UNA vez como ClusterRole,
# y lo aplicás en namespaces específicos con RoleBinding
k create rolebinding juan-en-dev \
  --clusterrole=pod-reader \
  --user=juan \
  --namespace=dev $do
El patrón ClusterRole + RoleBinding es muy común: definís permisos reutilizables una vez (ClusterRole) y los otorgás namespace por namespace (RoleBinding). Evita duplicar Roles idénticos en cada namespace.
Teoría · Las combinaciones

La tabla que tenés que saber de memoria

BindingReferencia a¿Válido?
RoleBindingRole
RoleBindingClusterRole
ClusterRoleBindingClusterRole
ClusterRoleBindingRoleNO

La regla en palabras

Un RoleBinding puede apuntar a un Role O a un ClusterRole (en ambos casos, los permisos aplican solo en SU namespace).

Un ClusterRoleBinding solo puede apuntar a un ClusterRole (nunca a un Role).

Por qué ClusterRoleBinding → Role no existe

Un Role está atado a un namespace. Un ClusterRoleBinding es cluster-wide. No tiene sentido lógico otorgar cluster-wide algo que solo existe en un namespace. Por eso K8s no lo permite.

El alcance lo define el Binding, no el Role. Un ClusterRole usado con un RoleBinding queda limitado a ese namespace. El "Cluster" en ClusterRole es solo la definición; el alcance real lo decide el binding.
2.3
Identidad de pods · 15 min

ServiceAccounts

Los users son para humanos; los ServiceAccounts son para pods.
Práctica · SA y pods

Crear y usar un ServiceAccount

# Crear un SA
k create serviceaccount miapp

# Ver los SA del namespace
k get serviceaccounts
# Siempre existe uno llamado 'default'

Asignar el SA a un pod

# En el YAML del pod:
spec:
  serviceAccountName: miapp
  containers:
  - name: app
    image: nginx

Imperativo: setear el SA de un deployment

k set serviceaccount deployment/web miapp

Darle permisos al SA (combina todo)

# El SA es el SUBJECT del binding
k create rolebinding miapp-pods \
  --role=pod-reader \
  --serviceaccount=default:miapp $do
Si no asignás un SA a un pod, usa el default del namespace, que normalmente NO tiene permisos. Si tu app necesita hablar con el API server, creale un SA con los permisos justos.
Teoría · Por qué existen

User vs ServiceAccount

UserServiceAccount
ParaHumanosPods / procesos
Lo gestiona K8sNo (externo)Sí (objeto del cluster)
Tiene namespaceNo
Se crea con kubectlNo

El dato clave

Kubernetes no tiene objetos User. Los usuarios vienen de afuera (certificados, OIDC, etc.). Pero los ServiceAccounts SÍ son objetos que creás y gestionás con kubectl.

Cómo se nombra un SA en un binding

Formato: namespace:nombre. Por eso --serviceaccount=default:miapp significa "el SA llamado miapp en el namespace default".

El token del SA se monta automáticamente en el pod (en /var/run/secrets/kubernetes.io/serviceaccount/). El pod lo usa para autenticarse contra el API server.
2.4
Diagnóstico · 10 min

kubectl auth can-i

Tu herramienta para verificar permisos sin prueba y error.
Práctica · Verificar

¿Puedo hacer X?

# ¿Puedo crear deployments?
k auth can-i create deployments

# ¿Puedo borrar pods en el ns kube-system?
k auth can-i delete pods -n kube-system

# Respuesta: yes / no

¿Puede OTRO hacer X? (impersonation)

# ¿El usuario juan puede listar pods?
k auth can-i list pods --as juan

# ¿El SA miapp puede crear services?
k auth can-i create services \
  --as=system:serviceaccount:default:miapp

Ver TODO lo que puede alguien

k auth can-i --list --as juan
El --as (impersonation) es clave en el examen: te piden "verificá que el usuario X puede/no puede hacer Y". En vez de loguearte como X, impersonás con --as. Para un SA el formato es system:serviceaccount:NS:NOMBRE.
Teoría · Cómo razonar

El flujo de diagnóstico de RBAC

Cuando algo "no tiene permisos" (como tu Forbidden del Módulo 1), el camino es:

  1. auth can-i para confirmar qué falta
  2. Buscar el Role/ClusterRole que debería tener el permiso
  3. Buscar el Binding que conecta al subject
  4. Si falta el binding o el permiso en el role, lo agregás

Formato del subject SA

Un ServiceAccount como subject en impersonation o en bindings se escribe completo: system:serviceaccount:<ns>:<nombre>

El auth can-i --list es oro para diagnosticar: te muestra el mapa completo de permisos de un subject, sin adivinar.
2.5
Identidad · 15 min

Certificados y kubeconfig

Cómo kubectl sabe quién sos y a qué cluster apuntás.
Práctica · Contexts

Ver y cambiar contexts

# Ver el context actual
k config current-context

# Listar todos los contexts
k config get-contexts

# Cambiar de context
k config use-context <nombre>

# Ver el kubeconfig completo
k config view

Cambiar el namespace por defecto del context

k config set-context --current --namespace=dev
# Ahora todos los comandos van al ns 'dev' sin -n
En el examen, cambiar de cluster/context es frecuente: cada tarea puede pedir un cluster distinto. El k config use-context es de los comandos que más vas a tipear. Y el --namespace en el context te ahorra poner -n en cada comando.
Teoría · Las 3 piezas

El kubeconfig tiene 3 secciones

SecciónQué define
clustersA qué API server (URL + CA)
usersQuién sos (cert/token/credenciales)
contextsCombina cluster + user + namespace

El context es el "perfil activo"

Un context dice: "usá ESTE user para hablar con ESTE cluster en ESTE namespace". Cambiar de context = cambiar de identidad y/o destino de un saque.

Dónde vive

Por defecto en ~/.kube/config (el que copiaste con admin.conf en el Módulo 1). La variable KUBECONFIG puede apuntar a otro.

Conecta con el Módulo 1: el admin.conf que copiaste a ~/.kube/config ES un kubeconfig. Tiene el cluster (tu API server), el user (admin con su cert), y un context que los une. Por eso al copiarlo, kubectl supo quién sos y a dónde conectarte.
Cierre del módulo

Lo que te llevás del Módulo 2

Resumen · Comandos clave

Para tu agenda

# Crear permisos (el QUÉ)
k create role NAME --verb=get,list --resource=pods $do
k create clusterrole NAME --verb=... --resource=nodes $do

# Conectar (el pegamento)
k create rolebinding NAME --role=R --user=U $do
k create clusterrolebinding NAME --clusterrole=CR --user=U $do

# ServiceAccount (identidad de pods)
k create serviceaccount NAME
k create rolebinding NAME --role=R \
  --serviceaccount=NS:SA $do

# Verificar permisos
k auth can-i VERB RESOURCE --as USER
k auth can-i --list --as USER

# Contexts
k config use-context NAME
k config set-context --current --namespace=NS
Teoría · Lo esencial

Las 4 ideas que no se negocian

  • QUIÉN + QUÉ + BINDING. El Role define permisos; el Binding los otorga a un subject.
  • Role/RoleBinding = 1 namespace. ClusterRole/ClusterRoleBinding = todo el cluster.
  • RoleBinding puede usar un ClusterRole (queda scoped al ns). ClusterRoleBinding NUNCA usa un Role.
  • SA = identidad de pods. Users = humanos (externos). SA = objetos del cluster.
Si te trabás con RBAC, volvé siempre al modelo del principio: ¿quién (subject)? ¿qué permiso (role)? ¿están conectados (binding)? El 90% de los problemas es que falta el binding o el role no tiene el verbo correcto.
Checkpoint Módulo 2: modelo QUIÉN+QUÉ+BINDING claro, combinaciones de bindings memorizadas, SA entendidos, auth can-i y contexts dominados. Siguiente: Módulo 3 — Helm, Kustomize y CRDs.
Módulo 2 completado · Quién puede hacer qué, resuelto · Siguiente: Helm, Kustomize y CRDs