Menggunakan identitas yang dikelola pod Microsoft Entra di Azure Kubernetes Service (Pratinjau)

Identitas yang dikelola pod Microsoft Entra menggunakan primitif Kubernetes untuk mengaitkan identitas terkelola untuk sumber daya dan identitas Azure di ID Microsoft Entra dengan pod. Administrator membuat identitas dan pengikatan sebagai primitif Kubernetes yang memungkinkan pod mengakses sumber daya Azure yang mengandalkan ID Microsoft Entra sebagai penyedia identitas.

Penting

Sebaiknya tinjau ID Beban Kerja Microsoft Entra. Metode autentikasi ini menggantikan identitas yang dikelola pod (pratinjau), yang terintegrasi dengan kemampuan asli Kubernetes untuk bergabung dengan penyedia identitas eksternal atas nama aplikasi.

Identitas yang dikelola pod Sumber terbuka Microsoft Entra (pratinjau) di Azure Kubernetes Service tidak digunakan lagi pada 24/10/2022, dan proyek diarsipkan pada Bulan September 2023. Untuk informasi selengkapnya, lihat pemberitahuan penghentian. Add-on Terkelola AKS mulai dihentikan pada 2024.

Untuk menonaktifkan add-on Terkelola AKS, gunakan perintah berikut: az feature unregister --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview".

Sebelum Anda mulai

Anda harus menginstal Azure CLI versi 2.20.0 atau yang lebih baru.

Pembatasan

  • Maksimal 200 identitas yang dikelola pod diizinkan untuk kluster.
  • Maksimal 200 pengecualian identitas yang dikelola pod diizinkan untuk kluster.
  • Identitas yang dikelola Pod hanya tersedia di kumpulan node Linux.
  • Fitur ini hanya didukung untuk kluster yang didukung Virtual Machine Scale Sets.

Menginstal ekstensi Azure CLI pratinjau aks

Penting

Fitur pratinjau AKS tersedia berdasarkan layanan mandiri. Pratinjau disediakan "apa adanya" dan "sebagaimana tersedia," dan mereka dikecualikan dari perjanjian tingkat layanan dan garansi terbatas. Pratinjau AKS sebagian dicakup oleh dukungan pelanggan berdasarkan upaya terbaik. Dengan demikian, fitur-fitur ini tidak dimaksudkan untuk penggunaan produksi. Untuk informasi lebih lanjut, lihat artikel dukungan berikut ini:

Untuk menginstal ekstensi aks-preview, jalankan perintah berikut:

az extension add --name aks-preview

Jalankan perintah berikut untuk memperbarui ke versi terbaru ekstensi yang dirilis:

az extension update --name aks-preview

Daftarkan bendera fitur 'EnablePodIdentityPreview'

Daftarkan EnablePodIdentityPreview bendera fitur dengan menggunakan perintah daftar fitur az, seperti yang ditunjukkan dalam contoh berikut:

az feature register --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

Dibutuhkan beberapa menit agar status menampilkan Terdaftar. Verifikasi status pendaftaran dengan menggunakan perintah az feature show :

az feature show --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

Saat status mencerminkan Terdaftar, refresh pendaftaran penyedia sumber daya Microsoft.ContainerService dengan menggunakan perintah az provider register :

az provider register --namespace Microsoft.ContainerService

Opsi mode operasi

Identitas yang dikelola pod Microsoft Entra mendukung dua mode operasi:

  • Mode Standar: Dalam mode ini, dua komponen berikut disebarkan ke kluster AKS:
    • Pengontrol Identitas Terkelola (MIC):MIC adalah pengontrol Kubernetes yang mengawasi perubahan pod, AzureIdentity dan AzureIdentityBinding melalui Server API Kubernetes. Saat MIC mendeteksi perubahan yang relevan, MIC akan menambahkan atau menghapus AzureAssignedIdentity sesuai kebutuhan. Secara khusus, ketika pod dijadwalkan, MIC menetapkan identitas terkelola di Azure ke Set Skala Komputer Virtual yang mendasar yang digunakan oleh kumpulan simpul selama fase pembuatan. Ketika semua pod yang menggunakan identitas dihapus, pod akan menghapus identitas dari Kumpulan Skala Komputer Virtual dari kumpulan simpul, kecuali identitas terkelola yang sama digunakan oleh pod lain. MIC mengambil tindakan serupa ketika AzureIdentity atau AzureIdentityBinding dibuat atau dihapus.
    • Identitas Terkelola Node (NMI):NMI adalah pod yang berjalan sebagai DaemonSet pada setiap node di kluster AKS. NMI mencegat permintaan token keamanan ke Azure Instance Metadata Service pada setiap simpul, mengalihkannya ke dirinya sendiri dan memvalidasi apakah pod memiliki akses ke identitas yang meminta token untuk dan mengambil token dari penyewa Microsoft Entra atas nama aplikasi.
  • Mode Terkelola:Mode ini hanya menawarkan NMI. Saat diinstal melalui add-on kluster AKS, Azure mengelola pembuatan primitif Kubernetes (AzureIdentity dan AzureIdentityBinding) dan penetapan identitas sebagai respons terhadap perintah CLI oleh pengguna. Jika tidak, jika diinstal melalui bagan Helm, identitas perlu ditetapkan dan dikelola secara manual oleh pengguna. Untuk informasi selengkapnya, lihat Identitas Pod dalam mode terkelola.

