Azure Kubernetes Service (AKS) kümenizde güvenlik açığı bulunan eski görüntüleri temizlemek için Görüntü Temizleyici'yi kullanma

Şunlar için geçerlidir: ✔️ AKS Otomatik ✔️ AKS Standart

Azure Kubernetes Service (AKS) kümelerinde görüntü oluşturmak ve dağıtmak için işlem hatlarını kullanmak yaygın bir durumdır. Görüntü oluşturma için harika olsa da, bu işlem genellikle geride kalan artık kullanılmayan görüntüleri hesaba katmaz ve küme düğümlerinde görüntü şişkinliğine yol açabilir. Bu görüntüler güvenlik açıkları içerebilir ve bu da güvenlik sorunları oluşturabilir. Kümelerinizdeki güvenlik risklerini kaldırmak için bu başvurulmayan görüntüleri temizleyebilirsiniz. Görüntüleri el ile temizlemek zaman alabilir. Görüntü Temizleyici, eski görüntü riskini azaltan ve bunları temizlemek için gereken süreyi azaltan otomatik görüntü tanımlama ve kaldırma işlemlerini gerçekleştirir.

AKS Otomatik, çoğu AKS iş yükü için önerilen üretime hazır varsayılan değerdir. Görüntü Temizleyici, güvenlik açıklarına sahip kullanılmayan görüntüleri varsayılan olarak kaldırmaya yardımcı olmak için AKS Otomatik kümelerinde önceden yapılandırılmıştır.

AKS Standart kümelerinde Görüntü Temizleyici isteğe bağlıdır ve bunu açıkça etkinleştirirsiniz.

AKS Automatic hakkında daha fazla bilgi için bkz. Azure Kubernetes Service (AKS) Automatic nedir?

Not

Görüntü Temizleyici, Silgi tabanlı bir özelliktir. AKS'de özellik adı ve özellik özelliği adı Image Cleaner'dır; ilgili Görüntü Temizleyici podlarının adlarında ise Eraser bulunur.

AKS Otomatik ve AKS Standart davranışı

Önkoşullar

  • Azure aboneliği. Azure aboneliğiniz yoksa ücretsiz hesap oluşturabilirsiniz.
  • Azure CLI aracılığıyla AKS Standart yapılandırması için Azure CLI sürüm 2.49.0 veya üzeri. Sürümünüzü bulmak için komutunu çalıştırın az --version . Yüklemeniz veya yükseltmeniz gerekirse, bkz. Azure CLI yükleme.

Sınırlamalar

Görüntü Temizleyici henüz Windows düğüm havuzlarını veya AKS sanal düğümlerini desteklemez.

Görüntü Temizleyici nasıl çalışır?

Kümenizde Image Cleaner'ı etkinleştirdiğinizde, eraser-controller-manager adlı bir denetleyici yöneticisi podu dağıtılır.

ImageCleaner'ın iş akışını gösteren diyagramın ekran görüntüsü. Kümede çalışan ImageCleaner podları bir ImageList oluşturabilir veya el ile giriş sağlanabilir.

Görüntü Temizleyici, otomatik ve el ile temizleme modlarını destekler.

AKS Standard için yapılandırma seçenekleri

Azure CLI ile AKS Standard'da Görüntü Temizleyici'yi yapılandırırken bu seçenekleri kullanın.

Veri Akışı Adı Açıklama Gerekli
--enable-image-cleaner AKS kümesi için Görüntü Temizleyici'yi etkinleştirme Evet, devre dışı bırak'ı belirtmediğiniz sürece
--disable-image-cleaner AKS kümesi için Görüntü Temizleyici'yi devre dışı bırakma Evet, enable belirtmediğiniz sürece.
--image-cleaner-interval-hours Zamanlanmış çalıştırmalar arasındaki saat cinsinden aralık. Azure CLI varsayılan değer bir haftadır. En az 24 saat. En fazla üç ay. Azure CLI için gerekli değildir; ARM şablonu veya diğer istemciler için gereklidir

Not

