Wdrażanie i konfigurowanie tożsamości obciążenia w klastrze usługi Azure Kubernetes Service (AKS)

Azure Kubernetes Service (AKS) to zarządzana usługa Kubernetes, która umożliwia szybkie wdrażanie klastrów Kubernetes i zarządzanie nimi. W tym artykule:

  • Wdrażanie klastra usługi AKS przy użyciu interfejsu wiersza polecenia platformy Azure, który zawiera identyfikator OpenID Połączenie Wystawca i Tożsamość obciążeń Microsoft Entra
  • Udzielanie dostępu do usługi Azure Key Vault
  • Tworzenie konta usługi Tożsamość obciążeń Microsoft Entra i kubernetes service
  • Skonfiguruj tożsamość zarządzaną na potrzeby federacji tokenów.

W tym artykule założono, że masz podstawową wiedzę na temat pojęć związanych z platformą Kubernetes. Aby uzyskać więcej informacji, zobacz temat Kubernetes core concepts for Azure Kubernetes Service (AKS) (Kubernetes — podstawowe pojęcia dotyczące usługi Azure Kubernetes Service (AKS)). Jeśli nie znasz Tożsamość obciążeń Microsoft Entra, zapoznaj się z następującym artykułem Omówienie.

  • Ten artykuł wymaga wersji 2.47.0 lub nowszej interfejsu wiersza polecenia platformy Azure. W przypadku korzystania z usługi Azure Cloud Shell najnowsza wersja jest już zainstalowana.

  • Tożsamość używana do utworzenia klastra ma odpowiednie minimalne uprawnienia. Aby uzyskać więcej informacji na temat dostępu i tożsamości dla usługi AKS, zobacz Opcje dostępu i tożsamości dla usługi Azure Kubernetes Service (AKS).

  • Jeśli masz wiele subskrypcji platformy Azure, wybierz odpowiedni identyfikator subskrypcji, w którym mają być rozliczane zasoby przy użyciu polecenia az account .

Uwaga

Zamiast ręcznie konfigurować wszystkie kroki, istnieje inna implementacja o nazwie Service Połączenie or, która pomoże skonfigurować niektóre kroki automatycznie i osiągnąć ten sam wynik. Zobacz również: Samouczek: Połączenie do konta usługi Azure Storage w usłudze Azure Kubernetes Service (AKS) z usługą Połączenie or przy użyciu tożsamości obciążenia.

Eksportowanie zmiennych środowiskowych

Aby uprościć kroki konfigurowania wymaganych tożsamości, poniższe kroki definiują zmienne środowiskowe do odwołania w klastrze.

Uruchom następujące polecenia, aby utworzyć te zmienne. Zastąp wartości domyślne wartości RESOURCE_GROUP, , LOCATION, SERVICE_ACCOUNT_NAMESUBSCRIPTION, USER_ASSIGNED_IDENTITY_NAMEi FEDERATED_IDENTITY_CREDENTIAL_NAME.

export RESOURCE_GROUP="myResourceGroup"
export LOCATION="westcentralus"
export SERVICE_ACCOUNT_NAMESPACE="default"
export SERVICE_ACCOUNT_NAME="workload-identity-sa"
export SUBSCRIPTION="$(az account show --query id --output tsv)"
export USER_ASSIGNED_IDENTITY_NAME="myIdentity"
export FEDERATED_IDENTITY_CREDENTIAL_NAME="myFedIdentity"

Tworzenie klastra AKS

Utwórz klaster usługi AKS przy użyciu polecenia az aks create z parametrem --enable-oidc-issuer , aby użyć wystawcy OIDC. Poniższy przykład tworzy klaster o nazwie myAKSCluster z jednym węzłem w grupie myResourceGroup:

az aks create -g "${RESOURCE_GROUP}" -n myAKSCluster --enable-oidc-issuer --enable-workload-identity --generate-ssh-keys

Po kilku minutach polecenie zostanie wykonane i zwróci informacje o klastrze w formacie JSON.

Uwaga

Podczas tworzenia klastra usługi AKS druga grupa zasobów jest tworzona automatycznie w celu przechowywania zasobów usługi AKS. Aby uzyskać więcej informacji, zobacz Dlaczego dwie grupy zasobów są tworzone za pomocą usługi AKS?.

