AKS(Azure Kubernetes Service)에서 충돌하는 요청을 방지하기 위해 eTags(엔터티 태그)는 동시성 제어를 사용하도록 설정하는 고유 식별자 역할을 합니다. 클러스터에 대한 요청이 수행되면 시스템은 제공된 eTag가 데이터베이스에 저장된 최신 버전과 일치하는지 확인합니다. 불일치가 있는 경우 요청이 일찍 실패하여 의도하지 않은 덮어쓰기가 발생하지 않도록 합니다.
eTag 헤더 사용
헤더를 통해 eTag를 적용하는 두 가지 옵션이 있습니다.
–-if-match
헤더: 기존 eTag가 이 헤더에 제공된 값과 일치하는 경우에만 작업이 수행되도록 합니다.
–-if-none-match
헤더: 이 헤더에 제공된 값과 일치하는 eTag가 없는 경우에만 작업이 수행되도록 합니다. 이 헤더 형식은 비어 있거나 *
일 수 있습니다.
기존 ETag 찾기
클러스터 또는 노드 풀에 LIST
호출 또는 GET
호출을 통해 기존 ETag를 확인할 수 있습니다. ETag는 다음 예제와 같습니다.
"agentPoolProfiles": [
{"eTag": "5e5ffdce-356b-431b-b050-81b45eef2a12"}
]
기존 ETag를 수정하는 항목
ETag는 클러스터 및 에이전트 풀 수준 모두에 있을 수 있습니다. 수행 중인 작업의 범위에 따라 해당 eTag를 전달할 수 있습니다. 클러스터 수준 작업을 수행하면 클러스터 수준 eTag 및 에이전트 풀 eTag가 모두 업데이트됩니다. 에이전트 풀 작업을 수행하는 경우 에이전트 풀 eTag만 업데이트됩니다.
작업 헤더에 ETag 포함
헤더는 사용할 선택 사항입니다. 다음 예제에서는 –-if-match
및 -–if-none-match
헤더를 사용하는 방법을 보여줍니다.
예제 1: eTag가 일치하는 경우 아래 CLI 명령은 기존 클러스터 MyManagedCluster
를 삭제합니다. yvjvt
eTag를 사용하여 AKS 클러스터를 삭제하려는 경우를 가정해 보겠습니다. (리소스에서 가져온 실제 eTag 값으로 "yvjvt"
를 대체하세요.)
az aks delete -g $RG_NAME -n $CLUSTER_NAME --if-match "yvjvt"
예제 2: 아래 CLI 명령은 새 클러스터를 만듭니다. 헤더에 *
제공된 경우 –if-none-match
이는 리소스가 존재하지 않는지 확인하는 것을 의미합니다.
먼저 리소스 그룹을 만듭니다.
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
그런 다음, 고유성을 보장하기 위해 임의의 접미사가 있는 새 AKS 클러스터를 만듭니다.
export CLUSTER_NAME="my-managed-cluster$RANDOM_SUFFIX"
az aks create -g $RG_NAME -n $CLUSTER_NAME --location $REGION --if-none-match "*"
결과:
{
"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",
...
}
구성 및 예상 동작
아래 표에서는 다양한 eTag 구성 및 리소스 존재에 따라 HTTP 작업(PUT, PATCH 및 DELETE)의 예상 동작을 간략하게 설명합니다. 헤더의 --if-match
--if-none-match
존재 여부가 응답 상태 코드에 미치는 영향을 보여 줍니다. 동시성 제어를 보장하고 의도하지 않은 수정을 방지합니다.
PUT | 리소스가 없습니다. | 리소스가 있음 |
---|---|---|
--if-match = "" |
201 – 생성됨 | 200 - 확인 |
--if-match = "*" |
412 - 사전 조건 실패 | 200 - 확인 |
--if-match = "xyz" |
412 - 사전 조건 실패 | 200 - 확인 또는 412 - 사전 조건 실패 |
--if-none-match = "*" |
201 - 생성됨 | 412 - 사전 조건 실패 |
PATCH | 리소스가 없습니다. | 리소스가 있음 |
---|---|---|
--if-match = "" |
404 - 찾을 수 없음 | 200 - 확인 |
--if-match = "*" |
404 - 찾을 수 없음 | 200 - 확인 |
--if-match = "xyz" |
404 - 찾을 수 없음 | 200 - 확인 또는 412 - 사전 조건 실패 |
삭제하다 | 리소스가 없습니다. | 리소스가 있음 |
---|---|---|
--if-match = "" |
204 - 콘텐츠 없음 | 200 - 확인 |
--if-match = "*" |
204 - 콘텐츠 없음 | 200 - 확인 |
--if-match = "xyz" |
204 - 콘텐츠 없음 | 200 - 확인 또는 412 - 사전 조건 실패 |
일반적인 문제 및 권장 완화
시나리오 1: BadRequest
- --if-none-match
헤더가 비어 있지 않거나 로 설정되지 않음 *
이렇게 하면 유효성 검사에 실패합니다. 헤더는 비어 있거나 --if-none-match
의 값을 가질 수 있습니다.
시나리오 2: BadRequest
- --if-match
헤더가 비어 있지 않고 헤더가 --if-none-match
입니다. *
이렇게 하면 유효성 검사에 실패합니다. 두 헤더를 동시에 사용할 수 없습니다.
시나리오 3: PreConditionFailed
- --if-none-match
is *
및 지정된 리소스가 이미 있음
*
(언제든지 사용할 수 있는 와일드카드) 값이 --if-none-match
헤더로 전달되고 리소스가 이미 존재하는 경우 요청이 거부됩니다.
시나리오 4: PreConditionFailed
헤더 값이 리소스의 --if-match
최신 eTag 값과 일치하지 않음
제공된 헤더가 eTag 값과 일치하지 않으면 요청이 거부됩니다. 리소스에 대한 최신 eTag를 가져와서 요청의 헤더 값을 업데이트하려면 새 GET 작업이 필요합니다.
Azure Kubernetes Service