Görüntü Temizleyici'yi devre dışı bırakır ve daha sonra yapılandırmayı açıkça geçirmeden yeniden etkinleştirirseniz, önceki yapılandırma değeri yeniden kullanılır.

Otomatik mod

'yi dağıttığınızda eraser-controller-manager, Görüntü Temizleyici şu eylemleri otomatik olarak gerçekleştirir:

  • Temizlemeyi başlatır ve her düğüm için çalışan podları oluşturur eraser-aks-xxxxx .
  • Kullanılmayan görüntüleri toplamak için bir toplayıcı kapsayıcısı kullanır.
  • Trivy tarayıcı kapsayıcısını kullanarak güvenlik açıklarını trivy ile tarar.
  • Güvenlik açıkları bulunan kullanılmayan imajları kaldırmak için bir kaldırıcı kapsayıcısı kullanır.
  • Tamamlandıktan sonra worker podunu siler.
  • Bir sonraki temizlemeyi --image-cleaner-interval-hours öğesine göre planlar.

Manuel mod

Bir CRD nesnesi tanımlayarak temizlemeyi el ile tetikleyebilirsiniz.ImageList eraser-contoller-manager öğesini tetikleyerek her bir düğüm için eraser-aks-xxxxx çalışan podları oluşturur ve el ile kaldırma işlemini tamamlar.

Not

Görüntü Temizleyici devre dışı bırakıldıktan sonra eski yapılandırma hala var olur. Bu, yapılandırmayı açıkça geçirmeden özelliği yeniden etkinleştirirseniz varsayılan değer yerine mevcut değerin kullanıldığı anlamına gelir.

AKS Otomatik ve AKS Standard'da Görüntü Temizleyici kullanma

AKS Otomatik

Image Cleaner, çoğu AKS iş yükü için önerilen, üretime hazır varsayılan seçenek olan AKS Automatic kümelerinde önceden yapılandırılmıştır. Ayrı bir etkinleştirme komutu çalıştırmanız gerekmez.

AKS Otomatik kümesi oluşturmak için bkz. AKS Otomatik kümesi oluşturma.

Hedeflenen düzeltme veya işlem doğrulamasını istediğinizde bu makaledeki el ile temizleme ve izleme kılavuzunu kullanın.

AKS Standard: yeni bir kümede etkinleştirin

--enable-image-cleaner parametresiyle az aks create komutunu kullanarak yeni bir AKS Standard kümesinde Image Cleaner'ı etkinleştirin.

az aks create \
    --resource-group myResourceGroup \
    --name myManagedCluster \
    --enable-image-cleaner \
    --generate-ssh-keys

AKS Standard: Mevcut bir kümede etkinleştirme

komutunu kullanarak mevcut AKS Standart kümesinde Görüntü Temizleyici'yi az aks update etkinleştirin.

az aks update \
  --resource-group myResourceGroup \
  --name myManagedCluster \
  --enable-image-cleaner

AKS Standard: Yeni veya mevcut bir kümede güncelleştirme aralığı

parametresini kullanarak yeni veya mevcut bir AKS Standard kümesinde Görüntü Temizleme aralığını güncelleştirin --image-cleaner-interval-hours .

# Create a new cluster with specifying the interval
az aks create \
    --resource-group myResourceGroup \
    --name myManagedCluster \
    --enable-image-cleaner \
    --image-cleaner-interval-hours 48 \
    --generate-ssh-keys

# Update the interval on an existing cluster
az aks update \
    --resource-group myResourceGroup \
    --name myManagedCluster \
    --enable-image-cleaner \
    --image-cleaner-interval-hours 48

Görüntü Temizleyici'yi kullanarak görüntüleri el ile kaldırma

Önemli

name, imagelist olarak ayarlanmalıdır.

Aşağıdaki kubectl apply komutu kullanarak görüntüyü el ile kaldırın. Bu örnek, kullanılmayan görüntüyü kaldırır docker.io/library/alpine:3.7.3 .

cat <<EOF | kubectl apply -f -
apiVersion: eraser.sh/v1
kind: ImageList
metadata:
  name: imagelist
