Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a: ✔️ Fleet Manager con cluster di hub
Quando un ambiente multi-cluster matura, la presenza di un carico di lavoro specifico in più cluster è una situazione comune. Un motivo per aggiungere cluster a una flotta consiste nell'centralizzare la gestione dei carichi di lavoro per migliorare la visibilità e la gestibilità dei carichi di lavoro in più cluster. Tuttavia, l'aggiunta di cluster con carichi di lavoro esistenti a una flotta può causare conflitti di posizionamento quando Fleet Manager tenta di inserire un carico di lavoro gestito in un cluster membro aggiunto.
In questo articolo verrà esaminato come utilizzare la whenToTakeOver proprietà di un applyStrategy nella distribuzione delle risorse (ambito cluster ClusterResourcePlacement o ambito spazio dei nomiResourcePlacement) per controllare esplicitamente come Fleet Manager gestisce i carichi di lavoro esistenti durante l'esecuzione delle distribuzioni.
Annotazioni
Se non si ha già familiarità con i concetti di posizionamento delle risorse di Fleet Manager, leggere la panoramica del posizionamento delle risorse con ambito cluster e la panoramica del posizionamento delle risorse con ambito spazio dei nomi prima di leggere questo articolo.
Importante
Le funzionalità in anteprima di Gestione flotta Kubernetes di Azure sono disponibili in modalità self-service, previo consenso esplicito. Le anteprime vengono fornite "così come sono" e "come disponibili" e sono escluse dai contratti di servizio e dalla garanzia limitata. Le anteprime di Gestione flotta Kubernetes di Azure sono parzialmente coperte dal supporto clienti con il massimo sforzo. Di conseguenza, queste funzionalità non sono destinate all'uso in produzione.
Le anteprime del piano dati vengono rilasciate tramite la versione dell'API v1beta1. Se gli oggetti di anteprima non vengono visualizzati, verificare di richiedere l'API v1beta1 quando si interagisce con il cluster hub di Fleet Manager.
Opzioni di acquisizione del carico di lavoro
Il punto di partenza per l'acquisizione del carico di lavoro consiste nel distribuire i manifesti del carico di lavoro nel cluster hub di Fleet Manager. Dopo la distribuzione, definisci un ClusterResourcePlacement o un ResourcePlacement che specifica un comportamento esplicito di acquisizione tramite la proprietà whenToTakeOver.
La whenToTakeOver proprietà consente i valori seguenti:
Always: Fleet Manager applica immediatamente il carico di lavoro corrispondente dal cluster hub e le eventuali differenze di valore nei campi gestiti vengono sovrascritte nel cluster di destinazione. Questo comportamento è l'impostazione predefinita sia perClusterResourcePlacementche perResourcePlacement, in assenza di un'impostazione esplicitawhenToTakeOver.IfNoDiff: Fleet Manager verifica le differenze di configurazione quando rileva un carico di lavoro esistente e applica il carico di lavoro del cluster hub solo se non vengono rilevate differenze di configurazione.Never: Fleet Manager ignora i carichi di lavoro esistenti e non applica il carico di lavoro del cluster hub. Fleet Manager identifica ancora i carichi di lavoro corrispondenti e genera un errore di applicazione, in modo da poter verificare in modo sicuro la presenza di carichi di lavoro esistenti.
Definire i campi usati per il confronto
È possibile usare una proprietà facoltativa comparisonOptions per ottimizzare il modo in cui whenToTakeOver determina le differenze di configurazione.
partialComparison: solo i campi presenti nel carico di lavoro del cluster hub e nel carico di lavoro del cluster di destinazione vengono usati per il confronto dei valori. Tutti i campi aggiuntivi non gestiti nel carico di lavoro del cluster di destinazione vengono ignorati. Questo comportamento è di default senza alcuna impostazione esplicitacomparisonOptions.fullComparison: tutti i campi nella definizione del carico di lavoro nel cluster hub Fleet devono essere presenti nel cluster membro selezionato. Se il cluster di destinazione include campi aggiuntivi non gestiti, il confronto non riesce.
Verificare la presenza di carichi di lavoro in conflitto
Per verificare la presenza di carichi di lavoro esistenti, iniziare aggiungendo un oggetto applyStrategy con un whenToTakeOver valore di Never , come illustrato negli esempi seguenti.
Esempio di ClusterResourcePlacement
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
name: web-2-crp
spec:
resourceSelectors:
- group: ""
kind: Namespace
version: v1
labelSelector:
matchLabels:
app: web-2
policy:
placementType: PickAll
strategy:
applyStrategy:
whenToTakeOver: Never
type: RollingUpdate
rollingUpdate:
maxUnavailable: 100%
unavailablePeriodSeconds: 1
Applica il ClusterResourcePlacement al cluster hub di Fleet Manager.
kubectl apply -f web-2-crp.yaml
Esempio di ResourcePlacement
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
name: web-2-rp
namespace: web-2
spec:
resourceSelectors:
- group: "apps"
kind: Deployment
name: web-app
version: v1
policy:
placementType: PickAll
strategy:
applyStrategy:
whenToTakeOver: Never
type: RollingUpdate
rollingUpdate:
maxUnavailable: 100%
unavailablePeriodSeconds: 1
Applica il ResourcePlacement al cluster hub di Fleet Manager.
kubectl apply -f web-2-rp.yaml
Controllare lo stato di posizionamento
Fleet Manager tenta di posizionare il carico di lavoro e quando trova un carico di lavoro corrispondente in un cluster membro di destinazione restituisce una failedPlacement risposta.
È possibile determinare quali cluster membri hanno fallito il posizionamento a causa di un carico di lavoro conflittuale usando i seguenti comandi. Il comando jq viene usato per formattare l'output.
Per ClusterResourcePlacement:
kubectl get clusterresourceplacement.v1beta1.placement.kubernetes-fleet.io web-2-crp -o jsonpath='{.status.placementStatuses}' \
| jq '[.[] | select (.failedPlacements != null)] | map({clusterName, failedPlacements})'
Per ResourcePlacement:
kubectl get resourceplacement.v1beta1.placement.kubernetes-fleet.io web-2-rp -n web-2 -o jsonpath='{.status.placementStatuses}' \
| jq '[.[] | select (.failedPlacements != null)] | map({clusterName, failedPlacements})'
Ogni cluster che non riesce nel posizionamento a causa di un carico di lavoro esistente restituisce una voce simile al seguente esempio.
{
"clusterName": "member-2",
"failedPlacements": [
{
"condition": {
"lastTransitionTime": "...",
"message": "Failed to apply the manifest (error: no ownership of the object in the member cluster; takeover is needed)",
"reason": "NotTakenOver",
"status": "False",
"type": "Applied"
},
"kind": "Namespace",
"name": "web-2",
"version": "v1"
}
]
}
Assumere in modo sicuro i carichi di lavoro corrispondenti
Per procedere con il controllo di un carico di lavoro esistente, è possibile modificare l'oggetto esistente ClusterResourcePlacement o ResourcePlacement, cambiando whenToTakeOver in IfNoDiff.
Fleet Manager applica il carico di lavoro del cluster hub al posto del carico di lavoro esistente nel cluster di destinazione quando non esistono differenze tra i campi gestiti in entrambi i carichi di lavoro. I campi aggiuntivi vengono ignorati.
Esempio di ClusterResourcePlacement
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
name: web-2-crp
spec:
resourceSelectors:
- group: ""
kind: Namespace
version: v1
labelSelector:
matchLabels:
app: web-2
policy:
placementType: PickAll
strategy:
applyStrategy:
whenToTakeOver: IfNoDiff
comparisonOption: PartialComparison
type: RollingUpdate
rollingUpdate:
maxUnavailable: 100%
unavailablePeriodSeconds: 1
Applica il ClusterResourcePlacement al cluster hub di Fleet Manager.
kubectl apply -f web-2-crp.yaml
Esempio di ResourcePlacement
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
name: web-2-rp
namespace: web-2
spec:
resourceSelectors:
- group: "apps"
kind: Deployment
name: web-app
version: v1
policy:
placementType: PickAll
strategy:
applyStrategy:
whenToTakeOver: IfNoDiff
comparisonOption: PartialComparison
type: RollingUpdate
rollingUpdate:
maxUnavailable: 100%
unavailablePeriodSeconds: 1
Applica il ResourcePlacement al cluster hub di Fleet Manager.
kubectl apply -f web-2-rp.yaml
Verificare la presenza di posizionamenti non riusciti
Fleet Manager tenta di allocare il carico di lavoro sovrascrivendo i cluster membri di destinazione che hanno campi corrispondenti.
I posizionamenti possono comunque non riuscire, quindi verificare la presenza di messaggi aggiuntivi failedPlacement . Determinare quali cluster membro hanno fallito utilizzando i comandi seguenti. Il comando jq viene usato per formattare l'output.
Per ClusterResourcePlacement:
kubectl get clusterresourceplacement.v1beta1.placement.kubernetes-fleet.io web-2-crp -o jsonpath='{.status.placementStatuses}' \
| jq '[.[] | select (.failedPlacements != null)] | map({clusterName, failedPlacements})'
Per ResourcePlacement:
kubectl get resourceplacement.v1beta1.placement.kubernetes-fleet.io web-2-rp -n web-2 -o jsonpath='{.status.placementStatuses}' \
| jq '[.[] | select (.failedPlacements != null)] | map({clusterName, failedPlacements})'
Ogni cluster che ha avuto esito negativo a causa di una differenza di configurazione restituisce una voce simile all'esempio seguente.
{
"clusterName": "member-2",
"failedPlacements": [
{
"condition": {
"lastTransitionTime": "...",
"message": "Failed to apply the manifest (error: cannot take over object: configuration differences are found between the manifest object and the corresponding object in the member cluster)",
"reason": "FailedToTakeOver",
"status": "False",
"type": "Applied"
},
"kind": "Namespace",
"name": "work-2",
"version": "v1"
}
]
}
La visualizzazione dei campi deviati può essere ottenuta seguendo il processo descritto nella sezione relativa ai cluster deviati della documentazione sul rilevamento della deriva.
A questo punto è necessario decidere come gestire la deriva, includendo le modifiche del cluster membro nella definizione del carico di lavoro del cluster hub o scegliendo di sovrascrivere il carico di lavoro del cluster membro impostando la whenToTakeOver proprietà su Always.
Passaggi successivi
- Rilevare e gestire la deriva per le risorse inserite usando il posizionamento delle risorse.
- Controllare la rimozione e l'interruzione per il posizionamento delle risorse del cluster.
- Definire una strategia di implementazione per un posizionamento delle risorse.
- Usare il posizionamento delle risorse cluster per distribuire i carichi di lavoro in più cluster.
- Usare il posizionamento delle risorse con ambito dello spazio dei nomi per distribuire i carichi di lavoro in più cluster.
- Posizionamento intelligente delle risorse Kubernetes tra cluster in base alle proprietà dei cluster membri.