Aktualizowanie istniejącego klastra usługi AKS

Klaster usługi AKS można zaktualizować przy użyciu polecenia az aks update za pomocą parametru --enable-oidc-issuer i --enable-workload-identity , aby użyć wystawcy OIDC i włączyć tożsamość obciążenia. Poniższy przykład aktualizuje klaster o nazwie myAKSCluster:

az aks update -g "${RESOURCE_GROUP}" -n myAKSCluster --enable-oidc-issuer --enable-workload-identity

Pobieranie adresu URL wystawcy OIDC

Aby uzyskać adres URL wystawcy OIDC i zapisać go w zmiennej środowiskowej, uruchom następujące polecenie. Zastąp wartość domyślną argumentów -n, czyli nazwą klastra:

export AKS_OIDC_ISSUER="$(az aks show -n myAKSCluster -g "${RESOURCE_GROUP}" --query "oidcIssuerProfile.issuerUrl" -o tsv)"

Zmienna powinna zawierać adres URL wystawcy podobny do następującego przykładu:

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

Domyślnie wystawca jest ustawiony tak, aby używał podstawowego adresu URL https://{region}.oic.prod-aks.azure.com/{tenant_id}/{uuid}, w którym wartość parametru {region} jest zgodna z lokalizacją, w której wdrożony jest klaster usługi AKS. Wartość {uuid} reprezentuje klucz OIDC.

Tworzenie tożsamości zarządzanej

Użyj polecenia az account set interfejsu wiersza polecenia platformy Azure, aby ustawić określoną subskrypcję jako bieżącą aktywną subskrypcję. Następnie użyj polecenia az identity create , aby utworzyć tożsamość zarządzaną.

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

Następnie utwórzmy zmienną dla identyfikatora tożsamości zarządzanej.

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

Tworzenie konta usługi Kubernetes

Utwórz konto usługi Kubernetes i dodaj do niego adnotację przy użyciu identyfikatora klienta tożsamości zarządzanej utworzonej w poprzednim kroku. Użyj polecenia az aks get-credentials i zastąp wartości nazwy klastra i nazwy grupy zasobów.

az aks get-credentials -n myAKSCluster -g "${RESOURCE_GROUP}"

Skopiuj i wklej następujące dane wejściowe wielowierszowe w interfejsie wiersza polecenia platformy 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

Następujące dane wyjściowe przypominają pomyślne utworzenie tożsamości:

serviceaccount/workload-identity-sa created

Ustanawianie poświadczeń tożsamości federacyjnej

Użyj polecenia az identity federated-credential create, aby utworzyć poświadczenia tożsamości federacyjnej między tożsamością zarządzaną, wystawcą konta usługi i tematem.

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

Uwaga

Propagacja poświadczeń tożsamości federacyjnej po ich dodaniu trwa kilka sekund. Jeśli żądanie tokenu jest wykonywane natychmiast po dodaniu poświadczeń tożsamości federacyjnej, może to prowadzić do niepowodzenia przez kilka minut, ponieważ pamięć podręczna jest wypełniana w katalogu starymi danymi. Aby uniknąć tego problemu, możesz dodać niewielkie opóźnienie po dodaniu poświadczeń tożsamości federacyjnej.

Wdrażanie aplikacji

Podczas wdrażania zasobników aplikacji manifest powinien odwoływać się do konta usługi utworzonego w kroku Tworzenie konta usługi Kubernetes Service. Poniższy manifest pokazuje, jak odwoływać się do konta, w szczególności metadata\namespace i spec\serviceAccountName właściwości:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: your-pod
  namespace: "${SERVICE_ACCOUNT_NAMESPACE}"
  labels:
    azure.workload.identity/use: "true"  # Required, only the pods with this label can use workload identity
spec:
  serviceAccountName: "${SERVICE_ACCOUNT_NAME}"
  containers:
    - image: <your image>
      name: <containerName>
EOF

Ważne

Upewnij się, że zasobniki aplikacji korzystające z tożsamości obciążenia dodały następującą etykietę azure.workload.identity/use: "true" do specyfikacji zasobnika. W przeciwnym razie zasobniki kończą się niepowodzeniem po ponownym uruchomieniu.