spec:
  images:
    - docker.io/library/alpine:3.7.3
EOF

El ile temizleme tek seferlik bir işlemdir ve yalnızca yeni imagelist bir oluşturulduğunda veya var olan imagelistiçinde değişiklik yapıldığında tetiklenir. Resim silindikten sonra imagelist otomatik olarak silinmez.

Başka bir manuel temizleme tetiklemeniz gerekiyorsa, yeni bir imagelist oluşturmanız veya mevcut olanı değiştirmeniz gerekir. Aynı görüntüyü yeniden kaldırmak istiyorsanız, yeni imagelistbir oluşturmanız gerekir.

Mevcut ImageList'i silme ve yeni bir tane oluşturma

  1. komutunu kullanarak eskisini imagelistkubectl delete silin.

    kubectl delete ImageList imagelist
    
  2. Aynı resim adına sahip yeni imagelist bir oluşturun. Aşağıdaki örnek, önceki örnekle aynı görüntüyü kullanır.

    cat <<EOF | kubectl apply -f -
    apiVersion: eraser.sh/v1
    kind: ImageList
    metadata:
      name: imagelist
    spec:
      images:
        - docker.io/library/alpine:3.7.3
    EOF
    

Mevcut ImageList'i değiştirme

Mevcut imagelist olanı kubectl edit komutunu kullanarak değiştirin.

kubectl edit ImageList imagelist

# Add a new image to the list
apiVersion: eraser.sh/v1
kind: ImageList
metadata:
  name: imagelist
spec:
  images:
      docker.io/library/python:alpine3.18

El ile modu kullanırken pod, eraser-aks-xxxxx çalışma tamamlandıktan sonra 10 dakika içinde silinir.

Görüntü dışlama listesi

Dışlama listesinde belirtilen görüntüler kümeden kaldırılmaz. Görüntü Temizleyici, sistem ve kullanıcı tanımlı dışlama listelerini destekler. Sistem dışlama listesini düzenlemek desteklenmez.

Sistem dışlama listesini denetleyin

Aşağıdaki kubectl get komutu kullanarak sistem dışlama listesini denetleyin.

kubectl get -n kube-system configmap eraser-system-exclusion -o yaml

Kullanıcı tanımlı dışlama listesi oluşturma

  1. Dışlanan görüntüleri içerecek örnek bir JSON dosyası oluşturun.

    cat > sample.json <<EOF
    {"excluded": ["excluded-image-name"]}
    EOF
    
  2. Aşağıdaki configmap ve kubectl create komutunu kullanarak örnek JSON dosyasını kullanarak bir kubectl label oluşturun.

    kubectl create configmap excluded --from-file=sample.json --namespace=kube-system
    kubectl label configmap excluded eraser.sh/exclude.list=true -n kube-system
    

AKS Standard'da Görüntü Temizleyiciyi Devre Dışı Bırakma

AKS Standart kümesinde Görüntü Temizleyici'yi, --disable-image-cleaner parametresiyle az aks update komutunu kullanarak devre dışı bırakın.

az aks update \
  --resource-group myResourceGroup \
  --name myManagedCluster \
  --disable-image-cleaner

Sık sorulan sorular (SSS)

AKS Otomatik'te Görüntü Temizleyici varsayılan olarak etkin mi?

Evet. Görüntü Temizleyici AKS Otomatik kümelerinde önceden yapılandırılmıştır.

AKS Otomatik'te Görüntü Temizleyici için etkinleştirme komutlarını çalıştırmam gerekiyor mu?

Hayır AKS Standard için etkinleştirme komutlarını kullanın.

Görüntü Temizleyici'nin hangi sürümü kullandığını nasıl denetleyebilirim?

kubectl describe configmap -n kube-system eraser-manager-config | grep tag -C 3

Görüntü Temizleyici, trivy-scanner dışında diğer güvenlik açığı tarayıcılarını destekliyor mu?

Hayır

Görüntülerin temizlenmesi için güvenlik açığı düzeylerini belirtebilir miyim?

