AKS Edge Essentials 클러스터에서 워크로드 ID 구성(미리 보기)
AKS(Azure Kubernetes Service) Edge Essentials는 대규모로 컨테이너화된 애플리케이션 실행을 자동화하는 AKS(Azure Kubernetes Service)의 온-프레미스 Kubernetes 구현입니다. 이 문서에서는 다음 작업을 수행하는 방법을 설명합니다.
- Kubernetes 서비스 계정을 만들고 Azure 관리 ID에 바인딩합니다.
- 관리 ID에 페더레이션 자격 증명을 만들어 OIDC 발급자를 신뢰합니다.
- 애플리케이션을 배포합니다.
- 예: 클러스터의 Pod에 Azure Key Vault의 비밀에 대한 액세스 권한을 부여합니다.
워크로드 ID 페더레이션의 개념적 개요는 Azure Arc 지원 Kubernetes의 워크로드 ID 페더레이션(미리 보기)을 참조하세요.
Important
이러한 미리 보기 기능은 셀프 서비스에서 옵트인(opt-in)으로 사용할 수 있습니다. 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. Azure Kubernetes Service Edge Essentials 미리 보기는 고객 지원에서 최대한 많이 적용됩니다.
참고 항목
이 공개 미리 보기에서 AKS Edge Essentials를 사용하면 Azure IoT Operations 빠른 시작 스크립트를 처음 배포하는 동안 워크로드 ID를 사용하도록 설정할 수 있습니다. 이 기능은 다른 AKS Edge Essentials 시나리오에서는 사용할 수 없습니다.
필수 조건
AKS Edge Essentials 클러스터에 워크로드 ID 페더레이션을 사용하기 전에 Azure IoT Operations를 실행할 수 있는 AKS Edge Essentials 클러스터 만들기 및 구성에 설명된 대로 Azure IoT Operation 빠른 시작 스크립트를 배포해야 합니다. 이 스크립트는 AKS Edge Essentials 클러스터에서 워크로드 ID 페더레이션 기능을 자동으로 사용하도록 설정합니다.
AKS Edge Essentials 클러스터를 배포한 후 다음 명령을 사용하여 워크로드 ID 확장의 상태를 확인할 수 있습니다.
az connectedk8s show -n $aks_cluster_name -g $resource_group_name
# agentState = "Succeeded"
"agentPublicKeyCertificate": "",
"agentVersion": "1.21.10",
"arcAgentProfile": {
"agentAutoUpgrade": "Enabled",
"agentErrors": [],
"agentState": "Succeeded",
"desiredAgentVersion": "",
"systemComponents": null
# oidcIssuerProfile "enabled": true and "issuerUrl" present
"oidcIssuerProfile": {
"enabled": true,
"issuerUrl": "https://oidcdiscovery-{location}-endpoint-1111111111111111.000.azurefd.net/00000000-0000-0000-0000-000000000000/11111111-1111-1111-1111-111111111111/",
# workloadIdentity "enabled": true
"securityProfile": {
"workloadIdentity": {
"enabled": true
Azure Portal에서 Kubernetes 클러스터의 wiextension
속성 섹션에서 확장을 볼 수 있습니다.
환경 변수 내보내기
필요한 ID를 구성하는 단계를 간소화하기 위해 다음 단계에서는 이 문서의 예제에서 참조되는 환경 변수를 정의합니다. 표시된 값을 사용자 고유의 값으로 바꿔야 합니다.
$AZSubscriptionID = "00000000-0000-0000-0000-000000000000"
$Location = "westeurope"
$resource_group_name = "myResourceGroup"
$aks_cluster_name = "myAKSCluster"
$SERVICE_ACCOUNT_NAMESPACE = "default"
$SERVICE_ACCOUNT_NAME = "workload-identity-sa"
$FedIdCredentialName = "myFedIdentity"
$MSIName = "myIdentity"
# Include these variables to access key vault secrets from a pod in the cluster.
$KVName = "KV-workload-id"
$KVSecretName= "KV-secret"
환경 변수에 OIDC 발급자 URL 저장
OIDC 발급자 URL을 가져와 환경 변수에 저장하려면 다음 명령을 실행합니다.
$SERVICE_ACCOUNT_ISSUER =$(az connectedk8s show --n $aks_cluster_name --resource-group $resource_group_name --query "oidcIssuerProfile.issuerUrl" --output tsv)
1단계: Kubernetes 서비스 계정을 만들고 Azure 관리 ID에 바인딩
먼저 az identity create 명령을 호출하여 관리 ID를 만듭니다.
az identity create --name $MSIName --resource-group $resource_group_name --location $Location --subscription $AZSubscriptionID
다음으로 관리 ID의 클라이언트 ID에 대한 변수를 만듭니다.
$MSIId=$(az identity show --resource-group $resource_group_name --name $MSIName --query 'clientId' --output tsv)
$MSIPrincipalId=$(az identity show --resource-group $resource_group_name --name $MSIName --query 'principalId' --output tsv)
Kubernetes 서비스 계정 만들기
Kubernetes 서비스 계정을 만들고 이전 단계에서 만든 관리 ID의 클라이언트 ID로 주석을 추가합니다. 다음 Azure CLI 명령을 복사하여 붙여넣습니다.
$yaml = @"
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
azure.workload.identity/client-id: $MSIId
name: $SERVICE_ACCOUNT_NAME
namespace: $SERVICE_ACCOUNT_NAMESPACE
"@
# Replace variables within the YAML content
$yaml = $yaml -replace '\$MSIId', $MSIId `
-replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME `
-replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE
# Apply the YAML content to Kubernetes
$yaml | kubectl apply -f -
다음 출력은 성공적으로 생성된 워크로드 ID를 보여줍니다.
serviceaccount/workload-identity-sa created
2단계: 관리 ID에 페더레이션 자격 증명을 만들어 OIDC 발급자를 신뢰합니다.
관리 ID, 서비스 계정 발급자 및 주체 간에 페더레이션 ID 자격 증명을 만들려면 az identity federated-credential create 명령을 호출합니다. Microsoft Entra의 페더레이션된 ID 자격 증명에 대한 자세한 내용은 Microsoft Entra ID의 페더레이션된 ID 자격 증명 개요를 참조하세요.
# Create a federated credential
az identity federated-credential create --name $FedIdCredentialName --identity-name $MSIName --resource-group $resource_group_name --issuer $SERVICE_ACCOUNT_ISSUER --subject "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}"
# Show the federated credential
az identity federated-credential show --name $FedIdCredentialName --resource-group $resource_group_name --identity-name $MSIName
참고 항목
페더레이션 ID 자격 증명을 추가한 후 전파하는 데 몇 초 정도 걸립니다. 캐시가 새로 고쳐질 때까지 즉시 수행된 토큰 요청이 실패할 수 있습니다. 이 문제를 방지하려면 페더레이션 ID 자격 증명을 만든 후 잠시 지연을 추가하는 것이 좋습니다.
3단계: 애플리케이션 배포
애플리케이션 Pod를 배포할 때 매니페스트는 Kubernetes 서비스 계정 만들기 단계에서 만든 서비스 계정을 참조해야 합니다. 다음 매니페스트는 계정, 특히 및 spec\serviceAccountName
속성을 참조하는 metadata\namespace
방법을 보여 줍니다. image
에 이미지를 지정하고 containerName
에 컨테이너 이름을 지정해야 합니다.
$image = "<image>" # Replace <image> with the actual image name
$containerName = "<containerName>" # Replace <containerName> with the actual container name
$yaml = @"
apiVersion: v1
kind: Pod
metadata:
name: sample-quick-start
namespace: $SERVICE_ACCOUNT_NAMESPACE
labels:
azure.workload.identity/use: "true" # Required. Only pods with this label can use workload identity.
spec:
serviceAccountName: $SERVICE_ACCOUNT_NAME
containers:
- image: $image
name: $containerName
"@
# Replace variables within the YAML content
$yaml = $yaml -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE `
-replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME
# Apply the YAML configuration
$yaml | kubectl apply -f -
Important
워크로드 ID를 사용하는 애플리케이션 Pod에 Pod 사양에 레이블 azure.workload.identity/use: "true"
이 포함되어 있는지 확인합니다. 그렇지 않으면 다시 시작한 후 Pod가 실패합니다.
예: Azure Key Vault에 액세스할 수 있는 권한 부여
이 단계의 지침에서는 Pod에서 Azure Key Vault의 비밀, 키 또는 인증서에 액세스하는 방법을 설명합니다. 이 섹션의 예에서는 워크로드 ID에 대한 키 자격 증명 모음의 비밀에 대한 액세스를 구성하지만 유사한 단계를 수행하여 키 또는 인증서에 대한 액세스를 구성할 수 있습니다.
다음 예에서는 Azure RBAC(Azure 역할 기반 액세스 제어) 권한 모델을 사용하여 Pod에 키 자격 증명 모음에 대한 액세스 권한을 부여하는 방법을 보여 줍니다. Azure Key Vault용 Azure RBAC 권한 모델에 대한 자세한 내용은 Azure RBAC를 사용하여 애플리케이션에 Azure Key Vault에 액세스할 수 있는 권한 부여를 참조하세요.
제거 방지 및 RBAC 권한 부여가 사용하도록 설정된 키 자격 증명 모음을 만듭니다. 제거 방지 및 RBAC 권한 부여 모두에 대해 구성된 경우 기존 키 자격 증명 모음을 사용할 수도 있습니다.
az keyvault create --name $KVName --resource-group $resource_group_name --location $Location --enable-purge-protection --enable-rbac-authorization # retrieve the key vault ID for role assignment $KVId=$(az keyvault show --resource-group $resource_group_name --name $KVName --query id --output tsv)
새 키 자격 증명 모음에서 비밀을 만들 수 있도록 RBAC Key Vault 비밀 책임자 역할을 자신에게 할당합니다. 새 역할 할당은 전파하고 권한 부여 서버에서 업데이트하는 데 최대 5분이 소요될 수 있습니다.
az role assignment create --assignee-object-id $MSIPrincipalId --role "Key Vault Secrets Officer" --scope $KVId --assignee-principal-type ServicePrincipal
키 자격 증명 모음에서 비밀을 만듭니다.
az keyvault secret set --vault-name $KVName --name $KVSecretName --value "Hello!"
이전에 만든 사용자 할당 관리 ID에 Key Vault 비밀 사용자 역할을 할당합니다. 이 단계에서는 관리 ID에 키 자격 증명 모음에서 비밀을 읽을 수 있는 권한을 부여합니다.
az role assignment create --assignee-object-id $MSIPrincipalId --role "Key Vault Secrets User" --scope $KVId --assignee-principal-type ServicePrincipal
키 자격 증명 모음 URL에 대한 환경 변수를 만듭니다.
$KVUrl=$(az keyvault show --resource-group $resource_group_name --name $KVName --query properties.vaultUri --output tsv)
서비스 계정 및 키 자격 증명 모음 URL을 참조하는 Pod를 배포합니다.
$yaml = @" apiVersion: v1 kind: Pod metadata: name: sample-quick-start namespace: $SERVICE_ACCOUNT_NAMESPACE labels: azure.workload.identity/use: "true" spec: serviceAccountName: $SERVICE_ACCOUNT_NAME containers: - image: ghcr.io/azure/azure-workload-identity/msal-go name: oidc env: - name: KEYVAULT_URL value: $KVUrl - name: SECRET_NAME value: $KVSecretName nodeSelector: kubernetes.io/os: linux "@ # Replace variables within the YAML content $yaml = $yaml -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE ` -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME ` -replace '\$KVUrl', $KVUrl ` -replace '\$KVSecretName', $KVSecretName # Apply the YAML configuration $yaml | kubectl --kubeconfig $aks_cluster_name apply -f -
다음 단계
이 문서에서는 애플리케이션 워크로드가 해당 자격 증명을 사용하여 인증할 수 있도록 워크로드 ID를 사용하도록 구성했습니다. 이제 애플리케이션을 배포하고 최신 버전의 Azure ID 클라이언트 라이브러리와 함께 워크로드 ID를 사용하도록 구성할 준비가 되었습니다.