Utilizzo di quote per le risorse gerarchiche

Le quote delle risorse di Kubernetes sono uno strumento che consente agli amministratori di garantire una discreta condivisione di risorse tra i diversi utenti. Una quota delle risorse, definita da un oggetto ResourceQuota, fornisce vincoli che limitano il consumo aggregato delle risorse in un singolo spazio dei nomi.

Hierarchy Controller estende il concetto di quote delle risorse per spazio dei nomi in modo da supportare spazi dei nomi gerarchici. Un oggetto HierarchicalResourceQuota limita il consumo aggregato di risorse in tutti gli spazi dei nomi di un sottoalbero, consentendo agli amministratori di limitare il consumo di risorse in più spazi dei nomi correlati.

Quando sono abilitate le quote delle risorse gerarchiche, Hierarchy Controller installa due webhook di ammissione di convalida, uno per applicare effettivamente i limiti di consumo delle risorse e l'altro per convalidare direttamente le quote gerarchiche delle risorse.

Abilita quote delle risorse gerarchiche

Le quote delle risorse gerarchiche sono fornite da Hierarchy Controller. Per abilitare le quote delle risorse gerarchiche, segui questi passaggi:

  1. Installa Hierarchy Controller utilizzando Config Sync 1.6.2 o versioni successive.

  2. Nel file di configurazione per l'operatore ConfigManagement, nell'oggetto spec.hierarchyController imposta il valore di enableHierarchicalResourceQuota su true:

    # config-management.yaml
    
    apiVersion: configmanagement.gke.io/v1
    kind: ConfigManagement
    metadata:
      name: config-management
    spec:
      hierarchyController:
        enabled: true
        # Set to true to enable hierarchical resource quotas:
        enableHierarchicalResourceQuota: true
      # ...other fields...
    
  3. Applica la configurazione:

    kubectl apply -f config-management.yaml
    

    Dopo circa un minuto, le quote di Hierarchy Controller e delle risorse gerarchiche diventano utilizzabili nel cluster.

Per verificare che le quote delle risorse gerarchiche siano abilitate:

  1. Crea un oggetto HierarchicalResourceQuota in qualsiasi spazio dei nomi, ad esempio:

    cat > example-hrq.yaml <<EOF
    apiVersion: hierarchycontroller.configmanagement.gke.io/v1alpha1
    kind: HierarchicalResourceQuota
    metadata:
      name: example-hrq
    spec:
      hard:
        configmaps: "1"
    EOF
    
    kubectl apply -f example-hrq.yaml -n default
    
  2. Verifica che nello spazio dei nomi venga creato un nuovo oggetto ResourceQuota chiamato gke-hc-hrq con lo stesso spec.hard di 1 configmap, ad esempio:

    kubectl describe resourcequota gke-hc-hrq -n default
    

    Output:

    Name:           gke-hc-hrq
    Namespace:      default
    Resource        Used    Hard
    --------        ----    ----
    configmaps      0       1
    
  3. Esegui la pulizia:

    kubectl delete hrq -n default example-hrq
    

    Assicurati che l'oggetto creato automaticamente sia rimosso:

    kubectl get resourcequota gke-hc-hrq -n default
    

    Output:

    Error from server (NotFound): resourcequotas "gke-hc-hrq" not found
    

Utilizzo di quote per risorse gerarchiche

Impostazione delle quote

L'impostazione di un HierarchicalResourceQuota equivale a impostare un ResourceQuota normale, ma con valori diversi per apiVersion e kind. Di conseguenza, puoi impostare i limiti per le risorse nel campo spec.hard come faresti in ResourceQuota.

Prendiamo come esempio un team team-a che possiede un servizio chiamato service-a e ha un sottoteam chiamato team-b, tutti rappresentati da spazi dei nomi gerarchici, come segue:

kubectl hns tree team-a

Output:

team-a
├── service-a
└── team-b

Se vuoi limitare il numero di configmaps in team-a, ma senza limitare il numero negli eventuali discendenti, puoi creare un ResourceQuota normale nel seguente modo:

cat > team-a-rq.yaml <<EOF
apiVersion: v1
kind: ResourceQuota
metadata:
  name: team-a-rq
  namespace: team-a
spec:
  hard:
    configmaps: "1"
EOF

kubectl apply -f team-a-rq.yaml

Al contrario, per limitare il numero totale di configmaps in team-a e i relativi discendenti combinati, sostituisci apiVersion e kind nell'esempio precedente:

cat > team-a-hrq.yaml <<EOF
# Modify the following two lines:
apiVersion: hierarchycontroller.configmanagement.gke.io/v1alpha1
kind: HierarchicalResourceQuota
# Everything below this line remains the same
metadata:
  name: team-a-hrq
  namespace: team-a
spec:
  hard:
    configmaps: "1"

EOF

kubectl apply -f team-a-hrq.yaml