Hayır Güvenlik açığı düzeyleri için varsayılan ayarlar şunlardır:

  • LOW,
  • MEDIUM,
  • HIGH ve
  • CRITICAL

Varsayılan ayarları özelleştiremezsiniz.

Görüntü Temizleyicisi tarafından temizlenen görüntüleri gözden geçirme

Görüntü günlükleri çalışan podunda eraser-aks-xxxxx depolanır. Etkin olduğunda eraser-aks-xxxxx , silme günlüklerini görüntülemek için aşağıdaki komutları çalıştırabilirsiniz:

kubectl logs -n kube-system <worker-pod-name> -c collector
kubectl logs -n kube-system <worker-pod-name> -c trivy-scanner
kubectl logs -n kube-system <worker-pod-name> -c remover

Çalışma tamamlandıktan sonra pod, eraser-aks-xxxxx 10 dakika içinde silinir. Azure İzleyici eklentisini etkinleştirmek ve Container Insights pod günlük tablosunu kullanmak için bu adımları izleyebilirsiniz. Bundan sonra, geçmiş günlükler depolanır ve eraser-aks-xxxxx silinse bile bunları gözden geçirebilirsiniz.

  1. Kümenizde Azure İzleyici etkinleştirildiğinden emin olun. Ayrıntılı adımlar için bkz . AKS kümelerinde Container Insights'ı etkinleştirme.

  2. Varsayılan olarak, kube-system ad alanında çalışan kapsayıcıların günlükleri toplanmaz. Yapılandırma haritasında, exclude_namespaces içinden kube-system ad alanını kaldırın ve bu günlüklerin toplanmasını etkinleştirmek için yapılandırma haritasını uygulayın. Ayrıntılar için Kapsayıcı içgörüleri veri toplamayı yapılandırma bölümüne bakın.

  3. komutunu kullanarak az aks show Log Analytics kaynak kimliğini alın.

      az aks show --resource-group myResourceGroup --name myManagedCluster
    

    Birkaç dakika sonra komut, çalışma alanı kaynak kimliği de dahil olmak üzere çözümle ilgili JSON biçimli bilgileri döndürür:

    "addonProfiles": {
      "omsagent": {
        "config": {
          "logAnalyticsWorkspaceResourceID": "/subscriptions/<WorkspaceSubscription>/resourceGroups/<DefaultWorkspaceRG>/providers/Microsoft.OperationalInsights/workspaces/<defaultWorkspaceName>"
        },
        "enabled": true
      }
    }
    
  4. Azure portalında çalışma alanı kaynak kimliğini arayın ve günlükler'i seçin.

  5. Aşağıdaki sorgulardan birini kopyalayın ve sorgu penceresine yapıştırın.

    • Kümeniz ContainerLogV2 şemasını kullanıyorsa aşağıdaki sorguyu kullanın. Hâlâ ContainerLog kullanıyorsanız, ContainerLogV2'ye yükseltin.

      ContainerLogV2
      | where PodName startswith "eraser-aks-" and PodNamespace == "kube-system"
      | project TimeGenerated, PodName, LogMessage, LogSource
      
    • kullanmaya ContainerLogdevam etmek istiyorsanız, bunun yerine aşağıdaki sorguyu kullanın:

      let startTimestamp = ago(1h);
      KubePodInventory
      | where TimeGenerated > startTimestamp
      | project ContainerID, PodName=Name, Namespace
      | where PodName startswith "eraser-aks-" and Namespace == "kube-system"
      | distinct ContainerID, PodName
      | join
      (
          ContainerLog
          | where TimeGenerated > startTimestamp
      )
      on ContainerID
      // at this point before the next pipe, columns from both tables are available to be "projected". Due to both
      // tables having a "Name" column, we assign an alias as PodName to one column which we actually want
      | project TimeGenerated, PodName, LogEntry, LogEntrySource
      | summarize by TimeGenerated, LogEntry
      | order by TimeGenerated desc
       ```
      
      
  6. Çalıştır seçin. Silinen görüntü günlükleri Sonuçlar alanında görünür.