Image Cleaner를 사용하여 AKS(Azure Kubernetes Service) 클러스터에서 취약한 부실 이미지를 정리합니다.
파이프라인을 사용하여 AKS(Azure Kubernetes Service) 클러스터에서 이미지를 빌드하고 배포하는 것이 일반적입니다. 이미지 생성에 적합하지만 이 프로세스는 남아 있는 부실 이미지를 고려하지 않는 경우가 많으며 클러스터 노드에서 이미지 비대화를 초래할 수 있습니다. 이러한 이미지에는 보안 문제를 일으킬 수 있는 취약성이 포함되어 있을 수 있습니다. 클러스터의 보안 위험을 제거하려면 참조되지 않은 이미지를 정리하면 됩니다. 이미지를 수동으로 정리하는 데는 시간이 많이 걸릴 수 있습니다. Image Cleaner는 자동 이미지 식별 및 제거를 수행하여 부실한 이미지의 위험을 완화하고 이미지 정리에 필요한 시간을 줄여줍니다.
참고 항목
Image Cleaner는 지우개를 기반으로 하는 기능입니다.
AKS 클러스터에서 기능 이름 및 속성 이름은 Image Cleaner
이고 관련 Image Cleaner Pod의 이름에는 Eraser
가 포함됩니다.
필수 구성 요소
- Azure 구독 Azure 구독이 없는 경우 무료 계정을 만들 수 있습니다.
- Azure CLI, 버전 2.49.0 이상.
az --version
를 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.
제한 사항
Image Cleaner는 아직 Windows 노드 풀 또는 AKS 가상 노드를 지원하지 않습니다.
Image Cleaner 작동 방식
Image Cleaner를 사용하도록 설정하면 eraser-controller-manager
라는 컨트롤러 관리자 Pod가 클러스터에 배포됩니다.
Image Cleaner를 사용하면 수동 및 자동 모드와 다음 구성 옵션 중에서 선택할 수 있습니다.
구성 옵션
이름 | 설명 | 필수 |
---|---|---|
--enable-image-cleaner |
AKS 클러스터에 대해 Image Cleaner 기능 사용 | 예, 비활성화가 지정되지 않는 한 |
--disable-image-cleaner |
AKS 클러스터에 대해 Image Cleaner 기능 사용 안 함 | 예, 활성화가 지정되지 않는 한 |
--image-cleaner-interval-hours |
이 매개 변수는 Image Cleaner가 실행하는 데 사용하는 간격 시간(시간)을 결정합니다. Azure CLI의 기본값은 1주일이고, 최솟값은 24시간이며, 최댓값은 3개월입니다. | ARM 템플릿 또는 기타 클라이언트에 필요한 Azure CLI에는 필요하지 않습니다. |
자동 모드
eraser-controller-manager
가 배포되면 다음 단계가 자동으로 수행됩니다.
- 즉시 정리 프로세스를 시작하고 각 노드에 대해
eraser-aks-xxxxx
작업자 Pod를 만듭니다. - 각 작업자 Pod에는 세 개의 컨테이너가 있습니다.
- collector - 사용되지 않은 이미지를 수집합니다.
- trivy-scanner - trivy를 활용하여 이미지 취약성을 검사합니다.
- remover - 취약성이 있는 사용되지 않는 이미지를 제거합니다.
- 정리 프로세스가 완료되면 작업자 Pod가 삭제되고 정의한
--image-cleaner-interval-hours
에 따라 다음 예약 정리가 수행됩니다.
수동 모드
CRD 개체, ImageList
를 정의하여 정리를 수동으로 트리거할 수 있습니다. 그러면 eraser-contoller-manager
가 트리거되어 각 노드에 대해 eraser-aks-xxxxx
작업자 Pod를 만들고 수동 제거 프로세스를 완료합니다.
참고 항목
Image Cleaner를 사용하지 않도록 설정한 후에도 이전 구성은 계속 존재합니다. 즉, 구성을 명시적으로 전달하지 않고 기능을 다시 사용하도록 설정하면 기본값 대신 기존 값이 사용됩니다.
AKS 클러스터에서 Image Cleaner 활성화
새 클러스터에서 Image Cleaner 사용
--enable-image-cleaner
매개 변수와 함께az aks create
명령을 사용하여 새 AKS 클러스터에서 Image Cleaner를 사용하도록 설정합니다.az aks create \ --resource-group myResourceGroup \ --name myManagedCluster \ --enable-image-cleaner \ --generate-ssh-keys
기존 클러스터에서 Image Cleaner 사용
az aks update
명령을 사용하여 기존 AKS 클러스터에서 Image Cleaner를 사용하도록 설정합니다.az aks update \ --resource-group myResourceGroup \ --name myManagedCluster \ --enable-image-cleaner
새 클러스터 또는 기존 클러스터에서 Image Cleaner 간격 업데이트
--image-cleaner-interval-hours
매개 변수를 사용하여 새 AKS 클러스터 또는 기존 AKS 클러스터에서 Image Cleaner 간격을 업데이트합니다.# 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
Image Cleaner를 사용하여 수동으로 이미지 제거
Important
name
값은 imagelist
로 설정해야 합니다.
다음
kubectl apply
명령을 사용하여 이미지를 수동으로 제거합니다. 이 예에서는 사용되지 않은 경우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
수동 정리는 일회성 작업이며 새 imagelist
가 만들어지거나 기존 imagelist
가 변경될 때만 트리거됩니다. 이미지가 삭제된 후에도 imagelist
는 자동으로 삭제되지 않습니다.
또 다른 수동 정리를 실행해야 하는 경우 새 imagelist
를 만들거나 기존 항목을 변경해야 합니다. 동일한 이미지를 다시 제거하려면 새 imagelist
를 만들어야 합니다.
기존 ImageList를 삭제하고 새 ImageList를 만듭니다.
kubectl delete
명령을 사용하여 이전imagelist
를 삭제합니다.kubectl delete ImageList imagelist
동일한 이미지 이름으로 새
imagelist
를 만듭니다. 다음 예에서는 이전 예와 동일한 이미지를 사용합니다.cat <<EOF | kubectl apply -f - apiVersion: eraser.sh/v1 kind: ImageList metadata: name: imagelist spec: images: - docker.io/library/alpine:3.7.3 EOF
기존 ImageList 수정
kubectl edit
명령을 사용하여 기존imagelist
를 수정합니다.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
수동 모드를 사용하는 경우 작업 완료 후 10분 이내에 eraser-aks-xxxxx
Pod가 삭제됩니다.
이미지 제외 목록
제외 목록에 지정된 이미지는 클러스터에서 제거되지 않습니다. Image Cleaner는 시스템 및 사용자 정의 제외 목록을 지원합니다. 시스템 제외 목록 편집은 지원되지 않습니다.
시스템 제외 목록 확인
다음
kubectl get
명령을 사용하여 시스템 제외 목록을 확인합니다.kubectl get -n kube-system configmap eraser-system-exclusion -o yaml
사용자 정의 제외 목록 만들기
제외된 이미지를 포함하는 샘플 JSON 파일을 만듭니다.
cat > sample.json <<EOF {"excluded": ["excluded-image-name"]} EOF
다음
kubectl create
및kubectl label
명령을 사용하여 샘플 JSON 파일을 사용하여configmap
을 만듭니다.kubectl create configmap excluded --from-file=sample.json --namespace=kube-system kubectl label configmap excluded eraser.sh/exclude.list=true -n kube-system
Image Cleaner 사용 안 함
--disable-image-cleaner
매개 변수와 함께az aks update
명령을 사용하여 클러스터에서 Image Cleaner를 사용하지 않도록 설정합니다.az aks update \ --resource-group myResourceGroup \ --name myManagedCluster \ --disable-image-cleaner
FAQ
Image Cleaner가 어떤 버전을 사용하고 있는지 어떻게 확인할 수 있나요?
kubectl describe configmap -n kube-system eraser-manager-config | grep tag -C 3
Image Cleaner는 trivy-scanner 외에 다른 취약성 스캐너를 지원하나요?
아니요.
정리할 이미지의 취약성 수준을 지정할 수 있나요?
아니요. 취약성 수준의 기본 설정은 다음과 같습니다.
LOW
;MEDIUM
;HIGH
및CRITICAL
기본 설정은 사용자 지정할 수 없습니다.
Image Cleaner로 정리된 이미지를 검토하는 방법은 무엇인가요?
이미지 로그는 eraser-aks-xxxxx
작업자 Pod에 저장됩니다. eraser-aks-xxxxx
가 활성 상태이면 다음 명령을 실행하여 삭제 로그를 볼 수 있습니다.
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
eraser-aks-xxxxx
Pod는 작업 완료 후 10분 이내에 삭제됩니다. 다음 단계에 따라 Azure Monitor 추가 기능을 사용하도록 설정하고 Container Insights Pod 로그 테이블을 사용할 수 있습니다. 그 후에는 기록 로그가 저장되며 eraser-aks-xxxxx
가 삭제되어도 검토할 수 있습니다.
클러스터에서 Azure 모니터링이 사용하도록 설정되어 있는지 확인합니다. 자세한 단계는 AKS 클러스터에 Container Insights 사용을 참조하세요.
az aks show
명령을 사용하여 Log Analytics 리소스 ID를 가져옵니다.az aks show --resource-group myResourceGroup --name myManagedCluster
몇 분 후 명령은 작업 영역 리소스 ID를 포함하여 솔루션에 대한 JSON 형식 정보를 반환합니다.
"addonProfiles": { "omsagent": { "config": { "logAnalyticsWorkspaceResourceID": "/subscriptions/<WorkspaceSubscription>/resourceGroups/<DefaultWorkspaceRG>/providers/Microsoft.OperationalInsights/workspaces/<defaultWorkspaceName>" }, "enabled": true } }
Azure Portal 작업 영역 리소스 ID를 검색한 다음 로그를 선택합니다.
다음 쿼리를 테이블에 복사하고
name
을eraser-aks-xxxxx
(작업자 Pod 이름)로 바꿉니다.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
실행을 선택합니다. 삭제된 이미지 로그는 모두 결과 영역에 표시됩니다.
Azure Kubernetes Service