Azure Kubernetes Service'te varlık etiketleri (eTag'ler) ile eşzamanlılık denetimini geliştirme

Azure Kubernetes Service'te (AKS) çakışan istekleri önlemek için eTag'ler (Varlık Etiketleri), eşzamanlılık denetimini etkinleştiren benzersiz tanımlayıcılar işlevi görür. Kümeye bir istek yapıldığında sistem, sağlanan eTag'in veritabanında depolanan en son sürümle eşleşip eşleşmediğini denetler. Uyuşmazlık varsa, istek erken aşamada başarısız olur ve böylece istenmeyen üzerine yazmaların önüne geçilir.

eTag Başlıklarını Kullanma

Üst bilgiler aracılığıyla eTag uygulamak için iki seçenek vardır:

–-if-match Üst bilgi: İşlemin yalnızca var olan eTag bu üst bilgide sağlanan değerle eşleşiyorsa gerçekleştirilmesini sağlar.

–-if-none-match Üst bilgi: İşlemin yalnızca eTag'lerden hiçbiri bu üst bilgide sağlanan değerle eşleşmiyorsa gerçekleştirilmesini sağlar. Bu üst bilgi türü yalnızca boş veya bir * olabilir.

Mevcut ETag'leri bulma

Mevcut ETag'i görmek için kümenize veya düğüm havuzunuza bir LIST ya da bir GET çağrısı yapabilirsiniz. ETag aşağıdaki örneğe benzer:

"agentPoolProfiles": [
    {"eTag": "5e5ffdce-356b-431b-b050-81b45eef2a12"}
]

Mevcut ETag'leri ne değiştirir?

ETag'ler hem küme hem de aracı havuzu düzeylerinde bulunabilir. Gerçekleştirdiğiniz işlemlerin kapsamına bağlı olarak ilgili eTag'i geçirebilirsiniz. Küme düzeyinde bir işlem gerçekleştirdiğinizde hem küme düzeyinde eTag hem de aracı havuzu eTag'i güncelleştirilir. Aracı havuzu işlemi gerçekleştirdiğinizde, yalnızca aracı havuzu eTag'i güncelleştirilir.

İşlem üst bilgilerine ETag'ler ekleme

Üst bilgilerin kullanılması tercihe bağlıdır. Aşağıdaki örnekler, –-if-match ve -–if-none-match üst bilgilerinin nasıl kullanılacağını göstermektedir.

Örnek 1: Aşağıdaki CLI komutu, eTag ile eşleşiyorsa mevcut bir kümeyi MyManagedCluster siler yvjvt

Aks kümesini eTag'ini kullanarak silmek istediğinizi varsayalım. (Örnek göstermesi için, kaynaktan aldığınız gerçek eTag değeriyle "yvjvt" değerini değiştirin.)

az aks delete -g $RG_NAME -n $CLUSTER_NAME --if-match "yvjvt"

Örnek 2: Aşağıdaki CLI komutu yeni bir küme oluşturur. Başlıkta * sağlanmışsa –if-none-match, bu, kaynağın mevcut olmadığını doğrulamak anlamına gelir.

İlk olarak bir kaynak grubu oluşturun:

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 

Ardından, benzersiz olduğundan emin olmak için rastgele bir sonek içeren yeni bir AKS kümesi oluşturun:

export CLUSTER_NAME="my-managed-cluster$RANDOM_SUFFIX"

az aks create -g $RG_NAME -n $CLUSTER_NAME --location $REGION --if-none-match "*"

Sonuçlar:

{
  "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",
  ...
}

Yapılandırmalar ve Beklenen Davranış

Aşağıdaki tabloda, farklı eTag yapılandırmalarına ve kaynak varlığına göre HTTP işlemlerinin (PUT, PATCH ve DELETE) beklenen davranışı özetlenmektedir. Bunlar, --if-match veya --if-none-match başlıklarının yanıt durum kodlarını nasıl etkilediğini gösterir, eşzamanlılık kontrolü sağlayarak istenmeyen değişiklikleri önler.

KOYMAK Kaynak yok Kaynak mevcut
--if-match = "" 201 – Oluşturuldu 200 - Tamam
--if-match = "*" 412 - Önkoşul Başarısız Oldu 200 - Tamam
--if-match = "xyz" 412 - Önkoşul Başarısız Oldu 200 - Tamam VEYA 412 - Önkoşul Başarısız Oldu
--if-none-match = "*" 201 - Oluşturuldu 412 - Önkoşul Başarısız Oldu
YAMA Kaynak yok Kaynak mevcut
--if-match = "" 404 - Bulunamadı 200 - Tamam
--if-match = "*" 404 - Bulunamadı 200 - Tamam
--if-match = "xyz" 404 - Bulunamadı 200 - Tamam VEYA 412 - Önkoşul Başarısız Oldu
SİLMEK Kaynak yok Kaynak mevcut
--if-match = "" 204 - İçerik Yok 200 - Tamam
--if-match = "*" 204 - İçerik Yok 200 - Tamam
--if-match = "xyz" 204 - İçerik Yok 200 - Tamam VEYA 412 - Önkoşul Başarısız Oldu

Senaryo 1: BadRequest – --if-none-match başlık boş değil veya * olarak ayarlanmamış

Bu, ön kontrol denetimlerinden geçemiyor. Üst --if-none-match bilgi yalnızca boş olabilir veya bir * değeri alabilir.

Senaryo 2: BadRequest - --if-match başlık boş değil VE --if-none-match başlık *

Bu, ön kontrol denetimlerinden geçemiyor. Her iki üst bilgi de aynı anda kullanılamaz.

Senaryo 3: PreConditionFailed - --if-none-match is * ve verilen kaynak zaten var

Eğer * üstbilgisinde herhangi bir (joker karakter) değeri geçirilirse ve kaynak zaten mevcutsa, istek reddedilir.

Senaryo 4: PreConditionFailed - Üst bilgi değeri --if-match kaynağın en son eTag değeriyle eşleşmiyor

Sağlanan üst bilgi eTag değeriyle eşleşmiyorsa istek reddedilir. Kaynakta en son eTag'i almak ve istekteki üst bilgi değerini güncelleştirmek için yeni bir GET işlemi gereklidir.