Saat Anda menginstal identitas yang dikelola pod Microsoft Entra melalui bagan Helm atau manifes YAML seperti yang ditunjukkan dalam Panduan Penginstalan, Anda dapat memilih antara standard mode dan managed . Jika Anda memutuskan untuk menginstal identitas yang dikelola pod Microsoft Entra menggunakan add-on kluster AKS seperti yang ditunjukkan dalam artikel ini, penyiapan akan menggunakan managed mode .

Membuat kluster AKS dengan Antarmuka Jaringan Kontainer Azure (CNI)

Catatan

Ini adalah konfigurasi yang disarankan default

Buat kluster AKS dengan Azure CNI dan identitas yang dikelola Pod diaktifkan. Perintah berikut menggunakan buat grup az untuk membuat grup sumber daya bernama myResourceGroup dan perintah buat az aks untuk membuat kluster AKS bernama myAKSCluster di grup sumber daya myResourceGroup.

az group create --name myResourceGroup --location eastus
az aks create -g myResourceGroup -n myAKSCluster --enable-pod-identity --network-plugin azure

Gunakan az aks get-credentials untuk masuk ke kluster AKS Anda. Perintah ini juga mengunduh dan mengonfigurasi sertifikat klien kubectl pada mesin lokal Anda.

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

Catatan

Saat Anda mengaktifkan identitas yang dikelola Pod pada kluster AKS, sebuah AzurePodIdentityException bernama aks-addon-exception ditambahkan ke namespace kube-system. AzurePodIdentityException memungkinkan pod dengan label tertentu mengakses titik akhir Azure Instance Metadata Service (IMDS) tanpa dintersepsi oleh server NMI. Aks-addon-exception memungkinkan addon pihak pertama AKS, seperti identitas yang dikelola pod Microsoft Entra, untuk beroperasi tanpa harus mengonfigurasi AzurePodIdentityException secara manual. Secara opsional, Anda dapat menambahkan, menghapus, dan memperbarui AzurePodIdentityException menggunakan az aks pod-identity exception add, az aks pod-identity exception delete, az aks pod-identity exception update. atau kubectl.

Memperbarui kluster AKS yang ada dengan Azure CNI

Perbarui kluster AKS yang ada dengan Azure CNI untuk menyertakan identitas yang dikelola Pod.

az aks update -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity

Menggunakan plugin jaringan Kubenet dengan identitas yang dikelola pod Microsoft Entra

Penting

Menjalankan identitas yang dikelola pod Microsoft Entra dalam kluster dengan Kubenet bukanlah konfigurasi yang direkomendasikan karena masalah keamanan. Konfigurasi Kubenet default gagal mencegah spoofing ARP, yang dapat digunakan oleh pod untuk bertindak sebagai pod lain dan mendapatkan akses ke identitas yang tidak seharusnya dimiliki. Ikuti langkah-langkah mitigasi dan konfigurasikan kebijakan sebelum mengaktifkan identitas yang dikelola pod Microsoft Entra dalam kluster dengan Kubenet.

Mitigasi

Untuk mengurangi kerentanan pada tingkat kluster, Anda dapat menggunakan kebijakan bawaan Azure "Kontainer kluster Kubernetes hanya boleh menggunakan kemampuan yang diizinkan" untuk membatasis serangan CAP_NET_RAW.

