Bagikan melalui


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. Artikel ini menunjukkan cara:

  • Sebarkan kluster AKS menggunakan Azure CLI dengan penerbit OpenID Connect dan ID Beban Kerja Microsoft Entra.
  • Buat ID Beban Kerja Microsoft Entra dan akun layanan Kubernetes.
  • Konfigurasikan identitas terkelola untuk federasi token.
  • Sebarkan beban kerja dan verifikasi autentikasi dengan identitas beban kerja.
  • Secara opsional memberikan pod dalam akses kluster ke rahasia di brankas kunci Azure.

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.

Prasyarat

  • Jika Anda tidak memiliki Langganan Azure, buat Akun gratis Azure sebelum memulai.
  • Artikel ini memerlukan Azure CLI versi 2.47.0 atau yang lebih baru. Jika menggunakan Azure Cloud Shell, versi terbaru sudah terinstal.
  • Pastikan bahwa identitas yang Anda gunakan untuk membuat kluster Anda 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 tempat sumber daya harus ditagih menggunakan perintah az account set .

Catatan

Anda dapat menggunakan Konektor Layanan untuk membantu Mengonfigurasi beberapa langkah secara otomatis. Lihat juga: Tutorial: Menyambungkan ke akun penyimpanan Azure di Azure Kubernetes Service (AKS) dengan Konektor Layanan menggunakan identitas beban kerja.

Mengatur langganan aktif

Pertama, atur langganan Anda sebagai langganan aktif saat ini dengan memanggil perintah az account set dan meneruskan ID langganan Anda.

az account set --subscription <subscription-id>

Ekspor variabel lingkungan

Untuk membantu menyederhanakan langkah-langkah untuk mengonfigurasi identitas yang diperlukan, langkah-langkah di bawah ini menentukan variabel lingkungan yang direferensikan dalam contoh dalam artikel ini. Ingatlah untuk mengganti nilai yang ditampilkan dengan nilai Anda sendiri:

export RESOURCE_GROUP="myResourceGroup"
export LOCATION="eastus"
export CLUSTER_NAME="myAKSCluster"
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"
# Include these variables to access key vault secrets from a pod in the cluster.
export KEYVAULT_NAME="keyvault-workload-id"
export KEYVAULT_SECRET_NAME="my-secret"

Buat grup sumber daya

Grup sumber daya Azure adalah grup logis tempat sumber daya Azure disebarkan dan dikelola. Saat membuat grup sumber daya, Anda diminta untuk menentukan lokasi. Lokasi ini adalah lokasi penyimpanan metadata grup sumber daya Anda dan tempat sumber daya Anda berjalan di Azure jika Anda tidak menentukan wilayah lain selama pembuatan sumber daya.

Buat grup sumber daya dengan memanggil perintah az group create :

az group create --name "${RESOURCE_GROUP}" --location "${LOCATION}"

Contoh output berikut menunjukkan keberhasilan pembuatan grup sumber daya:

{
  "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup",
  "location": "eastus",
  "managedBy": null,
  "name": "myResourceGroup",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null
}

Membuat kluster AKS

Buat kluster AKS menggunakan perintah az aks create dengan --enable-oidc-issuer parameter untuk mengaktifkan pengeluar sertifikat OIDC. Contoh berikut membuat kluster dengan satu simpul:

az aks create \
    --resource-group "${RESOURCE_GROUP}" \
    --name "${CLUSTER_NAME}" \
    --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 untuk menggunakan pengeluar sertifikat OIDC dan mengaktifkan identitas beban kerja dengan memanggil perintah az aks update dengan --enable-oidc-issuer parameter dan --enable-workload-identity . Contoh berikut memperbarui kluster yang ada:

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

Mengambil URL penerbit OIDC

Untuk mendapatkan URL penerbit OIDC dan menyimpannya ke variabel lingkungan, jalankan perintah berikut:

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

Variabel lingkungan harus berisi URL penerbit, 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, yang merupakan guid yang dihasilkan secara acak untuk setiap kluster yang tidak dapat diubah.

Buat identitas terkelola

Panggil 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, buat variabel untuk ID klien identitas terkelola.

