다음을 통해 공유


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에 액세스할 수 있는 권한 부여를 참조하세요.

  1. 제거 방지 및 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)
    
  2. 새 키 자격 증명 모음에서 비밀을 만들 수 있도록 RBAC Key Vault 비밀 책임자 역할을 자신에게 할당합니다. 새 역할 할당은 전파하고 권한 부여 서버에서 업데이트하는 데 최대 5분이 소요될 수 있습니다.

    az role assignment create --assignee-object-id $MSIPrincipalId --role "Key Vault Secrets Officer" --scope $KVId --assignee-principal-type ServicePrincipal
    
  3. 키 자격 증명 모음에서 비밀을 만듭니다.

    az keyvault secret set --vault-name $KVName --name $KVSecretName --value "Hello!"
    
  4. 이전에 만든 사용자 할당 관리 ID에 Key Vault 비밀 사용자 역할을 할당합니다. 이 단계에서는 관리 ID에 키 자격 증명 모음에서 비밀을 읽을 수 있는 권한을 부여합니다.

    az role assignment create --assignee-object-id $MSIPrincipalId --role "Key Vault Secrets User" --scope $KVId --assignee-principal-type ServicePrincipal
    
  5. 키 자격 증명 모음 URL에 대한 환경 변수를 만듭니다.

    $KVUrl=$(az keyvault show --resource-group $resource_group_name --name $KVName --query properties.vaultUri --output tsv)
    
  6. 서비스 계정 및 키 자격 증명 모음 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를 사용하도록 구성할 준비가 되었습니다.