Creación de una cuenta de servicio y configuración de la identidad de carga de trabajo para la CLI agente para Azure Kubernetes Service (AKS) (versión preliminar)

En este artículo se muestra cómo crear la cuenta de servicio necesaria y, opcionalmente, configurar la identidad de carga de trabajo para la CLI agente para Azure Kubernetes Service (AKS). La creación de la cuenta de servicio es obligatoria para la implementación del modo de clúster, mientras que la configuración de la identidad de carga de trabajo es opcional, pero se recomienda para mejorar la seguridad al acceder a los recursos de Azure.

Prerrequisitos

Requisitos previos de creación de cuentas de servicio:

  • Cli de Azure versión 2.76 o posterior. Compruebe la versión con el comando az version. Para instalar o actualizar, consulte Instalación de la CLI de Azure.

  • Establezca la suscripción de Azure activa mediante el az account set comando .

    az account set --subscription "your-subscription-id-or-name"
    
  • Necesita permisos suficientes para crear y administrar cuentas de servicio, roles y enlaces de rol de Kubernetes.

Requisitos previos de configuración de identidad de carga de trabajo:

Definición de variables

En primer lugar, configure las variables necesarias para el entorno. Reemplace los valores de marcador de posición con tu clúster real y tus detalles de Azure.

Variables necesarias para la creación de cuentas de servicio:

# Cluster information
export RESOURCE_GROUP="<YOUR_RESOURCE_GROUP>"
export CLUSTER_NAME="<YOUR_CLUSTER_NAME>"

# Service account configuration
export SERVICE_ACCOUNT_NAME="aks-mcp"
export SERVICE_ACCOUNT_NAMESPACE="<YOUR_NAMESPACE>"  # e.g., "kube-system" or custom namespace

Variables adicionales (solo si configura la identidad de carga de trabajo):

# Azure information for workload identity
export LOCATION="<YOUR_LOCATION>"
export SUBSCRIPTION="$(az account show --query id --output tsv)"

# Workload identity configuration
export USER_ASSIGNED_IDENTITY_NAME="aks-mcp-identity"
export FEDERATED_IDENTITY_CREDENTIAL_NAME="aks-mcp-fed-identity"

# Generate unique suffix for resource naming
export RANDOM_ID="$(openssl rand -hex 3)"

Creación de una cuenta de servicio de Kubernetes y asignación de permisos (obligatorios)

Importante

La cuenta de servicio es necesaria para que la CLI agente se autentique con el clúster de AKS en modo de clúster.

Creación de la cuenta de servicio

Cree la cuenta de servicio en el espacio de nombres de destino mediante el comando siguiente:

kubectl create serviceaccount "${SERVICE_ACCOUNT_NAME}" --namespace "${SERVICE_ACCOUNT_NAMESPACE}"

Creación de permisos de RBAC

Cree el Role y RoleBinding necesarios para la cuenta de servicio con acceso de lectura para la resolución de problemas de aks-mcp. Estos son dos ejemplos en función de los requisitos de acceso:

  1. Use este ClusterRoleBinding para conceder acceso de solo lectura a todos los recursos de Kubernetes, excepto a los secretos, en todos los espacios de nombres. Esta opción se recomienda para administradores de nivel de clúster o ingenieros de DevOps que necesiten investigar y solucionar problemas en todo el clúster.

    cat <<EOF | kubectl apply -f -
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: aks-mcp-view-rolebinding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: view
    subjects:
    - kind: ServiceAccount
      name: ${SERVICE_ACCOUNT_NAME}
      namespace: ${SERVICE_ACCOUNT_NAMESPACE}
    EOF
    
  2. Compruebe que los recursos se crearon correctamente mediante los siguientes comandos:

    kubectl get serviceaccount "${SERVICE_ACCOUNT_NAME}" --namespace "${SERVICE_ACCOUNT_NAMESPACE}"
    kubectl get clusterrolebinding aks-mcp-view-rolebinding
    

Acceso de lectura con ámbito de espacio de nombres (para escenarios de acceso limitado)

  1. Use RoleBindings para conceder acceso de solo lectura a todos los recursos de Kubernetes, excepto a los secretos, únicamente en espacios de nombres específicos. Esta opción es adecuada para equipos o usuarios que deben tener acceso limitado a espacios de nombres específicos en lugar de a todo el clúster. Repita este RoleBinding para cada espacio de nombres que requiera acceso.

    cat <<EOF | kubectl apply -f -
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: aks-mcp-view-rolebinding
      namespace: ${SERVICE_ACCOUNT_NAMESPACE}
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: view
    subjects:
    - kind: ServiceAccount
      name: ${SERVICE_ACCOUNT_NAME}
      namespace: ${SERVICE_ACCOUNT_NAMESPACE}
    EOF
    
  2. Compruebe que los recursos se crearon correctamente mediante los siguientes comandos:

    kubectl get serviceaccount "${SERVICE_ACCOUNT_NAME}" --namespace "${SERVICE_ACCOUNT_NAMESPACE}"
    kubectl get rolebinding aks-mcp-view-rolebinding --namespace "${SERVICE_ACCOUNT_NAMESPACE}"
    

Configuración de la identidad de carga de trabajo para el acceso a recursos de Azure (opcional)

Los pasos siguientes son opcionales , pero se recomiendan si desea habilitar la CLI agente para acceder a los recursos de Azure de forma segura mediante la identidad de carga de trabajo.

Comprobación del estado actual de la identidad de carga de trabajo

Compruebe si la identidad de carga de trabajo ya está habilitada en el clúster de AKS mediante el az aks show comando .

