Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Um widersprüchliche Anforderungen in Azure Kubernetes Service (AKS) zu verhindern, dienen eTags (Entity Tags) als eindeutige Bezeichner, die die Parallelitätssteuerung aktivieren. Wenn eine Anforderung an den Cluster erfolgt, überprüft das System, ob das angegebene eTag mit der neuesten Version übereinstimmt, die in der Datenbank gespeichert ist. Wenn eine Diskrepanz auftritt, schlägt die Anforderung frühzeitig fehl, um sicherzustellen, dass keine unbeabsichtigten Überschreibungen erfolgen.
Verwenden von eTag-Headern
Es gibt zwei Optionen zum Anwenden von eTags über Kopfzeilen:
–-if-match Header: Stellt sicher, dass der Vorgang nur ausgeführt wird, wenn das vorhandene eTag mit dem in diesem Header angegebenen Wert übereinstimmt.
–-if-none-match Header: Stellt sicher, dass der Vorgang nur ausgeführt wird, wenn keiner der eTags mit dem in diesem Header angegebenen Wert übereinstimmt. Dieser Kopfzeilentyp kann nur leer oder ein * sein.
Suchen vorhandener ETags
Sie können entweder einen LIST- oder einen GET-Aufruf Ihres Clusters oder Knotenpools ausführen, um das vorhandene ETag anzuzeigen. Ein ETag sieht ungefähr wie im folgenden Beispiel aus:
"agentPoolProfiles": [
{"eTag": "5e5ffdce-356b-431b-b050-81b45eef2a12"}
]
Was würde vorhandene ETags ändern?
ETags können auf Cluster- und Agentpoolebene vorhanden sein. Je nach Umfang der ausgeführten Vorgänge können Sie das entsprechende eTag übergeben. Wenn Sie einen Vorgang auf Clusterebene ausführen, werden sowohl das eTag auf Clusterebene als auch das eTag des Agentpools aktualisiert. Wenn Sie eine Aktion im Agent-Pool ausführen, wird nur das eTag des Agent-Pools aktualisiert.
Einfügen von ETags in die Vorgangskopfzeilen
Kopfzeilen sind optional zu verwenden. Die folgenden Beispiele zeigen, wie Sie die Kopfzeilen –-if-match und -–if-none-match verwenden.
Beispiel 1: Der folgende CLI-Befehl löscht einen vorhandenen Cluster MyManagedCluster wenn das eTag übereinstimmt mit yvjvt
Angenommen, Sie möchten einen AKS-Cluster mithilfe des eTags löschen. (Ersetzen Sie "yvjvt" zur Veranschaulichung den tatsächlichen eTag-Wert, den Sie aus der Ressource abgerufen haben.)
az aks delete -g $RG_NAME -n $CLUSTER_NAME --if-match "yvjvt"
Beispiel 2: Der folgende CLI-Befehl erstellt einen neuen Cluster. Wenn * im –if-none-match Header angegeben wird, bedeutet dies, dass überprüft werden soll, ob die Ressource nicht vorhanden ist.
Erstellen Sie zunächst eine Ressourcengruppe:
export RANDOM_SUFFIX=$(head -c 3 /dev/urandom | xxd -p)
export RG_NAME="my-resource-group$RANDOM_SUFFIX"
export REGION="eastus2"
az group create --name $RG_NAME --location $REGION
Erstellen Sie dann einen neuen AKS-Cluster mit einem zufälligen Suffix, um die Eindeutigkeit sicherzustellen:
export CLUSTER_NAME="my-managed-cluster$RANDOM_SUFFIX"
az aks create -g $RG_NAME -n $CLUSTER_NAME --location $REGION --if-none-match "*"
Ergebnisse:
{
"aadProfile": null,
"addonProfiles": null,
"agentPoolProfiles": [
{
"eTag": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
...
}
],
"apiServerAccessProfile": null,
"autoScalerProfile": null,
...
"name": "my-managed-clusterxxx",
...
"provisioningState": "Succeeded",
...
"resourceGroup": "my-resource-groupxxx",
...
}
Konfigurationen und erwartetes Verhalten
In der folgenden Tabelle wird das erwartete Verhalten von HTTP-Vorgängen (PUT, PATCH und DELETE) basierend auf verschiedenen eTag-Konfigurationen und ressourcenbasiertem Vorhandensein beschrieben. Sie zeigen, wie sich das Vorhandensein von --if-match Oder --if-none-match Headern auf die Antwortstatuscodes auswirkt, um die Parallelitätssteuerung sicherzustellen und unbeabsichtigte Änderungen zu verhindern.
| PUT | Ressource ist nicht vorhanden | Ressource ist vorhanden |
|---|---|---|
--if-match = "" |
201 – Erstellt | 200 - Ok |
--if-match = "*" |
412 – Fehler bei der Vorbedingung | 200 - OK |
--if-match = "xyz" |
412 – Fehler bei der Vorbedingung | 200 - OK ODER 412 - Vorbedingung fehlgeschlagen |
--if-none-match = "*" |
201 – Erstellt | 412 – Fehler bei der Vorbedingung |
| Patch | Ressource ist nicht vorhanden | Ressource ist vorhanden |
|---|---|---|
--if-match = "" |
404 - Nicht gefunden | 200 - OK |
--if-match = "*" |
404 - Nicht gefunden | 200 - OK |
--if-match = "xyz" |
404 - Nicht gefunden | 200 - OK ODER 412 - Vorbedingung fehlgeschlagen |
| DELETE | Ressource ist nicht vorhanden | Ressource ist vorhanden |
|---|---|---|
--if-match = "" |
204 - Kein Inhalt | 200 - OK |
--if-match = "*" |
204 - Kein Inhalt | 200 - OK |
--if-match = "xyz" |
204 - Kein Inhalt | 200 - OK ODER 412 - Vorbedingung fehlgeschlagen |
Häufige Probleme und empfohlene Gegenmaßnahmen
Szenario 1: BadRequest – die --if-none-match Kopfzeile ist entweder nicht leer oder nicht auf * gesetzt.
Dies schlägt die Vorabvalidierungsprüfungen fehl. Der --if-none-match Header darf entweder leer sein oder den Wert * haben.
Szenario 2: BadRequest - --if-match Kopfzeile ist nicht leer UND kopfzeile ist --if-none-match*
Dies schlägt die Vorabvalidierungsprüfungen fehl. Beide Header können nicht gleichzeitig verwendet werden.
Szenario 3: PreConditionFailed - --if-none-match ist und die angegebene Ressource bereits vorhanden ist *
Die Anforderung wird abgelehnt, wenn ein * (Wildcard für beliebige Werte) in den --if-none-match-Header übergeben wird und die Ressource bereits vorhanden ist.
Szenario 4: PreConditionFailed – Der Wert der --if-match Kopfzeile stimmt nicht mit dem neuesten eTag-Wert der Ressource überein.
Die Anforderung wird abgelehnt, wenn der bereitgestellte Header nicht mit dem eTag-Wert übereinstimmt. Ein neuer GET-Vorgang ist erforderlich, um das neueste eTag für die Ressource abzurufen und den Headerwert in der Anforderung zu aktualisieren.