쿠버네티스 - ECR 이란?
2025. 8. 24. 17:03
image:
  repository: <account>.dkr.ecr.ap-northeast-2.amazonaws.com/myrepo
  tag: "1.2.3"
  pullPolicy: IfNotPresent
imagePullSecrets: []  # EKS+노드 Role이면 비워둠, 필요시 ['ecr-secret']

📌 ECR (Elastic Container Registry)란?

  • **AWS에서 제공하는 컨테이너 이미지 저장소(Registry)**예요.
  • Docker Hub 같은 퍼블릭 레지스트리 대신, 프라이빗 레지스트리로 안전하게 컨테이너 이미지를 저장하고 관리할 수 있어요.
  • CI/CD 파이프라인이나 쿠버네티스에서 이미지를 가져올 때(Pull) 사용됩니다.
  • 1) ECR 핵심 개념

    • 무엇: Docker/OCI 이미지 저장소(프라이빗/퍼블릭). 저장, 버전(tag) 관리, 스캔, 복제 지원.
    • 형식: xxxxx.dkr.ecr.<region>.amazonaws.com/<repo>:<tag>
    • 인증 방식: 짧게 유효한(기본 12시간) 토큰 기반. AWS IAM 권한으로 토큰을 받아 docker/login 수행.

2) 쿠버네티스에서 ECR 쓰는 3가지 패턴

A. EKS(Managed K8s on AWS) — 권장

EKS 워커노드(EC2)의 IAM Role(인스턴스 프로파일) 로 kubelet이 ECR 토큰을 받아 자동 인증합니다.
즉, imagePullSecrets 없이도 잘 동작하도록 되어 있어요(최근 EKS AMI/containerd는 ECR Credential Provider가 기본 포함/연동).

-노드 IAM 정책 예시(최소 권한 샘플):

{
  "Version": "2012-10-17",
  "Statement": [
    { "Effect": "Allow", "Action": ["ecr:GetAuthorizationToken"], "Resource": "*" },
    { "Effect": "Allow", "Action": [
        "ecr:BatchCheckLayerAvailability",
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer",
        "ecr:DescribeImages"
      ], "Resource": "arn:aws:ecr:<region>:<account-id>:repository/<repo>"
    }
  ]
}

매니페스트는 그냥 ECR 이미지를 참조

containers:
  - name: app
    image: <account>.dkr.ecr.ap-northeast-2.amazonaws.com/myrepo:1.0.0

CI/CD 파이프라인 예시(GitHub Actions → ECR → EKS)

name: build-and-deploy
on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      id-token: write   # OIDC로 AWS에 페더레이션
      contents: read
    steps:
      - uses: actions/checkout@v4

      - name: Configure AWS Credentials (OIDC)
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::<account-id>:role/gha-oidc-ecr
          aws-region: ap-northeast-2

      - name: Login to ECR
        run: |
          aws ecr get-login-password --region ap-northeast-2 \
            | docker login --username AWS --password-stdin <account>.dkr.ecr.ap-northeast-2.amazonaws.com

      - name: Build & Push
        run: |
          REPO=<account>.dkr.ecr.ap-northeast-2.amazonaws.com/myrepo
          TAG=${{ github.sha }}
          docker build -t $REPO:$TAG .
          docker push $REPO:$TAG
          echo "IMAGE=$REPO:$TAG" >> $GITHUB_OUTPUT

  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: azure/setup-kubectl@v4
      - name: Update image
        run: |
          kubectl set image deploy/my-app my-app=${{ needs.build.outputs.IMAGE }}

 

📌 쿠버네티스 + ECR 연결 과정

쿠버네티스에서 Pod을 띄우려면 컨테이너 이미지를 가져와야 하잖아요?
이때 이미지가 ECR에 저장되어 있다면, 쿠버네티스가 ECR에 접근할 수 있도록 인증을 해줘야 합니다.

ECR에 이미지 Push

 
docker build -t <ECR_URI>:tag .
docker push <ECR_URI>:tag

 

쿠버네티스에서 인증용 Secret 생성

aws ecr get-login-password --region ap-northeast-2 \
  | kubectl create secret docker-registry ecr-secret \
    --docker-server=<ECR_URI> \
    --docker-username=AWS \
    --docker-password-stdin

 

Pod/Deployment에서 secret 참조

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: <ECR_URI>:tag
      imagePullSecrets:
        - name: ecr-secret

 

NellKiM
NellKiM