프라이빗 컨테이너 레지스트리 인증 문제

Donghyun Choi 20 평판 포인트
2026-09-23T07:43:59.96+00:00

서비스 계정을 교체한 이후부터 Kubernetes에서 프라이빗 컨테이너 레지스트리의 이미지를 가져올 때 401 Unauthorized 오류가 발생하고 있습니다. 기존에 사용하던 imagePullSecrets에는 이전 서비스 계정의 인증 정보가 저장되어 있는 것 같은데, 모든 Deployment를 수동으로 수정하지 않고 새로운 인증 정보로 imagePullSecrets를 자동으로 갱신할 수 있는 방법이 있을까요?

특히 여러 Namespace와 클러스터에서 동일한 레지스트리를 사용하고 있어, Secret을 동적으로 업데이트하거나 서비스 계정 변경 시 자동으로 새로운 인증 정보를 반영할 수 있는 권장 방법이 궁금합니다.

비즈니스용 Windows | Windows 365 Enterprise
댓글 0개 설명 없음

답변 2개

정렬 기준: 가장 유용함
  1. Daphne Huynh (WICLOUD CORPORATION) 1,570 평판 포인트 Microsoft 외부 직원 중재자
    2026-09-24T07:03:35.75+00:00

    Microsoft Q&A에 오신 것을 환영합니다!

    추가적인 세부 정보와 시나리오를 명확히 설명해 주셔서 감사합니다.

    추가로 남겨주신 질문은 중요한 차이점을 짚고 있습니다. 말씀하신 것처럼 Secret을 수동으로 업데이트하거나 ServiceAccount에 연결하는 것은 자격 증명이 참조되는 방식을 변경할 뿐입니다. 이러한 작업만으로는 여러 Namespace 또는 클러스터에 걸친 자동 자격 증명 순환(credential rotation)이나 중앙 집중식 동기화를 제공하지 않습니다.

    여기서 고려해야 할 사항은 크게 두 가지입니다.

    • 레지스트리 자격 증명이 자동으로 배포되고 갱신되는 방법
    • 인증 문제로 인해 이미지 가져오기(image pull)가 이미 실패한 후 워크로드가 어떻게 복구되는지

    1. Kubernetes는 기본적으로 imagePullSecrets를 자동 갱신하지 않습니다

    imagePullSecret은 Kubernetes가 이미지를 가져올 때 사용하는 Namespace 범위의 Secret (일반적으로 kubernetes.io/dockerconfigjson 유형)입니다. Kubernetes는 이러한 자격 증명을 사용할 수 있지만, 외부 서비스 계정의 변경을 자동으로 감지하여 레지스트리 자격 증명을 갱신하고 이를 여러 Namespace나 클러스터에 전파하는 기본 제공 메커니즘은 포함하고 있지 않습니다.

    즉, Secret 이름을 동일하게 유지하더라도 Secret 내용 자체를 업데이트하기 위한 외부 자동화는 여전히 필요합니다.

    일반적으로 사용되는 방법은 다음과 같습니다.

    • External Secrets Operator 또는 유사한 비밀 동기화 솔루션

    Azure Key Vault, HashiCorp Vault, AWS Secrets Manager 또는 Google Secret Manager와 같은 중앙 집중식 비밀 저장소에 레지스트리 자격 증명을 저장합니다. External Secrets Operator와 같은 연산자는 해당 자격 증명을 주기적으로 동기화하여 대상 Namespace의 Kubernetes Secret으로 반영할 수 있습니다.

    • GitOps 기반 관리(Flux, Argo CD 등)

    GitOps 도구를 사용하면 여러 클러스터와 Namespace 간에 Secret 리소스 또는 ExternalSecret 정의가 일관되게 유지되도록 보장할 수 있습니다. 이 방식을 사용하는 경우에는 일반적으로 레지스트리 암호를 Git 저장소에 직접 저장하기보다는 중앙에서 관리되는 Secret을 참조하는 방식을 권장합니다.

    • Admission Controller

    Mutating Admission Webhook은 Pod 생성 시 imagePullSecrets를 자동으로 주입하거나 지정된 ServiceAccount를 할당할 수 있습니다. 이는 구성의 일관성을 유지하는 데 도움이 되지만, 실제 자격 증명을 갱신하지는 않습니다. Secret 수명 주기 관리는 여전히 별도의 자동화 메커니즘이 필요합니다.

    • 사용자 지정 Operator 또는 자격 증명 갱신 Controller

    짧은 수명의 자격 증명을 발급하는 레지스트리의 경우, 일부 조직에서는 토큰을 주기적으로 갱신하고 Secret을 자동으로 업데이트하는 사용자 지정 Controller를 구현합니다. 이 방식은 효과적일 수 있지만 RBAC 권한, 모니터링, 자격 증명 만료 처리, 다중 클러스터 동기화와 같은 추가 운영 고려 사항이 필요합니다.

    2. AKS 및 Azure Container Registry에 대한 권장 방식

    동일한 Microsoft Entra 테넌트 내에서 Azure Kubernetes Service (AKS)가 Azure Container Registry (ACR)의 이미지를 가져오는 환경이라면, 가능한 경우 정적 imagePullSecrets 사용을 피하는 것이 일반적으로 권장됩니다.

    대신 AKS는 클러스터의 kubelet 관리 ID (Managed Identity)를 사용하여 ACR에 직접 인증할 수 있습니다. 이 방식은 Namespace 전반에 걸쳐 레지스트리 자격 증명을 배포하고 갱신해야 하는 필요성을 제거합니다.

    ABAC가 활성화되지 않은 레지스트리의 경우 kubelet ID에는 일반적으로 AcrPull 역할이 필요합니다. ABAC가 활성화된 레지스트리의 경우 az aks --attach-acr 명령이 리포지토리 수준의 ABAC 권한을 자동으로 구성하지 않으므로 적절한 Repository Reader 역할을 별도로 할당해야 합니다.

    이 ID 기반 모델은 인증이 Namespace 범위의 Secret이 아니라 노드 ID 수준에서 수행되므로 일반적으로 확장성이 더 뛰어나고 관리가 용이합니다. 또한 관리 ID는 Image Pull Secret보다 더 선호되며 보안성이 높은 방식으로 간주됩니다.

    3. Secret이 업데이트되면 어떤 일이 발생할까요?

    이 또한 중요한 부분입니다.

    동일한 이름의 Secret을 업데이트하면 이후의 이미지 가져오기 작업은 새로운 자격 증명을 사용할 수 있습니다. 그러나 Kubernetes는 이미 실패한 이미지 가져오기 작업에 대해 업데이트된 레지스트리 자격 증명을 즉시 "핫 리로드(hot-reload)"하는 기능을 제공하지 않습니다.

    다음과 같은 상황을 구분해서 이해하는 것이 도움이 됩니다.

    • 정상적으로 실행 중인 컨테이너는 재스케줄링, 재생성 또는 노드 관련 이벤트로 인해 이미지를 다시 가져와야 하는 경우가 아니라면 일반적으로 레지스트리 인증을 다시 수행하지 않습니다.
    • ErrImagePull 또는 ImagePullBackOff 상태의 Pod는 이미지 가져오기 프로세스를 성공적으로 완료하지 못한 상태입니다.
    • 자격 증명이 수정된 이후에도 kubelet은 지수 백오프(exponential backoff) 방식으로 이미지 가져오기를 계속 재시도하며, 이후 재시도에서 업데이트된 자격 증명을 사용하여 성공할 수 있습니다.

    다만 현재 Kubernetes에는 새로운 이미지 가져오기 시도를 발생시키지 않고 기존에 실패한 이미지 가져오기 작업이 업데이트된 자격 증명을 즉시 다시 로드하도록 강제하는 API는 없습니다.

    Secret을 업데이트하거나 레지스트리 권한을 수정한 후에는 다음 명령으로 Pod 이벤트를 확인하여 현재 상태를 점검할 수 있습니다.

    kubectl describe pod <pod-name> -n <namespace>

    AKS 및 ACR 환경에서는 다음 명령을 사용하여 레지스트리 접근 상태를 검증할 수도 있습니다.

    az aks check-acr \

    --resource-group <resource-group> \

    --name <aks-cluster> \

    --acr <registry-name>.azurecr.io

    즉각적인 복구가 필요하고 kubelet의 재시도 주기를 기다리고 싶지 않은 경우에는, 일반적으로 영향을 받은 Pod를 다시 생성하여 새로운 이미지 가져오기 작업이 시작되도록 합니다.

    kubectl rollout restart deployment/<deployment-name> -n <namespace>

    또는

    kubectl delete pod <pod-name> -n <namespace>

    Pod가 Deployment, StatefulSet, DaemonSet, Job 또는 다른 Controller에 의해 관리되는 경우 Kubernetes가 자동으로 새 Pod를 생성합니다.

    다음과 같은 설계를 권장드립니다.

    AKS와 ACR 환경의 경우:

    • 정적 Image Pull Secret 대신 AKS kubelet 관리 ID 사용을 우선 고려합니다.
    • 더 이상 사용하지 않는 서비스 주체(Service Principal)가 아닌 현재 활성 kubelet ID에 적절한 ACR 권한이 부여되어 있는지 확인합니다.
    • 환경 간 일관성을 위해 Infrastructure as Code (IaC)를 사용하여 ID 및 역할 할당을 관리합니다.
    • 변경 후에는 Pod 이벤트와 az aks check-acr를 사용하여 인증 상태를 검증합니다.

    외부 또는 서드파티 레지스트리의 경우:

    • 레지스트리 자격 증명을 중앙 집중식 비밀 관리 플랫폼에 저장합니다.
    • 외부 비밀 동기화 솔루션을 사용하여 자격 증명을 배포합니다.
    • ServiceAccount 또는 Admission Policy를 통해 고정된 Secret 이름을 참조하도록 구성합니다.
    • 동기화 상태와 자격 증명 만료 여부를 모니터링합니다.
    • 자격 증명 갱신 후 즉각적인 복구가 필요한 워크로드에 대해서는 제어된 재시작(Controlled Restart)을 고려합니다.

    이 설명이 현재 Kubernetes의 동작 방식과 대규모 환경에서 자격 증명 관리를 자동화할 수 있는 방법을 이해하는 데 도움이 되기를 바랍니다.

    참고 자료:

    AKS(Azure Kubernetes Service)와 Azure Container Registry 통합 - Azure Kubernetes Service | Microsoft Learn

    ACR 인증을 위한 Kubernetes 끌어오기 비밀 - Azure Container Registry | Microsoft Learn

    AKS 이미지 끌어오기 오류 문제 해결 - Azure | Microsoft Learn

    도움이 되셨다면 Accept Answer를 클릭해 주시기 바랍니다.

    Microsoft Q&A를 이용해 주셔서 감사합니다.

    참고: 이 답변은 번역 도구를 사용하여 번역되었습니다. 문법적 또는 의미상 오류가 있을 수 있는 점 양해 부탁드립니다. 감사합니다.

    이 대답이 도움이 되었나요?

    댓글 0개 설명 없음

  2. Chance Maurice Niyonzima 255 평판 포인트 독립 자문가
    2026-09-23T08:59:12.8066667+00:00

    안녕하세요, 최동현님.

    Microsoft Windows 포럼에 질문을 올려 주셔서 감사합니다!

    설명해 주신 상황으로 보면, 서비스 계정이 변경된 이후 기존 imagePullSecrets 에 저장된 인증 정보가 더 이상 유효하지 않아 Kubernetes가 프라이빗 레지스트리에서 이미지를 가져오는 과정에서 401 Unauthorized 오류를 반환하는 것으로 보입니다.

    여러 Namespace와 클러스터에서 동일한 레지스트리를 사용하고 있다면, 모든 Deployment를 수동으로 수정하는 방법보다는 Secret 관리 방식을 개선하는 것이 좋습니다.

    권장 확인 사항

    1. 현재 imagePullSecret 갱신

    우선 기존 Secret이 새로운 서비스 계정 자격 증명을 사용하고 있는지 확인합니다.

    kubectl get secret <secret-name> -n <namespace> -o yaml

    새로운 인증 정보로 Secret을 갱신한 후 동일한 Secret 이름을 유지하면, Deployment 정의를 수정하지 않고도 새로운 Pod 생성 시 최신 인증 정보를 사용하게 됩니다.

    2. ServiceAccount에 imagePullSecrets 연결

    여러 Deployment에서 동일한 ServiceAccount를 사용한다면 ServiceAccount에 imagePullSecrets를 연결하는 것이 관리 측면에서 유리합니다.

    kubectl patch serviceaccount default </span>

    -p '{"imagePullSecrets":[{"name":"registry-secret"}]}'

    이렇게 하면 해당 ServiceAccount를 사용하는 Deployment는 자동으로 imagePullSecret을 상속받습니다.

    3. 여러 Namespace 환경

    여러 Namespace에서 동일한 레지스트리를 사용한다면 각 Namespace에 동일한 Secret이 존재해야 합니다.

    다만 Secret 내용만 갱신하면 되므로 Deployment를 다시 수정할 필요는 없습니다.

    4. 장기적으로 추천하는 방법

    만약 레지스트리가 다음과 같은 클라우드 서비스라면:

    • Azure Container Registry (ACR)
    • 아마존 ECR
    • 구글 아티팩트 레지스트리

    정적 사용자 계정보다는:

    • 관리형 신원
    • 워크로드 식별
    • 연방 정체성

    기반 인증 사용을 권장드립니다.

    이렇게 하면 서비스 계정 변경 시 Secret을 수동으로 갱신할 필요가 거의 없어집니다.

    추가 확인 부탁드립니다

    몇 가지 정보를 알려주시면 보다 정확하게 안내드릴 수 있습니다.

    1. 사용 중인 레지스트리가 무엇인가요?
    • Azure Container Registry (ACR)
    • 항구
    • 도커 허브
    • 넥서스
    • 공공장
    • 기타
    1. Kubernetes 환경이 무엇인가요?
    • AKS
    • EKS
    • GKE
    • 온프레미스 쿠버네티스
    1. 새로운 서비스 계정은 이미 레지스트리 Pull 권한을 가지고 있나요?

    위 정보를 알려주시면 자동 갱신 방식 또는 가장 적합한 인증 관리 방법을 추가로 안내드리겠습니다.

    참고 문서:

    이 답변이 유용한 정보를 제공해 드렸기를 바랍니다. 도움이 되셨다면 '답변 채택(Accept the Answer)'을 클릭하고 추천(upvote)을 고려해 주시면 감사하겠습니다. 추가로 궁금한 점이 있으시면 언제든지 댓글을 남겨 주세요.

    이 대답이 도움이 되었나요?


답변

질문 작성자는 답변을 '승인됨'으로 표시하고, 중재자는 답변을 '추천됨'으로 표시할 수 있습니다. 이를 통해 사용자는 해당 답변이 작성자의 문제를 해결했다는 것을 알 수 있습니다.