export USER_ASSIGNED_CLIENT_ID="$(az identity show \
    --resource-group "${RESOURCE_GROUP}" \
    --name "${USER_ASSIGNED_IDENTITY_NAME}" \
    --query 'clientId' \
    --output 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 --name "${CLUSTER_NAME}" --resource-group "${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 menunjukkan keberhasilan pembuatan identitas beban kerja:

serviceaccount/workload-identity-sa created

Membuat kredensial identitas federasi

Panggil perintah az identity federated-credential create untuk membuat kredensial identitas federasi antara identitas terkelola, penerbit akun layanan, dan subjek. Untuk informasi selengkapnya tentang kredensial identitas gabungan di Microsoft Entra, lihat Gambaran Umum kredensial identitas federasi di ID Microsoft Entra.

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 beberapa detik agar kredensial identitas federasi disebarluaskan setelah ditambahkan. Jika permintaan token dibuat segera setelah menambahkan kredensial identitas federasi, permintaan mungkin gagal sampai cache di-refresh. 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 properti metadata\namespace dan spec\serviceAccountName . Pastikan untuk menentukan gambar untuk <image> dan nama kontainer untuk <containerName>:

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

Penting

Pastikan pod aplikasi yang menggunakan identitas beban kerja menyertakan label azure.workload.identity/use: "true" dalam spesifikasi pod. Jika tidak, pod akan gagal setelah di-restart.

Memberikan izin untuk mengakses Azure Key Vault

Instruksi dalam langkah ini menunjukkan cara mengakses rahasia, kunci, atau sertifikat dalam brankas kunci Azure dari pod. Contoh di bagian ini mengonfigurasi akses ke rahasia di brankas kunci untuk identitas beban kerja, tetapi Anda dapat melakukan langkah serupa untuk mengonfigurasi akses ke kunci atau sertifikat.

Contoh berikut menunjukkan cara menggunakan model izin kontrol akses berbasis peran Azure (Azure RBAC) untuk memberikan akses pod ke brankas kunci. Untuk informasi selengkapnya tentang model izin Azure RBAC untuk Azure Key Vault, lihat Memberikan izin ke aplikasi untuk mengakses brankas kunci Azure menggunakan Azure RBAC.

  1. Buat brankas kunci dengan perlindungan penghapusan menyeluruh dan otorisasi RBAC diaktifkan. Anda juga dapat menggunakan brankas kunci yang ada jika dikonfigurasi untuk perlindungan penghapusan menyeluruh dan otorisasi RBAC:

    export KEYVAULT_RESOURCE_GROUP="myResourceGroup"
    export KEYVAULT_NAME="myKeyVault"
    
    az keyvault create \
        --name "${KEYVAULT_NAME}" \
        --resource-group "${KEYVAULT_RESOURCE_GROUP}" \
        --location "${LOCATION}" \
        --enable-purge-protection \
        --enable-rbac-authorization
    
  2. Tetapkan diri Anda peran Petugas Rahasia RBAC Key Vault sehingga Anda dapat membuat rahasia di brankas kunci baru:

    export KEYVAULT_RESOURCE_ID=$(az keyvault show --resource-group "${KEYVAULT_RESOURCE_GROUP}" \
        --name "${KEYVAULT_NAME}" \
        --query id \
        --output tsv)
    
    az role assignment create --assignee "\<user-email\>" \
        --role "Key Vault Secrets Officer" \
        --scope "${KEYVAULT_RESOURCE_ID}"
    
  3. Buat rahasia di brankas kunci:

    export KEYVAULT_SECRET_NAME="my-secret"
    
    az keyvault secret set \
        --vault-name "${KEYVAULT_NAME}" \
        --name "${KEYVAULT_SECRET_NAME}" \
        --value "Hello\!"
    
  4. Tetapkan peran Pengguna Rahasia Key Vault ke identitas terkelola yang ditetapkan pengguna yang Anda buat sebelumnya. Langkah ini memberikan izin identitas terkelola untuk membaca rahasia dari brankas kunci:

    export IDENTITY_PRINCIPAL_ID=$(az identity show \
        --name "${USER_ASSIGNED_IDENTITY_NAME}" \
        --resource-group "${RESOURCE_GROUP}" \
        --query principalId \
        --output tsv)
    
    az role assignment create \
        --assignee-object-id "${IDENTITY_PRINCIPAL_ID}" \
        --role "Key Vault Secrets User" \
        --scope "${KEYVAULT_RESOURCE_ID}" \
        --assignee-principal-type ServicePrincipal
    
  5. Buat variabel lingkungan untuk URL brankas kunci:

    export KEYVAULT_URL="$(az keyvault show \
        --resource-group ${KEYVAULT_RESOURCE_GROUP} \
        --name ${KEYVAULT_NAME} \
        --query properties.vaultUri \
        --output tsv)"
    
  6. Sebarkan pod yang mereferensikan akun layanan dan URL brankas kunci:

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: sample-workload-identity-key-vault
      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 sample-workload-identity-key-vault | 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 sample-workload-identity-key-vault

Jika berhasil, output harus mirip dengan yang berikut ini:

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

Penting

Penetapan peran Azure RBAC dapat memakan waktu hingga sepuluh menit untuk disebarluaskan. Jika pod tidak dapat mengakses rahasia, Anda mungkin perlu menunggu penetapan peran disebarluaskan. Untuk informasi selengkapnya, lihat Memecahkan Masalah Azure RBAC.

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 "${CLUSTER_NAME}" \
    --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.

Integrasi Konektor Layanan membantu menyederhanakan konfigurasi koneksi untuk beban kerja AKS dan layanan dukungan Azure. Ini dengan aman menangani konfigurasi autentikasi dan jaringan dan mengikuti praktik terbaik untuk menyambungkan ke layanan Azure. Untuk informasi selengkapnya, lihat Menyambungkan ke Layanan Azure OpenAI di AKS menggunakan Identitas Beban Kerja dan pengenalan Konektor Layanan.