Menambahkan NET_RAW ke "Kemampuan menghilnagkan yang diperlukan"

image

Jika Anda tidak menggunakan Azure Policy, Anda dapat menggunakan pengontrol penerimaan OpenPolicyAgent bersama dengan Gatekeeper memvalidasi webhook. Asalkan Anda memiliki Gatekeeper yang sudah terinstal di kluster Anda, tambahkan ConstraintTemplate jenis K8sPSPCapabilities:

kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper-library/master/library/pod-security-policy/capabilities/template.yaml

Tambahkan template untuk membatasi spawning Pod dengan kemampuan NET_RAW:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPCapabilities
metadata:
  name: prevent-net-raw
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    excludedNamespaces:
      - "kube-system"
  parameters:
    requiredDropCapabilities: ["NET_RAW"]

Buat kluster AKS dengan plugin jaringan Kubenet

Buat kluster AKS dengan plugin jaringan Kubenet dan identitas yang dikelola Pod diaktifkan.

az aks create -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet

Perbarui kluster AKS yang ada dengan plugin jaringan Kubenet

Perbarui kluster AKS yang ada dengan plugin jaringan Kubenet untuk menyertakan identitas terkelola pod.

az aks update -g $MY_RESOURCE_GROUP -n $MY_CLUSTER --enable-pod-identity --enable-pod-identity-with-kubenet

Buat Identitas

Penting

Anda harus memiliki izin yang relevan (misalnya, Pemilik) pada langganan Anda untuk membuat identitas.

Buat identitas yang akan digunakan oleh pod demo dengan az identity create dan atur variabel IDENTITY_CLIENT_ID dan IDENTITY_RESOURCE_ID.

az group create --name myIdentityResourceGroup --location eastus
export IDENTITY_RESOURCE_GROUP="myIdentityResourceGroup"
export IDENTITY_NAME="application-identity"
az identity create --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME}
export IDENTITY_CLIENT_ID="$(az identity show -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME} --query clientId -otsv)"
export IDENTITY_RESOURCE_ID="$(az identity show -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME} --query id -otsv)"

Menetapkan izin untuk identitas terkelola

Identitas terkelola yang akan ditetapkan ke pod perlu diberikan izin yang selaras dengan tindakan yang akan diambil.

Untuk menjalankan demo, identitas terkelola IDENTITY_CLIENT_ID harus memiliki izin Kontributor Komputer Virtual dalam grup sumber daya yang berisi Set Skala Komputer Virtual kluster AKS Anda.

# Obtain the name of the resource group containing the Virtual Machine Scale set of your AKS cluster, commonly called the node resource group
NODE_GROUP=$(az aks show -g myResourceGroup -n myAKSCluster --query nodeResourceGroup -o tsv)

# Obtain the id of the node resource group 
NODES_RESOURCE_ID=$(az group show -n $NODE_GROUP -o tsv --query "id")

# Create a role assignment granting your managed identity permissions on the node resource group
az role assignment create --role "Virtual Machine Contributor" --assignee "$IDENTITY_CLIENT_ID" --scope $NODES_RESOURCE_ID

Membuat identitas Pod

Buat identitas yang dikelola pod untuk kluster menggunakan az aks pod-identity add.

export POD_IDENTITY_NAME="my-pod-identity"
export POD_IDENTITY_NAMESPACE="my-app"
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME} --identity-resource-id ${IDENTITY_RESOURCE_ID}

Catatan

“POD_IDENTITY_NAME” harus valid nama subdomain DNS seperti didefinisikan dalam RFC 1123.

Catatan

Saat Anda menetapkan identitas yang dikelola pod dengan menggunakan pod-identity add, Azure CLI mencoba memberikan peran Operator Identitas Terkelola atas identitas yang dikelola pod (IDENTITY_RESOURCE_ID) ke identitas kluster.

Azure akan membuat sumber daya AzureIdentity di kluster Anda yang mewakili identitas di Azure, dan sumber daya AzureIdentityBinding yang menyambungkan AzureIdentity ke pemilih. Anda dapat melihat sumber daya ini dengan

kubectl get azureidentity -n $POD_IDENTITY_NAMESPACE
kubectl get azureidentitybinding -n $POD_IDENTITY_NAMESPACE

Jalankan aplikasi contoh

