Bagikan melalui


Gunakan Image Cleaner untuk membersihkan gambar basi yang rentan pada kluster Azure Kubernetes Service (AKS)

Adalah hal yang umum untuk menggunakan alur untuk membuat dan menyebarkan citra pada kluster Azure Kubernetes Service (AKS). Meskipun bagus untuk pembuatan citra, proses ini sering tidak mempertanggungjawabkan citra kedaluwarsa yang tertinggal dan dapat menyebabkan citra membengkak pada node kluster. Gambar-gambar ini mungkin berisi kerentanan, yang mungkin membuat masalah keamanan. Untuk menghapus risiko keamanan di kluster, Anda dapat membersihkan gambar yang tidak direferensikan ini. Membersihkan gambar secara manual dapat memakan waktu intensif. Image Cleaner melakukan identifikasi dan penghapusan gambar otomatis, yang mengurangi risiko gambar kedaluarsa dan mengurangi waktu yang diperlukan untuk membersihkannya.

Catatan

Image Cleaner adalah fitur berdasarkan Eraser. Pada kluster AKS, nama fitur dan nama properti adalah Image Cleaner, sementara nama pod Image Cleaner yang relevan berisi Eraser.

Prasyarat

  • Langganan Azure. Jika Anda tidak memiliki langganan Azure, Anda dapat membuat akun gratis.
  • Azure CLI versi 2.49.0 atau yang lebih baru. Jalankan az --version untuk menemukan versi Anda. Jika Anda perlu memasang atau meningkatkan, lihat Memasang Azure CLI.

Batasan

Image Cleaner belum mendukung kumpulan simpul Windows atau simpul virtual AKS.

Cara kerja Image Cleaner

Setelah Anda mengaktifkan Image Cleaner, akan ada pod manajer pengontrol bernama eraser-controller-manager yang disebarkan ke kluster Anda.

Cuplikan layar diagram memperlihatkan alur kerja ImageCleaner. Pod ImageCleaner yang berjalan pada kluster dapat menghasilkan ImageList, atau input manual dapat disediakan.

Dengan Image Cleaner, Anda dapat memilih antara mode manual dan otomatis dan opsi konfigurasi berikut:

Opsi konfigurasi

Nama Deskripsi Wajib diisi
--enable-image-cleaner Mengaktifkan fitur Image Cleaner untuk kluster AKS Ya, kecuali ditentukan dinonaktifkan
--disable-image-cleaner Menonaktifkan fitur Image Cleaner untuk kluster AKS Ya, kecuali ditentukan dinonaktifkan
--image-cleaner-interval-hours Parameter ini menentukan waktu interval (dalam jam) yang digunakan Image Cleaner untuk dijalankan. Nilai default untuk Azure CLI adalah satu minggu, nilai minimumnya adalah 24 jam dan maksimumnya adalah tiga bulan. Tidak diperlukan untuk Azure CLI, diperlukan untuk templat ARM atau klien lain

Mode otomatis

Setelah eraser-controller-manager disebarkan, langkah-langkah berikut akan diambil secara otomatis:

  • Ini segera memulai proses pembersihan dan membuat eraser-aks-xxxxx pod pekerja untuk setiap simpul.
  • Ada tiga kontainer di setiap pod pekerja:
    • Kolektor, yang mengumpulkan gambar yang tidak digunakan.
    • Pemindai trivy, yang memanfaatkan trivy untuk memindai kerentanan gambar.
    • Penghapus, yang menghapus gambar yang tidak digunakan dengan kerentanan.
  • Setelah proses pembersihan selesai, pod pekerja dihapus dan pembersihan terjadwal berikutnya terjadi sesuai dengan yang --image-cleaner-interval-hours Anda tentukan.

Mode manual

Anda dapat memicu pembersihan secara manual dengan menentukan objek CRD,ImageList. Ini memicu eraser-contoller-manager untuk membuat eraser-aks-xxxxx pod pekerja untuk setiap simpul dan menyelesaikan proses penghapusan manual.

Catatan

Setelah menonaktifkan Image Cleaner, konfigurasi lama masih ada. Ini berarti jika Anda mengaktifkan fitur lagi tanpa meneruskan konfigurasi secara eksplisit, nilai yang ada digunakan alih-alih default.

Mengaktifkan Image Cleaner pada kluster AKS Anda

Mengaktifkan Image Cleaner pada kluster baru

  • Aktifkan Image Cleaner pada kluster AKS baru menggunakan az aks create perintah dengan --enable-image-cleaner parameter .

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

Mengaktifkan Image Cleaner pada kluster yang ada

  • Aktifkan Image Cleaner pada kluster AKS yang ada menggunakan az aks update perintah .

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

Memperbarui interval Image Cleaner pada kluster baru atau yang sudah ada

  • Perbarui interval Image Cleaner pada kluster AKS baru atau yang sudah ada menggunakan --image-cleaner-interval-hours parameter .

    # 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
    

