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:
Installare Hierarchy Controller, utilizzando Config Sync 1.6.2 o versioni successive.
Nel file di configurazione per l'operatore ConfigManagement, nella sezione
spec.hierarchyController
, imposta il valore dell'oggetto DaenableHierarchicalResourceQuota
atrue
:# 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...
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:
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
Verifica che venga creato un nuovo oggetto
ResourceQuota
denominatogke-hc-hrq
in lo spazio dei nomi con lo stessospec.hard
di 1configmap
, ad esempio:kubectl describe resourcequota gke-hc-hrq -n default
Output:
Name: gke-hc-hrq Namespace: default Resource Used Hard -------- ---- ---- configmaps 0 1
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:
- Nessun consumo di risorse è soggetto a quote gerarchiche.
- Creazione/aggiornamento di
HierarchicalResourceQuota
non riuscito. - Se l'osservabilità gerarchica è attivata, i pod vengono creati senza applicare etichette.
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
- Osserva i carichi di lavoro gerarchici.
- Scopri di più sulle attività comuni che potresti utilizzare HNC per svolgere in la Guida dell'utente di HNC: procedura.