az aks show --resource-group "${RESOURCE_GROUP}" --name "${CLUSTER_NAME}" --query "securityProfile.workloadIdentity.enabled"

Si la salida es true, la identidad de carga de trabajo está habilitada. Si null o false, debe habilitarlo.

Habilitación de la identidad de la carga de trabajo

Habilite la identidad de carga de trabajo en el clúster de AKS mediante el comando az aks update con las banderas --enable-workload-identity y --enable-oidc-issuer.

az aks update \
    --resource-group "${RESOURCE_GROUP}" \
    --name "${CLUSTER_NAME}" \
    --enable-oidc-issuer \
    --enable-workload-identity

Recuperación de la dirección URL del emisor de OIDC

Obtenga la dirección URL del emisor de OIDC mediante el az aks show comando y guárdela en una variable de entorno.

export AKS_OIDC_ISSUER="$(az aks show --name "${CLUSTER_NAME}" \
    --resource-group "${RESOURCE_GROUP}" \
    --query "oidcIssuerProfile.issuerUrl" \
    --output tsv)"

La variable de entorno debe contener una dirección URL del emisor similar al ejemplo siguiente:

https://eastus.oic.prod-aks.azure.com/00000000-0000-0000-0000-000000000000/11111111-1111-1111-1111-111111111111/

Creación de una identidad administrada asignada por el usuario

Cree una identidad administrada asignada por el usuario para el acceso a recursos de Azure mediante el az identity create comando .

az identity create \
    --name "${USER_ASSIGNED_IDENTITY_NAME}" \
    --resource-group "${RESOURCE_GROUP}" \
    --location "${LOCATION}" \
    --subscription "${SUBSCRIPTION}"

En el ejemplo de salida siguiente se muestra la creación correcta de una identidad administrada:

{
  "clientId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroupxxxxxx/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentityxxxxxx",
  "location": "eastus",
  "name": "myIdentityxxxxxx",
  "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "resourceGroup": "myResourceGroupxxxxxx",
  "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
}

Obtener el identificador de cliente de identidad administrada

Obtenga el identificador de cliente de la identidad administrada mediante az identity show y guárdelo en una variable de entorno.

export USER_ASSIGNED_CLIENT_ID="$(az identity show \
    --resource-group "${RESOURCE_GROUP}" \
    --name "${USER_ASSIGNED_IDENTITY_NAME}" \
    --query 'clientId' \
    --output tsv)"

Asignar el rol necesario a la identidad administrada

Asigne los roles necesarios a la identidad administrada mediante el az role assignment create comando .

En el ejemplo siguiente se asigna el rol "Lector" en el ámbito de la suscripción, lo que permite a la CLI agente leer información de recursos de Azure. Ajuste el rol y el ámbito según sea necesario para el caso de uso.

az role assignment create --role "Reader" \
    --assignee $USER_ASSIGNED_CLIENT_ID \
    --scope /subscriptions/${SUBSCRIPTION}

Si usa Azure OpenAI con el identificador de Microsoft Entra (autenticación sin clave), también debe asignar el rol "Usuario de Cognitive Services" o "Usuario de Azure AI" en el recurso de Azure OpenAI:

# Option 1: Assign Cognitive Services User role
az role assignment create \
    --role "Cognitive Services User" \
    --assignee $USER_ASSIGNED_CLIENT_ID \
    --scope /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<openai-resource-name>

# Option 2: Assign Azure AI User role
az role assignment create \
    --role "Azure AI User" \
    --assignee $USER_ASSIGNED_CLIENT_ID \
    --scope /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<openai-resource-name>

Reemplace <subscription-id>, <resource-group> y <openai-resource-name> con sus valores reales.

Anotar la cuenta de servicio con la identidad de carga de trabajo (opcional)

  1. Actualice la cuenta de servicio para incluir la anotación para la identidad de carga de trabajo mediante el siguiente comando:

    kubectl annotate serviceaccount "${SERVICE_ACCOUNT_NAME}" \
        --namespace "${SERVICE_ACCOUNT_NAMESPACE}" \
        azure.workload.identity/client-id="${USER_ASSIGNED_CLIENT_ID}" \
        --overwrite
    
  2. Compruebe que la cuenta de servicio tiene la anotación de identidad de carga de trabajo correcta mediante el siguiente comando:

    kubectl describe serviceaccount "${SERVICE_ACCOUNT_NAME}" --namespace "${SERVICE_ACCOUNT_NAMESPACE}"
    

Creación de una credencial de identidad federada (opcional)

  1. Cree una credencial de identidad federada entre la identidad administrada, el emisor de cuentas de servicio y el asunto mediante el comando az identity federated-credential create.

    az identity federated-credential create \
        --name "${FEDERATED_IDENTITY_CREDENTIAL_NAME}" \
        --identity-name "${USER_ASSIGNED_IDENTITY_NAME}" \
        --resource-group "${RESOURCE_GROUP}" \
        --issuer "${AKS_OIDC_ISSUER}" \
        --subject "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}" \
        --audience api://AzureADTokenExchange
    

    Nota:

    La credencial de identidad federada tarda unos segundos en propagarse después de agregarla. Si se realiza una solicitud de token inmediatamente después de agregar la credencial de identidad federada, es posible que se produzca un error en la solicitud hasta que se actualice la memoria caché. Para evitar este problema, puede agregar un ligero retraso después de agregar la credencial de identidad federada.

  2. Enumere las credenciales de identidad federada para confirmar la creación mediante el az identity federated-credential list comando .

    az identity federated-credential list \
        --identity-name "${USER_ASSIGNED_IDENTITY_NAME}" \
        --resource-group "${RESOURCE_GROUP}"