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, 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:
Installa Hierarchy Controller utilizzando Config Sync 1.6.2 o versioni successive.
Nel file di configurazione per l'operatore ConfigManagement, nell'oggetto
spec.hierarchyController
imposta il valore dienableHierarchicalResourceQuota
sutrue
:# 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, le quote di Hierarchy Controller e delle risorse gerarchiche diventano utilizzabili nel cluster.
Per verificare che le quote delle risorse gerarchiche siano abilitate:
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
Verifica che nello spazio dei nomi venga creato un nuovo oggetto
ResourceQuota
chiamatogke-hc-hrq
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
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 relativi 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:
- Il consumo di risorse non è soggetto a quote gerarchiche.
- Creazione/aggiornamento di
HierarchicalResourceQuota
non riusciti. - Se è abilitata l'osservabilità gerarchica, i pod vengono creati senza applicare etichette.
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
- Osserva i carichi di lavoro gerarchici.
- Scopri di più sulle attività comuni che potresti voler svolgere con HNC nella Guida dell'utente di HNC: How-to.