Utilizzo di quote per le risorse gerarchiche

Quote delle risorse Kubernetes sono uno strumento che consente agli amministratori di garantire un'equa quota di risorse tra utenti diversi. Una quota di risorse, definita da un oggetto ResourceQuota, fornisce vincoli che limitano il consumo di risorse aggregate in un singolo spazio dei nomi.

Controller gerarchia estende il concetto di quote delle risorse per spazio dei nomi al fine di supportare spazi dei nomi. 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, segui questi passaggi:

  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 seguenti:

    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

Impostare un HierarchicalResourceQuota equivale a impostare una normale ResourceQuota, ma con apiVersion e kind diversi; pertanto, puoi impostare limiti per le risorse nel campo spec.hard come faresti 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 limitando il numero nei discendenti, puoi creare una regola ResourceQuota 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 le relative discendenti combinati, sostituisci apiVersion e kind nella precedente esempio:

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 . 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

Ma qualsiasi ulteriore tentativo di creare nuove configmap in uno qualsiasi dei tre spazi dei nomi non riesce, anche negli spazi dei nomi di pari livello 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

Ispeziona 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 nel suo predecessori. La modifica della gerarchia dello spazio dei nomi attiva un ricalcolo del gli utilizzi delle quote.

Rimuovi uno spazio dei nomi da un sottoalbero con quote gerarchiche

Quando uno spazio dei nomi viene spostato fuori da un sottoalbero con quote gerarchiche nei predecessori, non è più soggetta quote e le relative risorse vengono rimosse di utilizzo.

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 di utilizzo.

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

Le quote gerarchiche non ti impediscono di spostare un nuovo spazio dei nomi in anche se l'utilizzo del nuovo spazio dei nomi supera il limite 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 delle risorse gerarchiche si comportano in modo simile alle quote delle risorse Kubernetes nei casi d'angolo. Ad esempio:

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

Risoluzione dei problemi

InternalError quando utilizzi risorse

Quando utilizzi risorse, ad esempio, durante la creazione di un configmap, i tuoi potrebbe non rispondere più per 10 secondi e verrà visualizzato il seguente messaggio di errore messaggio:

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 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 seguenti:

Se il problema persiste, segnalacelo per un'analisi, preferibilmente tramite che puoi ottenere utilizzando:

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

Passaggi successivi