Menyebarkan dan mengonfigurasi identitas beban kerja pada kluster Azure Kubernetes Service (AKS)

Azure Kubernetes Service (AKS) adalah layanan Kubernetes terkelola yang memungkinkan Anda dengan cepat menyebarkan dan mengelola kluster Kubernetes. Dalam artikel ini, Anda akan:

  • Menyebarkan kluster AKS menggunakan Azure CLI yang menyertakan OpenID Koneksi Issuer dan ID Beban Kerja Microsoft Entra
  • Memberikan akses ke Azure Key Vault Anda
  • Membuat ID Beban Kerja Microsoft Entra dan akun layanan Kubernetes
  • Konfigurasikan identitas terkelola untuk federasi token.

Artikel ini mengasumsikan Anda memiliki pemahaman dasar tentang konsep Kubernetes. Untuk informasi lebih, lihat konsep inti Kubernetes untuk Azure Kubernetes Service (AKS). Jika Anda tidak terbiasa dengan ID Beban Kerja Microsoft Entra, lihat artikel Gambaran Umum berikut ini.

  • Artikel ini memerlukan Azure CLI versi 2.47.0 atau yang lebih baru. Jika menggunakan Azure Cloud Shell, versi terbaru sudah terinstal.

  • Identitas yang Anda gunakan untuk membuat kluster memiliki izin minimum yang sesuai. Untuk informasi selengkapnya tentang akses dan identitas untuk AKS, lihat Opsi akses dan identitas untuk Azure Kubernetes Service (AKS).

  • Jika Anda memiliki beberapa langganan Azure, pilih ID langganan yang sesuai di mana sumber daya harus ditagih menggunakan perintah akun az.

Catatan

Alih-alih mengonfigurasi semua langkah secara manual, ada implementasi lain yang disebut Service Koneksi or yang akan membantu Anda mengonfigurasi beberapa langkah secara otomatis dan mencapai hasil yang sama. Lihat juga: Tutorial: Koneksi ke akun penyimpanan Azure di Azure Kubernetes Service (AKS) dengan Service Koneksi or menggunakan identitas beban kerja.

Ekspor variabel lingkungan

Untuk membantu menyederhanakan langkah-langkah untuk mengonfigurasi identitas yang diperlukan, langkah-langkah di bawah ini menentukan variabel lingkungan untuk referensi pada kluster.

Jalankan perintah berikut untuk membuat variabel ini. Ganti nilai default untuk RESOURCE_GROUP, , LOCATIONSERVICE_ACCOUNT_NAME, SUBSCRIPTION, USER_ASSIGNED_IDENTITY_NAME, dan 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"

Membuat kluster AKS

Buat kluster AKS menggunakan perintah az aks create dengan --enable-oidc-issuer parameter untuk menggunakan Pengeluar Sertifikat OIDC. Contoh berikut membuat kluster bernama myAKSCluster dengan satu node di myResourceGroup:

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

Setelah beberapa menit, perintah selesai dan kembalikan informasi berformat JSON tentang kluster.

Catatan

Saat Anda membuat kluster AKS, grup sumber daya kedua secara otomatis dibuat untuk menyimpan sumber daya AKS. Untuk informasi selengkapnya, lihat Mengapa dua grup sumber daya dibuat dengan AKS?.

Memperbarui kluster AKS yang ada

Anda dapat memperbarui kluster AKS menggunakan perintah az aks update dengan --enable-oidc-issuer dan --enable-workload-identity parameter untuk menggunakan Pengeluar Sertifikat OIDC dan mengaktifkan identitas beban kerja. Contoh berikut memperbarui kluster bernama myAKSCluster:

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

Mengambil URL Pengeluar Sertifikat OIDC

Untuk mendapatkan URL Pengeluar Sertifikat OIDC dan menyimpannya ke variabel lingkungan, jalankan perintah berikut. Ganti nilai default untuk argumen -n, yang merupakan nama kluster:

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

Variabel harus berisi URL Penerbit yang mirip dengan contoh berikut:

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

Secara default, Penerbit diatur untuk menggunakan URL https://{region}.oic.prod-aks.azure.com/{tenant_id}/{uuid}dasar , di mana nilai untuk {region} mencocokkan lokasi tempat kluster AKS disebarkan. Nilai {uuid} mewakili kunci OIDC.

Buat identitas terkelola

Gunakan perintah az account set Azure CLI untuk mengatur langganan tertentu menjadi langganan aktif saat ini. Kemudian gunakan perintah az identity create untuk membuat identitas terkelola.

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

