Eseguire la migrazione dall'identità gestita dal pod all'identità del carico di lavoro
Questo articolo si focalizza sulla migrazione da un'identità gestita dal pod a un ID del carico di lavoro di Microsoft Entra per il cluster del servizio Azure Kubernetes. Fornisce anche linee guida in base alla versione della libreria client di Azure Identity in uso dall'applicazione basata su contenitori.
Se non si ha familiarità con l'ID del carico di lavoro di Microsoft Entra, vedere l'articolo Panoramica seguente.
Operazioni preliminari
Versione dell'interfaccia della riga di comando di Azure 2.47.0 o successiva. Eseguire az --version
per trovare la versione ed eseguire az upgrade
per aggiornare la versione. Se è necessario eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure.
Scenari di migrazione
Questa sezione illustra le opzioni di migrazione disponibili a seconda della versione dell'Azure Identity SDK istallato.
Per ogni scenario è necessario disporre di un trust federato configurato prima di aggiornare l'applicazione per usare l'identità del carico di lavoro. Seguono i passaggi necessari:
- Creare le credenziali di un'identità gestita.
- Associare l'identità gestita all'account del servizio Kubernetes già usato per l'identità gestita dal pod o creare un nuovo account del servizio Kubernetes e associarlo all'identità gestita.
- Stabilire una relazione di trust federato tra l'identità gestita e Microsoft Entra ID.
Eseguire la migrazione alla versione più recente
Se l'applicazione usa già la versione più recente di Azure Identity SDK, seguire i passaggi seguenti per completare la configurazione dell'autenticazione:
- Distribuire un'identità gestita in parallelo all'identità gestita dal pod. È possibile riavviare la distribuzione dell'applicazione per iniziare a usare l'identità del carico di lavoro, dove inserisce automaticamente le annotazioni OIDC nell'applicazione.
- Dopo aver verificato la corretta autenticazione dell'applicazione, è possibile rimuovere le annotazioni dell'identità gestita dal pod dall'applicazione e rimuovere il componente aggiuntivo dell'identità gestita dal pod.
Eseguire la migrazione dalla versione precedente
Se l'applicazione non usa la versione più recente di Azure Identity SDK, sono disponibili due opzioni:
È possibile usare un file collaterale di migrazione fornito nell'ambito delle applicazioni Linux, che inoltra i dati delle transazioni IMDS effettuate dall'applicazione tramite OpenID Connect (OIDC). Il file collaterale di migrazione non è progettato per essere una soluzione a lungo termine, ma un modo per iniziare rapidamente a usare l'identità del carico di lavoro. Effettuare le seguenti operazioni per:
- Distribuire il carico di lavoro con il file collaterale di migrazione per inoltrare i dati delle transazioni IMDS dell'applicazione.
- Verificare che le transazioni di autenticazione vengano completate correttamente.
- Pianificare il lavoro affinché vengano aggiornati gli SDK delle applicazioni a una versione supportata.
- Una volta aggiornati gli SDK a una versione supportata, è possibile rimuovere il file collaterale proxy e distribuire nuovamente l'applicazione.
Nota
Il file collaterale di migrazione non è supportato per l'uso in produzione. Questa funzionalità fornisce il tempo necessario per eseguire la migrazione dell'SDK dell'applicazione a una versione supportata e non è una soluzione a lungo termine. Il file collaterale di migrazione è disponibile solo per i contenitori Linux, in quanto fornisce identità gestite dal pod solo con i pool del nodo Linux.
Riscrivere l'applicazione per supportare la versione più recente della libreria client di Azure Identity. In seguito, seguire la procedura seguente:
- Riavviare la distribuzione dell'applicazione per avviare l'autenticazione usando l'identità del carico di lavoro.
- Una volta verificata la corretta autenticazione dell'applicazione, è possibile rimuovere le annotazioni dell'identità gestita dal pod dall'applicazione e rimuovere il componente aggiuntivo dell'identità gestita dal pod.
Creare un'identità gestita
Se non si dispone di un'identità gestita creata e assegnata al pod, seguire questa procedura per creare e concedere le autorizzazioni necessarie per l'archiviazione, l'insieme di credenziali delle chiavi o qualsiasi risorsa con cui l'applicazione deve eseguire l'autenticazione in Azure.
Usare il comando az account set dell'interfaccia della riga di comando di Azure per impostare una sottoscrizione specifica come sottoscrizione attiva corrente. Quindi, usare il comando az identity create per creare un'identità gestita.
az account set --subscription "subscriptionID"
az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "resourceGroupName" --name "userAssignedIdentityName" --query 'clientId' -otsv)"
Concedere all'identità gestita le autorizzazioni necessarie per accedere alle risorse in Azure necessarie. Per informazioni su come procedere, vedere Assegnare l'accesso a un'identità gestita a una risorsa.
Per ottenere l'URL dell'autorità di certificazione OIDC e salvarlo in una variabile di ambiente, eseguire il comando seguente. Sostituire i valori predefiniti con il nome del cluster e il nome del gruppo di risorse.
export AKS_OIDC_ISSUER="$(az aks show --name myAKSCluster --resource-group myResourceGroup --query "oidcIssuerProfile.issuerUrl" -o tsv)"
La variabile deve contenere l'URL dell'autorità di certificazione simile all'esempio seguente:
https://eastus.oic.prod-aks.azure.com/00000000-0000-0000-0000-000000000000/00000000-0000-0000-0000-000000000000/
Per impostazione predefinita, l'autorità di certificazione è impostata per usare l'URL di base
https://{region}.oic.prod-aks.azure.com/{uuid}
, dove il valore per{region}
corrisponde al luogo dove viene distribuito il cluster del servizio Azure Kubernetes. Il valore{uuid}
rappresenta la chiave OIDC.
Creare un account del servizio Kubernetes
Se per questa applicazione non è stato creato un account del servizio Kubernetes dedicato, seguire questa procedura per crearlo e quindi annotarlo con l'ID client dell'identità gestita creata nel passaggio precedente. Usare il comando az aks get-credentials e sostituire i valori del nome del cluster e il nome del gruppo di risorse.
az aks get-credentials --name myAKSCluster --resource-group "${RESOURCE_GROUP}"
Copiare e incollare il seguente input su più righe nell'interfaccia della riga di comando di Azure.
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
azure.workload.identity/client-id: ${USER_ASSIGNED_CLIENT_ID}
name: ${SERVICE_ACCOUNT_NAME}
namespace: ${SERVICE_ACCOUNT_NAMESPACE}
EOF
L'output seguente è simile alla corretta creazione dell'identità:
Serviceaccount/workload-identity-sa created
Stabilire un trust di credenziali di identità federate
Usare il comando az identity federated-credential create per creare le credenziali di identità federate tra l'identità gestita, l'autorità di certificazione dell'account del servizio e l'oggetto. Sostituire i valori resourceGroupName
, userAssignedIdentityName
federatedIdentityName
, serviceAccountNamespace
, e serviceAccountName
.
az identity federated-credential create --name federatedIdentityName --identity-name userAssignedIdentityName --resource-group resourceGroupName --issuer ${AKS_OIDC_ISSUER} --subject system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME} --audience api://AzureADTokenExchange
Nota
La propagazione delle credenziali di identità federata dopo l'aggiunta iniziale richiede alcuni secondi. Se una richiesta di token viene creata immediatamente dopo l'aggiunta delle credenziali dell'identità federata, è possibile che si verifichi un errore per un paio di minuti, perché la cache viene popolata nella directory con dati obsoleti. Per evitare questo problema, è possibile aggiungere un lieve ritardo dopo l'aggiunta delle credenziali di identità federate.
Distribuire il carico di lavoro con il file collaterale di migrazione
Nota
Il file collaterale di migrazione non è supportato per l'uso in produzione. Questa funzionalità fornisce il tempo necessario per eseguire la migrazione dell'SDK dell'applicazione a una versione supportata e non è una soluzione a lungo termine. Il file collaterale di migrazione è disponibile solo per i contenitori Linux, in quanto le identità gestite dal pod sono disponibili solo con i pool del nodo Linux.
Se l'applicazione usa l'identità gestita e si basa ancora su IMDS per ottenere un token di accesso, è possibile usare il file collaterale di migrazione dell'identità del carico di lavoro per avviare la migrazione all'identità del carico di lavoro. Questo file collaterale è una soluzione di migrazione e nelle applicazioni a lungo termine è necessario modificare il codice per usare Azure Identity SDK più recenti che supportino l'istruzione client.
Per aggiornare o distribuire il carico di lavoro, aggiungere queste annotazioni pod solo se si vuole usare il file collaterale di migrazione. Inserire i valori di annotazione seguenti per usare il file collaterale nella specifica del pod:
azure.workload.identity/inject-proxy-sidecar
: il valore ètrue
ofalse
azure.workload.identity/proxy-sidecar-port
: il valore è la porta desiderata per il file collaterale proxy. Il valore predefinito è8000
.
Quando viene creato un pod con le annotazioni precedenti, il webhook di modifica dell'identità del carico di lavoro di Azure inserisce automaticamente init-container e il file collaterale proxy nella specifica del pod.
Il webhook già in esecuzione aggiunge i frammenti YAML seguenti alla distribuzione dei pod. Di seguito è riportato un esempio della specifica del pod mutata:
apiVersion: v1
kind: Pod
metadata:
name: httpbin-pod
labels:
app: httpbin
azure.workload.identity/use: "true"
annotations:
azure.workload.identity/inject-proxy-sidecar: "true"
spec:
serviceAccountName: workload-identity-sa
initContainers:
- name: init-networking
image: mcr.microsoft.com/oss/azure/workload-identity/proxy-init:v1.1.0
securityContext:
capabilities:
add:
- NET_ADMIN
drop:
- ALL
privileged: true
runAsUser: 0
env:
- name: PROXY_PORT
value: "8000"
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
- name: proxy
image: mcr.microsoft.com/oss/azure/workload-identity/proxy:v1.1.0
ports:
- containerPort: 8000
Questa configurazione si applica a qualsiasi configurazione in cui viene creato un pod. Dopo l'aggiornamento o la distribuzione dell'applicazione, è possibile verificare che il pod sia in esecuzione usando il comando kubectl describe pod. Sostituire il valore podName
con il nome dell'immagine del pod distribuito.
kubectl describe pods podName
Per verificare che il pod passi transazioni IMDS, usare il comando kubectl logs. Sostituire il valore podName
con il nome dell'immagine del pod distribuito:
kubectl logs podName
L'output del log seguente è simile alla corretta comunicazione tramite il file collaterale proxy. Verificare che i log mostrino che sia stato acquisito correttamente un token e che l'operazione GET abbia esito positivo.
I0926 00:29:29.968723 1 proxy.go:97] proxy "msg"="starting the proxy server" "port"=8080 "userAgent"="azure-workload-identity/proxy/v0.13.0-12-gc8527f3 (linux/amd64) c8527f3/2022-09-26-00:19"
I0926 00:29:29.972496 1 proxy.go:173] proxy "msg"="received readyz request" "method"="GET" "uri"="/readyz"
I0926 00:29:30.936769 1 proxy.go:107] proxy "msg"="received token request" "method"="GET" "uri"="/metadata/identity/oauth2/token?resource=https://management.core.windows.net/api-version=2018-02-01&client_id=<client_id>"
I0926 00:29:31.101998 1 proxy.go:129] proxy "msg"="successfully acquired token" "method"="GET" "uri"="/metadata/identity/oauth2/token?resource=https://management.core.windows.net/api-version=2018-02-01&client_id=<client_id>"
Rimuovere l'identità gestita dal pod
Dopo aver completato il test e l'applicazione è in grado di ottenere un token usando il file collaterale proxy, è possibile rimuovere il mapping dell'identità gestita dal pod di Microsoft Entra per il pod dal cluster e quindi rimuovere l'identità.
Eseguire il comando az aks pod-identity delete per rimuovere l'identità dal pod. Questa operazione deve essere eseguita solo una volta eseguita la migrazione di tutti i pod nello spazio dei nomi usando il mapping delle identità gestite dal pod per usare il file collaterale.
az aks pod-identity delete --name podIdentityName --namespace podIdentityNamespace --resource-group myResourceGroup --cluster-name myAKSCluster
Passaggi successivi
Questo articolo illustra come configurare il pod per l'autenticazione usando un'identità del carico di lavoro come opzione di migrazione. Per altre informazioni sull'ID del carico di lavoro di Microsoft Entra, vedere l'articolo Panoramica seguente.
Azure Kubernetes Service