Obiectul ServiceAccount în Kubernetes (kubectl)

Obiecte Kubernetes (manifeste YAML) Kubernetes 1.0+ (kubectl create token din 1.24)

Identitatea cu care un Pod se autentifică la API-ul Kubernetes; primește drepturi prin RBAC și un token de scurtă durată.

Sintaxă comandă
apiVersion: v1
kind: ServiceAccount

Ce face Obiectul ServiceAccount

Oamenii se autentifică în cluster cu certificate sau prin furnizorul de identitate; aplicațiile din Pod-uri folosesc un ServiceAccount. Fiecare namespace are unul numit default, folosit automat de Pod-urile care nu cer altceva. Pentru aplicațiile care vorbesc cu API-ul (operatori, CI, unelte de monitorizare) creezi un ServiceAccount separat și îi dai doar drepturile necesare printr-un RoleBinding.

Kubernetes montează în Pod un token de scurtă durată, reînnoit automat, în /var/run/secrets/kubernetes.io/serviceaccount/token. Din versiunea 1.24 nu se mai creează automat Secret-uri cu tokenuri permanente; pentru un token folosit din afara clusterului rulezi kubectl create token. Dacă aplicația nu are nevoie de API, dezactivează montarea cu automountServiceAccountToken: false.

Parametri

Parametru Descriere
spec.serviceAccountName (în Pod) ServiceAccount-ul folosit de Pod (implicit default).
automountServiceAccountToken false nu mai montează tokenul (în ServiceAccount sau în Pod).
kubectl create serviceaccount NUME Creează un ServiceAccount din linia de comandă.
kubectl create token NUME --duration=1h Emite un token temporar pentru ServiceAccount.
system:serviceaccount:NS:NUME Numele de utilizator al ServiceAccount-ului, folosit în RBAC și cu --as.

Exemple

Exemplul 1: ServiceAccount cu drept de citire a Pod-urilor

Aplicația de monitorizare poate doar lista și citi Pod-urile din namespace-ul magazin.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: monitor
  namespace: magazin
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: citire-pods
  namespace: magazin
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: monitor-citire-pods
  namespace: magazin
subjects:
  - kind: ServiceAccount
    name: monitor
    namespace: magazin
roleRef:
  kind: Role
  name: citire-pods
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: monitor
  namespace: magazin
spec:
  selector:
    matchLabels: {app: monitor}
  template:
    metadata:
      labels: {app: monitor}
    spec:
      serviceAccountName: monitor
      containers:
        - name: monitor
          image: firma/monitor:2.1

Exemplul 2: Verificarea drepturilor și un token temporar

Testăm drepturile „în numele” ServiceAccount-ului, apoi emitem un token valabil o oră (ieșire scurtată).

kubectl auth can-i list pods -n magazin --as=system:serviceaccount:magazin:monitor
kubectl auth can-i delete pods -n magazin --as=system:serviceaccount:magazin:monitor
kubectl create token monitor -n magazin --duration=1h

Ieșire în terminal

yes
no
eyJhbGciOiJSUzI1NiIsImtpZCI6Ik1hZ2F6aW4ifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjIl0…

Greșeli frecvente

  • Acordarea de drepturi ServiceAccount-ului default: toate Pod-urile din namespace care nu cer alt ServiceAccount le primesc automat. Creează câte un ServiceAccount pentru fiecare aplicație.
  • Crearea manuală de Secret-uri de tip kubernetes.io/service-account-token pentru tokenuri fără expirare: dacă ajung într-un depozit sau jurnal, rămân valabile până la ștergere. Preferă kubectl create token cu durată scurtă.

Comenzi înrudite

  • Obiectul ResourceQuota: Limitează totalul de CPU, memorie, Pod-uri sau alte obiecte pe care le poate consuma un namespace.
  • CustomResourceDefinition (CRD): Adaugă în API-ul Kubernetes un tip nou de obiect (resursă proprie), cu schemă validată, folosit de operatori și controllere.