Il primo tentativo di creare un configmap in uno di questi tre spazi dei nomi ha esito positivo. Ad esempio, potremmo scegliere di creare configmap in uno degli spazi dei nomi figlio:

kubectl create configmap config-1 --from-literal key=value -n team-b

Output:

confimap/config-1 created

Tuttavia, qualsiasi ulteriore tentativo di creare nuove mappe di configurazione in uno qualsiasi dei tre spazi dei nomi non andrà a buon fine, incluso quello di pari livello o di livello superiore:

kubectl create configmap config-2 --from-literal key=value -n service-a
kubectl create configmap config-2 --from-literal key=value -n team-a

Output per entrambi:

Error from server (Forbidden): admission webhook "resourcesquotasstatus.hierarchycontroller.configmanagement.gke.io" denied the request: exceeded hierarchical quota in namespace "team-a": "team-a-hrq", requested: configmaps=1, used: configmaps=1, limited: configmaps=1

Ispeziona le quote

Per visualizzare i limiti e l'utilizzo attuali di HierarchicalResourceQuota, usa il comando kubectl describe per visualizzare una quota di risorse normale:

kubectl describe hrq team-a-hrq -n team-a

Output:

# ...other fields...
Spec:
  Hard:
    Configmaps:  1
Status:
  Hard:
    Configmaps:  1
  Used:
    Configmaps:  1

Aggiorna gerarchia dello spazio dei nomi

Uno spazio dei nomi è sempre soggetto a qualsiasi HierarchicalResourceQuota nei suoi predecessori. La modifica della gerarchia dello spazio dei nomi attiva un ricalcolo degli utilizzi di qualsiasi quota.

Rimuovi uno spazio dei nomi da un sottoalbero con quote gerarchiche

Quando uno spazio dei nomi viene spostato all'esterno di un sottoalbero con quote gerarchiche nei predecessori, non è più soggetto a queste quote e le relative risorse vengono rimosse dagli utilizzi delle quote.

Ad esempio, se team-b viene rimosso dal sottoalbero precedente, non ci saranno limiti di utilizzo di configmap in team-b. L'utilizzo gerarchico della quota viene reimpostato su 0, il che significa che team-a e service-a ora possono consumare un altro configmap in totale.

Aggiungi uno spazio dei nomi a un sottoalbero con quote gerarchiche

Quando uno spazio dei nomi viene aggiunto a un sottoalbero con quote gerarchiche, è soggetto alle quote gerarchiche e i relativi utilizzi delle risorse vengono aggiunti agli utilizzi delle quote.

Ad esempio, se viene aggiunto un altro spazio dei nomi al sottoalbero precedente, non è consentito alcun ulteriore utilizzo di configmap nello spazio dei nomi appena aggiunto. Allo stesso modo, qualsiasi utilizzo di configmap esistente nello spazio dei nomi appena aggiunto viene aggiunto all'utilizzo della quota gerarchica.

Le quote gerarchiche non impediscono di spostare un nuovo spazio dei nomi in un sottoalbero, anche se l'utilizzo del nuovo spazio dei nomi supera il limite previsto dalle quote gerarchiche. Tuttavia, se un limite viene superato, l'utilizzo di ulteriori risorse viene vietato fino a quando l'utilizzo non scende al di sotto del limite o fino a quando il limite non viene aumentato. Questo comportamento è simile al comportamento di ResourceQuota di Kubernetes quando viene applicato un limite inferiore all'utilizzo esistente nello spazio dei nomi.

Regole generali

Le quote delle risorse gerarchiche si comportano in modo simile alle quote delle risorse di Kubernetes nei casi d'angolo. Ad esempio:

  • Se allo stesso spazio dei nomi si applicano più quote gerarchiche per le risorse, vengono rispettati i limiti per le risorse più restrittivi.
  • Se crei un limite inferiore alla quantità di risorse già consumate, le risorse esistenti non vengono eliminate, ma il consumo futuro di risorse è vietato finché l'utilizzo non scende al di sotto del limite o non viene aumentato il limite.

Risoluzione dei problemi

InternalError al consumo di risorse

Quando utilizzi risorse, ad esempio durante la creazione di un configmap, la richiesta potrebbe non rispondere per 10 secondi e visualizzare il seguente messaggio di errore:

Error from server (InternalError): Internal error occurred: resource quota evaluates timeout

Non è previsto che venga visualizzato questo messaggio di errore, a meno che il pod gke-hc-controller-manager non sia in uno stato non valido.

Per risolvere il problema, gli amministratori con autorizzazione possono eliminare il pod utilizzando il prefisso gke-hc-controller-manager- direttamente nello spazio dei nomi hnc-system. Il pod si riavvia automaticamente. Prima che il pod sia pronto, tieni presente quanto segue:

Se il problema persiste, segnalacelo per un'analisi, preferibilmente con i log che puoi recuperare utilizzando quanto segue:

kubectl logs -n hnc-system deployment/gke-hc-controller-manager -c manager

Passaggi successivi