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
- Untuk selengkapnya tentang bekerja dengan perwakilan layanan dan Azure Container Registry, lihat autentikasi Azure Container Registry dengan perwakilan layanan
- Pelajari selengkapnya tentang rahasia penarikan gambar dalam dokumentasi Kubernetes