Opcjonalne — udzielanie uprawnień dostępu do usługi Azure Key Vault

Ten krok jest niezbędny, jeśli musisz uzyskać dostęp do wpisów tajnych, kluczy i certyfikatów zainstalowanych w usłudze Azure Key Vault z zasobnika. Wykonaj następujące kroki, aby skonfigurować dostęp za pomocą tożsamości zarządzanej. W tych krokach założono, że masz już utworzoną i skonfigurowaną usługę Azure Key Vault w ramach subskrypcji. Jeśli go nie masz, zobacz Tworzenie usługi Azure Key Vault przy użyciu interfejsu wiersza polecenia platformy Azure.

Przed kontynuowaniem potrzebne są następujące informacje:

  • Nazwa magazynu kluczy
  • Grupa zasobów przechowująca usługę Key Vault

Te informacje można pobrać przy użyciu polecenia interfejsu wiersza polecenia platformy Azure: az keyvault list.

  1. Ustaw zasady dostępu dla tożsamości zarządzanej, aby uzyskać dostęp do wpisów tajnych w usłudze Key Vault, uruchamiając następujące polecenia:

    export KEYVAULT_RESOURCE_GROUP="myResourceGroup"
    export KEYVAULT_NAME="myKeyVault"
    export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -o tsv)"
    
    az keyvault set-policy --name "${KEYVAULT_NAME}" --secret-permissions get --spn "${USER_ASSIGNED_CLIENT_ID}"
    
  2. Utwórz wpis tajny w usłudze Key Vault:

    export KEYVAULT_SECRET_NAME="my-secret"
    
    az keyvault secret set --vault-name "${KEYVAULT_NAME}" \
       --name "${KEYVAULT_SECRET_NAME}" \
       --value "Hello\!"
    
  3. Eksportowanie adresu URL usługi Key Vault:

    export KEYVAULT_URL="$(az keyvault show -g ${KEYVAULT_RESOURCE_GROUP} -n ${KEYVAULT_NAME} --query properties.vaultUri -o tsv)"
    
  4. Wdróż zasobnik odwołujący się do konta usługi i adresu URL usługi Key Vault powyżej:

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: 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: ${KEYVAULT_URL}
          - name: SECRET_NAME
            value: ${KEYVAULT_SECRET_NAME}
      nodeSelector:
        kubernetes.io/os: linux
    EOF
    

Aby sprawdzić, czy wszystkie właściwości są prawidłowo wstrzykiwane przez element webhook, użyj polecenia kubectl describe :

kubectl describe pod quick-start | grep "SECRET_NAME:"

W przypadku powodzenia dane wyjściowe powinny być podobne do następujących:

      SECRET_NAME:                 ${KEYVAULT_SECRET_NAME}

Aby sprawdzić, czy zasobnik może uzyskać token i uzyskać dostęp do zasobu, użyj polecenia kubectl logs:

kubectl logs quick-start

W przypadku powodzenia dane wyjściowe powinny być podobne do następujących:

I0114 10:35:09.795900       1 main.go:63] "successfully got secret" secret="Hello\\!"

Wyłączanie tożsamości obciążenia

Aby wyłączyć Tożsamość obciążeń Microsoft Entra w klastrze usługi AKS, w którym została włączona i skonfigurowana, możesz uruchomić następujące polecenie:

az aks update --resource-group "${RESOURCE_GROUP}" --name myAKSCluster --disable-workload-identity

Następne kroki

W tym artykule wdrożono klaster Kubernetes i skonfigurowano go do używania tożsamości obciążenia w ramach przygotowań do uwierzytelniania obciążeń aplikacji przy użyciu tego poświadczenia. Teraz możesz przystąpić do wdrażania aplikacji i konfigurować ją tak, aby korzystała z tożsamości obciążenia z najnowszą wersją biblioteki klienta usługi Azure Identity . Jeśli nie możesz ponownie napisać aplikacji w celu korzystania z najnowszej wersji biblioteki klienta, możesz skonfigurować zasobnik aplikacji do uwierzytelniania przy użyciu tożsamości zarządzanej z tożsamością obciążenia jako rozwiązaniem do migracji krótkoterminowej.