K8s em Exemplos: Contas de Serviço

ServiceAccounts fornecem identidade para Pods. Pods os usam para autenticar na API do Kubernetes e serviços externos (via OIDC/IRSA). Cada namespace tem uma SA padrão. Token é automaticamente projetado no Pod.

serviceaccount.yaml

ServiceAccount é um recurso com namespace. Crie ServiceAccounts dedicados para diferentes workloads em vez de usar o padrão. Token é montado em /var/run/secrets/kubernetes.io/serviceaccount/.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-app
  namespace: default
pod-serviceaccount.yaml

Atribua um ServiceAccount a Pods com serviceAccountName. Se não especificado, Pods usam o ServiceAccount default. Sempre crie ServiceAccounts dedicados para diferentes workloads.

spec:
  serviceAccountName: my-app
  containers:
    - name: app
      image: my-app:v1
serviceaccount-notoken.yaml

Desabilite auto-mount do token da API se não necessário. Reduz superfície de ataque para Pods que não usam a API. Pode definir no nível do ServiceAccount ou Pod.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-app
automountServiceAccountToken: false
---
spec:
  serviceAccountName: my-app
  automountServiceAccountToken: false
  containers:
    - name: app
      image: my-app:v1
serviceaccount-projected.yaml

Tokens de service account projetados são limitados no tempo e vinculados a audiência. Mais seguros que tokens legados. Kubernetes 1.22+ usa tokens projetados por padrão com expiração de 1 hora (auto-rotacionados pelo kubelet).

spec:
  serviceAccountName: my-app
  containers:
    - name: app
      volumeMounts:
        - name: token
          mountPath: /var/run/secrets/tokens
  volumes:
    - name: token
      projected:
        sources:
          - serviceAccountToken:
              path: token
              expirationSeconds: 3600
              audience: api
serviceaccount-irsa.yaml

AWS IRSA (EKS) permite que Pods assumam IAM roles usando federação OIDC. Anote o ServiceAccount com o ARN da role. Pod recebe credenciais AWS automaticamente sem access keys.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-app
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::123456789:role/my-app-role
serviceaccount-gcp.yaml

GCP Workload Identity vincula Kubernetes ServiceAccounts a service accounts do Google Cloud. Similar ao IRSA, sem chaves necessárias. Anote o ServiceAccount e crie IAM binding.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-app
  annotations:
    iam.gke.io/gcp-service-account: my-app@project.iam.gserviceaccount.com
serviceaccount-pull-secrets.yaml

Image pull secrets podem ser anexados a ServiceAccounts. Todos os Pods usando aquele ServiceAccount automaticamente recebem os pull secrets. Útil para registries privados.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-app
imagePullSecrets:
  - name: registry-credentials
---
spec:
  serviceAccountName: my-app
  containers:
    - name: app
      image: private-registry.example.com/my-app:v1
terminal

Debug problemas de ServiceAccount verificando mounts de token e RBAC. Token deve estar presente e válido. RBAC deve conceder permissões necessárias ao ServiceAccount.

$ kubectl exec my-pod -- \
    ls /var/run/secrets/kubernetes.io/serviceaccount/
ca.crt
namespace
token

$ kubectl exec my-pod -- \
    cat /var/run/secrets/kubernetes.io/serviceaccount/token
eyJhbGciOiJSUzI1NiIsImtpZCI6...

$ kubectl auth can-i get pods \
    --as=system:serviceaccount:default:my-app
yes

$ kubectl auth can-i list secrets \
    --as=system:serviceaccount:default:my-app
no

$ kubectl get serviceaccount my-app -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-app
  namespace: default

Índice | GitHub | Use as setas do teclado para navegar |