Menarik gambar dari registri kontainer Azure ke kluster Kubernetes menggunakan rahasia penarikan

Anda dapat menggunakan registri kontainer Azure sebagai sumber gambar kontainer dengan kluster Kubernetes apa pun, termasuk kluster Kubernetes "lokal" seperti minikube dan kind. Artikel ini menunjukkan cara membuat rahasia penarikan Kubernetes menggunakan kredensial untuk registri kontainer Azure. Kemudian, gunakan rahasia untuk menarik gambar dari registri kontainer Azure dalam penyebaran pod.

Contoh ini membuat rahasia penarikan menggunakan kredensial perwakilan layanan Microsoft Entra. Anda juga dapat mengonfigurasi rahasia penarikan menggunakan kredensial registri kontainer Azure lainnya, seperti token akses cakupan repositori.

Catatan

Meski rahasia penarikan umumnya digunakan, rahasia tersebut menghasilkan overhead manajemen tambahan. Jika Anda menggunakan Azure Kubernetes Service, sebaiknya opsi lain seperti menggunakan identitas terkelola atau perwakilan layanan kluster untuk menarik image dengan aman tanpa imagePullSecrets pengaturan tambahan di setiap pod.

Prasyarat

Artikel ini mengasumsikan Anda sudah membuat registri kontainer Azure pribadi. Anda juga harus memiliki kluster Kubernetes yang berjalan dan dapat diakses melalui alat baris perintah kubectl.

Membuat perwakilan layanan

Untuk membuat perwakilan layanan dengan akses ke registri kontainer Anda, jalankan skrip berikut di Azure Cloud Shell atau penginstalan lokal Azure CLI. Skrip diformat untuk shell Bash.

Sebelum menjalankan skrip, perbarui variabel ACR_NAME ​​dengan nama registri kontainer Anda. Nilai SERVICE_PRINCIPAL_NAME harus unik dalam penyewa Microsoft Entra Anda. Jika Anda menerima kesalahan "'http://acr-service-principal' already exists.", tentukan nama yang berbeda untuk perwakilan layanan.

Anda dapat secara opsional mengubah nilai --role dalam perintah az ad sp create-for-rbac jika Anda ingin memberikan izin yang berbeda. Untuk daftar lengkap peran, lihat peran dan izin Azure Container Registry.

Setelah Anda menjalankan skrip, catat ID dan kata sandi perwakilan layanan. Setelah memiliki kredensialnya, Anda dapat mengonfigurasi aplikasi dan layanan untuk mengautentikasi ke registri kontainer Anda sebagai perwakilan layanan.

#!/bin/bash
# This script requires Azure CLI version 2.25.0 or later. Check version with `az --version`.

# Modify for your environment.
# ACR_NAME: The name of your Azure Container Registry
# SERVICE_PRINCIPAL_NAME: Must be unique within your AD tenant
ACR_NAME=$containerRegistry
SERVICE_PRINCIPAL_NAME=$servicePrincipal

# Obtain the full registry ID
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query "id" --output tsv)
# echo $registryId

# Create the service principal with rights scoped to the registry.
# Default permissions are for docker pull access. Modify the '--role'
# argument value as desired:
# acrpull:     pull only
# acrpush:     push and pull
# owner:       push, pull, and assign roles
PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query "password" --output tsv)
USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv)

# Output the service principal's credentials; use these in your services and
# applications to authenticate to the container registry.
echo "Service principal ID: $USER_NAME"
echo "Service principal password: $PASSWORD"

Menggunakan perwakilan layanan yang ada

Untuk memberikan akses registri ke perwakilan layanan yang ada, Anda harus menetapkan peran baru ke perwakilan layanan. Seperti halnya membuat perwakilan layanan baru, Anda dapat memberikan antara lain tarik, dorong dan tarik, dan akses pemilik.

Skrip berikut menggunakan perintah az role assignment create untuk memberikan izin pull kepada perwakilan layanan yang Anda tentukan dalam variabel SERVICE_PRINCIPAL_ID. Sesuaikan nilai --role jika Anda ingin memberikan tingkat akses yang berbeda.

#!/bin/bash
# Modify for your environment. The ACR_NAME is the name of your Azure Container
# Registry, and the SERVICE_PRINCIPAL_ID is the service principal's 'appId' or
# one of its 'servicePrincipalNames' values.
ACR_NAME=$containerRegistry
SERVICE_PRINCIPAL_ID=$servicePrincipal

# Populate value required for subsequent command args
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)

# Assign the desired role to the service principal. Modify the '--role' argument
# value as desired:
# acrpull:     pull only
# acrpush:     push and pull
# owner:       push, pull, and assign roles
az role assignment create --assignee $SERVICE_PRINCIPAL_ID --scope $ACR_REGISTRY_ID --role acrpull

Jika tidak menyimpan atau mengingat kata sandi utama layanan, Anda dapat meresetnya dengan perintah reset kredensial az ad sp:

az ad sp credential reset  --name http://<service-principal-name> --query password --output tsv

Perintah ini mengembalikan kata sandi baru yang valid untuk perwakilan layanan.

Membuat rahasia penarikan citra

Kubernetes menggunakan rahasia penarikan gambar untuk menyimpan informasi yang diperlukan untuk diautentikasi ke registri. Untuk membuat rahasia penarikan registri kontainer Azure, Anda menyediakan ID perwakilan layanan, kata sandi, dan URL registri.

Buat rahasia penarikan gambar dengan perintah kubectl berikut:

kubectl create secret docker-registry <secret-name> \
    --namespace <namespace> \
    --docker-server=<container-registry-name>.azurecr.io \
    --docker-username=<service-principal-ID> \
    --docker-password=<service-principal-password>

di mana:

Nilai Deskripsi
secret-name Namai rahasia penarikan gambar, misalnya, acr-secret
namespace Namespace Layanan Kubernetes untuk memasukkan rahasia
Hanya diperlukan jika Anda ingin menempatkan rahasia di namespace selain namespace default
container-registry-name Namai registri kontainer Azure, misalnya, myregistry

Ini --docker-server nama yang sepenuhnya memenuhi syarat dari server masuk registri
service-principal-ID ID perwakilan layanan yang akan digunakan oleh Kubernetes untuk mengakses registri
service-principal-password Kata sandi perwakilan layanan

Menggunakan rahasia penarikan gambar

Setelah membuat rahasia penarikan gambar, Anda bisa menggunakannya untuk membuat pod dan penyebaran Kubernetes. Berikan nama rahasia di bawah imagePullSecrets dalam file penyebaran. Contohnya:

apiVersion: v1
kind: Pod
metadata:
  name: my-awesome-app-pod
  namespace: awesomeapps
spec:
  containers:
    - name: main-app-container
      image: myregistry.azurecr.io/my-awesome-app:v1
      imagePullPolicy: IfNotPresent
  imagePullSecrets:
    - name: acr-secret

Dalam contoh sebelumnya, my-awesome-app:v1 adalah nama gambar untuk ditarik dari registri kontainer Azure, dan acr-secret merupakan nama rahasia penarikan yang Anda buat untuk mengakses registri. Ketika Anda menyebarkan pod, Kubernetes menarik gambar secara otomatis dari registri, jika belum ada di kluster.

Langkah berikutnya