Aracılığıyla paylaş


Çekme gizli dizisi kullanarak Azure kapsayıcı kayıt defterinden Kubernetes kümesine görüntü çekme

Küçükube ve kind gibi "yerel" Kubernetes kümeleri de dahil olmak üzere herhangi bir Kubernetes kümesiyle kapsayıcı görüntülerinin kaynağı olarak azure kapsayıcı kayıt defterini kullanabilirsiniz. Bu makalede, Azure kapsayıcı kayıt defteri için kimlik bilgilerini kullanarak Kubernetes çekme gizli dizisi oluşturma adımları gösterilmektedir. Ardından, pod dağıtımındaki bir Azure kapsayıcı kayıt defterinden görüntü çekmek için gizli diziyi kullanın.

Bu örnek, Microsoft Entra hizmet sorumlusu kimlik bilgilerini kullanarak bir çekme gizli dizisi oluşturur. Ayrıca, depo kapsamlı erişim belirteci gibi diğer Azure kapsayıcı kayıt defteri kimlik bilgilerini kullanarak bir çekme gizli dizisi yapılandırabilirsiniz.

Dekont

Çekme gizli dizileri yaygın olarak kullanılır ancak ek yönetim yükü getirir. Azure Kubernetes Service kullanıyorsanız, her pod üzerinde ek imagePullSecrets bir ayar olmadan görüntüyü güvenli bir şekilde çekmek için kümenin yönetilen kimliğini veya hizmet sorumlusunu kullanma gibi diğer seçenekleri öneririz.

Ön koşullar

Bu makalede, özel bir Azure kapsayıcı kayıt defteri oluşturduğunuz varsayılır. Ayrıca, komut satırı aracı aracılığıyla kubectl çalışan ve erişilebilen bir Kubernetes kümeniz olması gerekir.

Hizmet sorumlusu oluşturma

Kapsayıcı kayıt defterinize erişimi olan bir hizmet sorumlusu oluşturmak için Azure Cloud Shell'de aşağıdaki betiği veya Azure CLI'nın yerel yüklemesini çalıştırın. Betik Bash kabuğu için biçimlendirilir.

Betiği çalıştırmadan önce değişkeni kapsayıcı kayıt defterinizin adıyla güncelleştirin ACR_NAME . Değer SERVICE_PRINCIPAL_NAME , Microsoft Entra kiracınızda benzersiz olmalıdır. "'http://acr-service-principal' already exists." hatası alırsanız hizmet sorumlusu için farklı bir ad belirtin.

Farklı izinler vermek istiyorsanız, isteğe bağlı olarak az ad sp create-for-rbac komutundaki değeri değiştirebilirsiniz--role. Rollerin tam listesi için bkz . ACR rolleri ve izinleri.

Betiği çalıştırdıktan sonra hizmet sorumlusunun kimliğini ve parolasını not alın. Kimlik bilgilerine sahip olduktan sonra, uygulama ve hizmetlerinizi hizmet sorumlusu olarak kapsayıcı kayıt defterinizde kimlik doğrulaması yapmak üzere yapılandırabilirsiniz.

#!/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"

Mevcut hizmet sorumlusunu kullanma

Mevcut hizmet sorumlusuna kayıt defteri erişimi vermek için hizmet sorumlusuna yeni bir rol atamanız gerekir. Yeni bir hizmet sorumlusu oluştururken olduğu gibi çekme, gönderme ve çekme ve sahip erişimi de ve diğerleri arasında yer alabilirsiniz.

Aşağıdaki betik, değişkende SERVICE_PRINCIPAL_ID belirttiğiniz bir hizmet sorumlusuna çekme izinleri vermek için az role assignment create komutunu kullanır. --role Farklı bir erişim düzeyi vermek istiyorsanız değeri ayarlayın.

#!/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

Hizmet sorumlusu parolasını kaydetmezseniz veya anımsamıyorsanız az ad sp credential reset komutuyla parolayı sıfırlayabilirsiniz :

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

Bu komut, hizmet sorumlunuz için yeni ve geçerli bir parola döndürür.

Görüntü çekme gizli dizisi oluşturma

Kubernetes, kayıt defterinizde kimlik doğrulaması yapmak için gereken bilgileri depolamak için bir görüntü çekme gizli dizisi kullanır. Azure kapsayıcı kayıt defteri için çekme gizli dizisi oluşturmak için hizmet sorumlusu kimliğini, parolasını ve kayıt defteri URL'sini sağlarsınız.

Aşağıdaki kubectl komutla bir görüntü çekme gizli dizisi oluşturun:

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>

konumu:

Değer Tanım
secret-name Görüntü çekme gizli dizisinin adı( örneğin, acr-secret)
namespace Gizli diziyi yerleştirecek Kubernetes ad alanı
Yalnızca gizli diziyi varsayılan ad alanı dışında bir ad alanına yerleştirmek istiyorsanız gereklidir
container-registry-name Azure kapsayıcı kayıt defterinizin adı, örneğin myregistry

--docker-server, kayıt defteri oturum açma sunucusunun tam adıdır
service-principal-ID Kubernetes tarafından kayıt defterinize erişmek için kullanılacak hizmet sorumlusunun kimliği
service-principal-password Hizmet sorumlusu parolası

Görüntü çekme gizli dizisini kullanma

Görüntü çekme gizli dizisini oluşturduktan sonra Kubernetes podları ve dağıtımları oluşturmak için kullanabilirsiniz. Dağıtım dosyasında altındaki imagePullSecrets gizli dizinin adını belirtin. Örnek:

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

Yukarıdaki örnekte, my-awesome-app:v1 Azure kapsayıcı kayıt defterinden çekilmesi gereken görüntünün adı ve acr-secret kayıt defterine erişmek için oluşturduğunuz çekme gizli dizisinin adıdır. Pod'u dağıttığınızda Kubernetes, kümede zaten yoksa görüntüyü kayıt defterinizden otomatik olarak çeker.

Sonraki adımlar