Utilizzo di quote per le risorse gerarchiche

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

Hierarchy Controller espande il concetto di quote di risorse per spazio dei nomi per supportare gli spazi dei nomi gerarchici. Un oggetto HierarchicalResourceQuota limita la risorsa aggregata il consumo effettivo in tutti gli spazi dei nomi di un sottoalbero, consentendo agli amministratori per limitare il consumo di risorse in più spazi dei nomi correlati.

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

Abilita le quote delle risorse gerarchiche

Le quote delle risorse gerarchiche sono fornite da Hierarchy Controller. Per attivare le quote delle risorse gerarchiche:

  1. Installare Hierarchy Controller, utilizzando Config Sync 1.6.2 o versioni successive.

  2. Nel file di configurazione per l'operatore ConfigManagement, nella sezione spec.hierarchyController, imposta il valore dell'oggetto Da enableHierarchicalResourceQuota a 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, il controller della gerarchia e la risorsa gerarchica le quote diventano utilizzabili nel cluster.

Per verificare che le quote delle risorse gerarchiche siano abilitate, segui questi passaggi:

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

    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 venga creato un nuovo oggetto ResourceQuota denominato gke-hc-hrq in lo spazio dei nomi 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. Libera spazio:

    kubectl delete hrq -n default example-hrq
    

    Assicurati che l'oggetto creato automaticamente venga 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 è la stessa di un normale ResourceQuota, ma con apiVersion e kind diversi. Pertanto, puoi impostare limiti per le risorse nel campo spec.hard come faresti in ResourceQuota.

Prendiamo in considerazione un team chiamato team-a che possiede un servizio chiamato service-a e ha una chiamato team-b, ognuno rappresentato 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 nei discendenti, puoi creare un ResourceQuota normale come segue:

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 nei suoi decedenti 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 è andato a buon fine. Ad esempio, potremmo scegliere di creare configmap in una delle spazi dei nomi figlio:

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

Output:

confimap/config-1 created

Tuttavia, tutti i tentativi successivi di creare nuove mappe di configurazione in uno dei tre spazi dei nomi non vanno a buon fine, inclusi gli spazi dei nomi fratello o padre:

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

Controllare le quote

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

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 nuovo calcolo degli utilizzi di eventuali quote.

Rimuovi uno spazio dei nomi da un sottoalbero con quote gerarchiche

Quando uno spazio dei nomi viene rimosso da un sottoalbero con quote gerarchiche nei suoi antenati, 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 saranno limiti per il consumo di configmap in team-b. L'utilizzo della quota gerarchica viene reimpostato su 0, il che significa che team-a e service-a ora possono consumare uno più 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, viene soggetto alle quote gerarchiche e i relativi utilizzi delle risorse vengono aggiunti alle quote degli utenti.

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

Le quote gerarchiche non ti 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 viene superato un limite, l'ulteriore utilizzo delle risorse è vietato finché l'utilizzo non scenda al di sotto del limite o finché il limite viene sollevato. Questo comportamento è simile a quello di Kubernetes ResourceQuota quando imposto un limite inferiore all'utilizzo esistente nello spazio dei nomi.

Regole generali

Le quote per le risorse gerarchiche si comportano in modo simile alle quote per le risorse di Kubernetes nei casi limite. Ad esempio:

  • Se allo stesso spazio dei nomi vengono applicate più quote di risorse gerarchiche, vengono rispettati i limiti di risorse più restrittivi.
  • Se crei un limite inferiore alla quantità di contenuti già consumati risorse esistenti non vengono eliminate, ma eventuali risorse future il consumo è vietato fino a quando l'utilizzo non scenda al di sotto del limite o del limite viene sollevato.

Risoluzione dei problemi

InternalError quando consumi risorse

Quando consumi risorse, ad esempio quando crei un configmap, la richiesta potrebbe smettere di rispondere per 10 secondi e viene visualizzato il seguente messaggio di errore:

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

Non dovrebbe essere visualizzato questo messaggio di errore, a meno che gke-hc-controller-manager pod è in uno stato non valido.

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

Se il problema persiste, segnalacelo per consentirci di analizzarlo, preferibilmente fornendo i log che puoi ottenere utilizzando quanto segue:

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

Passaggi successivi