Agar pod dapat menggunakan identitas yang dikelola pod Microsoft Entra, pod memerlukan label aadpodidbinding dengan nilai yang cocok dengan pemilih dari AzureIdentityBinding. Secara default, pemilih akan cocok dengan nama identitas yang dikelola pod, tetapi juga dapat diatur menggunakan --binding-selector opsi saat memanggil az aks pod-identity add.

Untuk menjalankan aplikasi sampel menggunakan identitas yang dikelola pod Microsoft Entra, buat demo.yaml file dengan konten berikut. Ganti POD_IDENTITY_NAME, IDENTITY_CLIENT_ID, dan IDENTITY_RESOURCE_GROUP dengan nilai dari langkah-langkah sebelumnya. Ganti SUBSCRIPTION_ID dengan ID langganan Anda.

Catatan

Pada langkah-langkah sebelumnya, Anda membuat variabel POD_IDENTITY_NAME, IDENTITY_CLIENT_ID, dan IDENTITY_RESOURCE_GROUP. Anda dapat menggunakan perintah seperti echo untuk menampilkan nilai yang Anda tetapkan untuk variabel, misalnya echo $POD_IDENTITY_NAME.

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    aadpodidbinding: $POD_IDENTITY_NAME
spec:
  containers:
  - name: demo
    image: mcr.microsoft.com/oss/azure/aad-pod-identity/demo:v1.6.3
    args:
      - --subscriptionid=$SUBSCRIPTION_ID
      - --clientid=$IDENTITY_CLIENT_ID
      - --resourcegroup=$IDENTITY_RESOURCE_GROUP
    env:
      - name: MY_POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name
      - name: MY_POD_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace
      - name: MY_POD_IP
        valueFrom:
          fieldRef:
            fieldPath: status.podIP
  nodeSelector:
    kubernetes.io/os: linux

Perhatikan definisi pod memiliki label aadpodidbinding dengan nilai yang cocok dengan nama identitas yang dikelola pod yang Anda jalankan az aks pod-identity add di langkah sebelumnya.

Sebarkan demo.yaml ke namespace yang sama dengan identitas yang dikelola pod Anda menggunakan kubectl apply:

kubectl apply -f demo.yaml --namespace $POD_IDENTITY_NAMESPACE

Verifikasi bahwa aplikasi contoh berhasil dijalankan menggunakan kubectl logs.

kubectl logs demo --follow --namespace $POD_IDENTITY_NAMESPACE

Pastikan log menunjukkan token berhasil diperoleh dan operasi GET berhasil.

...
successfully doARMOperations vm count 0
successfully acquired a token using the MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token)
successfully acquired a token, userAssignedID MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token) clientID(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
successfully made GET on instance metadata
...

Jalankan aplikasi dengan beberapa identitas

Untuk mengaktifkan aplikasi agar dapat menggunakan beberapa identitas, atur --binding-selector ke pemilih yang sama saat membuat identitas pod.

az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME_1} --identity-resource-id ${IDENTITY_RESOURCE_ID_1} --binding-selector myMultiIdentitySelector
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME_2} --identity-resource-id ${IDENTITY_RESOURCE_ID_2} --binding-selector myMultiIdentitySelector

Kemudian atur bidang aadpodidbinding di YAML pod Anda ke pemilih ikatan yang Anda tentukan.

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    aadpodidbinding: myMultiIdentitySelector
...

Menonaktifkan identitas yang dikelola pod pada kluster yang ada

Untuk menonaktifkan identitas yang dikelola pod pada kluster yang ada, hapus identitas yang dikelola pod dari kluster. Kemudian nonaktifkan fitur pada kluster.

az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az aks update --resource-group myResourceGroup --name myAKSCluster --disable-pod-identity

Penghapusan

Untuk menghapus identitas yang dikelola pod Microsoft Entra dari kluster Anda, hapus aplikasi sampel dan identitas yang dikelola pod dari kluster. Kemudian hapus identitas dan penetapan peran identitas kluster.

kubectl delete pod demo --namespace $POD_IDENTITY_NAMESPACE
az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
az identity delete -g ${IDENTITY_RESOURCE_GROUP} -n ${IDENTITY_NAME}
az role assignment delete --role "Managed Identity Operator" --assignee "$IDENTITY_CLIENT_ID" --scope "$IDENTITY_RESOURCE_ID"

Langkah berikutnya

Untuk informasi selengkapnya tentang identitas terkelola, lihat Identitas terkelola untuk sumber daya Azure.