Selanjutnya, mari kita buat variabel untuk ID identitas terkelola.

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

Membuat akun layanan Kubernetes

Buat akun layanan Kubernetes dan anotasi dengan ID klien identitas terkelola yang dibuat pada langkah sebelumnya. Gunakan perintah az aks get-credentials dan ganti nilai untuk nama kluster dan nama grup sumber daya.

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

Salin dan tempel input multibaris berikut di Azure CLI.

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

Output berikut menyerupan pembuatan identitas yang berhasil:

serviceaccount/workload-identity-sa created

Menetapkan kredensial identitas federasi

Gunakan perintah az identity federated-credential create untuk membuat kredensial identitas federasi antara identitas terkelola, penerbit akun layanan, dan subjek.

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

Catatan

Dibutuhkan waktu beberapa detik agar info masuk identitas federasi dapat disebarluaskan setelah ditambahkan. Jika permintaan token dibuat segera setelah menambahkan kredensial identitas federasi, itu mungkin menyebabkan kegagalan selama beberapa menit karena cache diisi di direktori dengan data lama. Untuk menghindari masalah ini, Anda dapat menambahkan sedikit penundaan setelah menambahkan kredensial identitas federasi.

Menyebarkan aplikasi Anda

Saat Anda menyebarkan pod aplikasi, manifes harus mereferensikan akun layanan yang dibuat di langkah Buat akun layanan Kubernetes. Manifes berikut menunjukkan cara mereferensikan akun, khususnya metadata\namespace dan properti spec\serviceAccountName :

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

Penting

Pastikan pod aplikasi Anda yang menggunakan identitas beban kerja telah menambahkan label azure.workload.identity/use: "true" berikut ke spesifikasi pod Anda, jika tidak, pod gagal setelah di-restart.

Opsional - Memberikan izin untuk mengakses Azure Key Vault

Langkah ini diperlukan jika Anda perlu mengakses rahasia, kunci, dan sertifikat yang dipasang di Azure Key Vault dari pod. Lakukan langkah-langkah berikut untuk mengonfigurasi akses dengan identitas terkelola. Langkah-langkah ini mengasumsikan Anda memiliki Azure Key Vault yang sudah dibuat dan dikonfigurasi dalam langganan Anda. Jika Anda tidak memilikinya, lihat Membuat Azure Key Vault menggunakan Azure CLI.

Sebelum melanjutkan, Anda memerlukan informasi berikut:

  • Nama Key Vault
  • Grup sumber daya yang memegang Key Vault

Anda dapat mengambil informasi ini menggunakan perintah Azure CLI: az keyvault list.

  1. Atur kebijakan akses untuk identitas terkelola untuk mengakses rahasia di Key Vault Anda dengan menjalankan perintah berikut:

    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. Buat rahasia di Key Vault:

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

    export KEYVAULT_URL="$(az keyvault show -g ${KEYVAULT_RESOURCE_GROUP} -n ${KEYVAULT_NAME} --query properties.vaultUri -o tsv)"
    
  4. Sebarkan pod yang mereferensikan akun layanan dan URL Key Vault di atas:

    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
    

Untuk memeriksa apakah semua properti disuntikkan dengan benar oleh webhook, gunakan perintah kubectl describe :

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

Jika berhasil, output harus mirip dengan yang berikut ini:

      SECRET_NAME:                 ${KEYVAULT_SECRET_NAME}

Untuk memverifikasi bahwa pod mampu mendapatkan token dan mengakses sumber daya, gunakan perintah log kubectl:

kubectl logs quick-start

Jika berhasil, output harus mirip dengan yang berikut ini:

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

Menonaktifkan identitas beban kerja

Untuk menonaktifkan ID Beban Kerja Microsoft Entra pada kluster AKS tempat id tersebut diaktifkan dan dikonfigurasi, Anda dapat menjalankan perintah berikut:

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

Langkah berikutnya

Dalam artikel ini, Anda menyebarkan kluster Kubernetes dan mengonfigurasinya untuk menggunakan identitas beban kerja sebagai persiapan beban kerja aplikasi untuk mengautentikasi dengan kredensial tersebut. Sekarang Anda siap untuk menyebarkan aplikasi Anda dan mengonfigurasinya untuk menggunakan identitas beban kerja dengan versi terbaru pustaka klien Azure Identity . Jika Anda tidak dapat menulis ulang aplikasi untuk menggunakan versi pustaka klien terbaru, Anda dapat menyiapkan pod aplikasi untuk mengautentikasi menggunakan identitas terkelola dengan identitas beban kerja sebagai solusi migrasi jangka pendek.