Menghapus gambar secara manual menggunakan Image Cleaner

Penting

name harus diatur ke imagelist.

  • Hapus gambar secara manual menggunakan perintah berikut kubectl apply . Contoh ini menghapus docker.io/library/alpine:3.7.3 gambar jika tidak digunakan.

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

Pembersihan manual adalah operasi satu kali dan hanya dipicu ketika baru imagelist dibuat atau perubahan dilakukan pada imagelist. Setelah gambar dihapus, imagelist tidak akan dihapus secara otomatis.

Jika Anda perlu memicu pembersihan manual lain, Anda harus membuat perubahan baru imagelist atau membuat perubahan pada yang sudah ada. Jika Anda ingin menghapus gambar yang sama lagi, Anda perlu membuat baru imagelist.

Menghapus ImageList yang sudah ada dan membuat yang baru

  1. Hapus yang lama imagelist menggunakan kubectl delete perintah .

    kubectl delete ImageList imagelist
    
  2. Buat baru imagelist dengan nama gambar yang sama. Contoh berikut menggunakan gambar yang sama dengan contoh sebelumnya.

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

Mengubah ImageList yang sudah ada

  • Ubah yang sudah ada imagelist menggunakan kubectl edit perintah .

    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
    

Saat menggunakan mode manual, eraser-aks-xxxxx pod akan dihapus dalam waktu 10 menit setelah penyelesaian pekerjaan.

Daftar pengecualian gambar

Gambar yang ditentukan dalam daftar pengecualian tidak dihapus dari kluster. Image Cleaner mendukung sistem dan daftar pengecualian yang ditentukan pengguna. Tidak didukung untuk mengedit daftar pengecualian sistem.

Periksa daftar pengecualian sistem

  • Periksa daftar pengecualian sistem menggunakan perintah berikut kubectl get .

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

Membuat daftar pengecualian yang ditentukan pengguna

  1. Buat sampel file JSON untuk berisi gambar yang dikecualikan.

    cat > sample.json <<EOF
    {"excluded": ["excluded-image-name"]}
    EOF
    
  2. configmap Buat menggunakan sampel file JSON menggunakan perintah dan kubectl label berikut.kubectl create

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

Nonaktifkan Image Cleaner

  • Nonaktifkan Image Cleaner pada kluster Anda menggunakan az aks update perintah dengan --disable-image-cleaner parameter .

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

FAQ

Bagaimana cara memeriksa versi mana yang digunakan Image Cleaner?

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

Apakah Image Cleaner mendukung pemindai kerentanan lainnya selain trivy-scanner?

Tidak.

Dapatkah saya menentukan tingkat kerentanan gambar untuk dibersihkan?

Tidak. Pengaturan default untuk tingkat kerentanan meliputi:

  • LOW,
  • MEDIUM,
  • HIGH, dan
  • CRITICAL

Anda tidak dapat menyesuaikan pengaturan default.

Bagaimana cara meninjau gambar yang dibersihkan oleh Image Cleaner?

Log gambar disimpan di eraser-aks-xxxxx pod pekerja. Saat eraser-aks-xxxxx masih hidup, Anda dapat menjalankan perintah berikut untuk melihat log penghapusan:

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

Pod eraser-aks-xxxxx akan dihapus dalam waktu 10 menit setelah penyelesaian pekerjaan. Anda dapat mengikuti langkah-langkah ini untuk mengaktifkan add-on Azure Monitor dan menggunakan tabel log pod Container Insights. Setelah itu, log historis akan disimpan dan Anda dapat meninjaunya bahkan eraser-aks-xxxxx dihapus.

  1. Pastikan Azure Monitoring diaktifkan di kluster Anda. Untuk langkah-langkah terperinci, lihat Mengaktifkan Container Insights pada kluster AKS.

  2. Dapatkan ID sumber daya Analitik Log menggunakan az aks show perintah .

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

    Setelah beberapa menit, perintah mengembalikan informasi berformat JSON tentang solusi, termasuk ID sumber daya ruang kerja:

    "addonProfiles": {
      "omsagent": {
        "config": {
          "logAnalyticsWorkspaceResourceID": "/subscriptions/<WorkspaceSubscription>/resourceGroups/<DefaultWorkspaceRG>/providers/Microsoft.OperationalInsights/workspaces/<defaultWorkspaceName>"
        },
        "enabled": true
      }
    }
    
  3. Di portal Azure, cari ID sumber daya ruang kerja, lalu pilih Log.

  4. Salin kueri berikut ke dalam tabel, ganti name dengan eraser-aks-xxxxx (nama pod pekerja):

    let startTimestamp = ago(1h);
    KubePodInventory
    | where TimeGenerated > startTimestamp
    | project ContainerID, PodName=Name, Namespace
    | where PodName contains "name" and Namespace startswith "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
    
  5. Pilih Jalankan. Setiap log gambar yang dihapus muncul di area Hasil .