컨테이너 이미지를 표준 방식으로 관리하는 OCI Registry의 개념과, 대표적 구현체인 Harbor의 역할, Kubernetes/OpenStack에서의 활용 방법을 정리한다.
[01] OCI Registry란?
OCI(Open Container Initiative) Registry는 컨테이너 이미지를 저장하고 배포하기 위한 표준 인터페이스이다.
1-1. 핵심 구성 요소
| 구성 요소 |
설명 |
| Image |
컨테이너 실행에 필요한 파일 시스템과 메타데이터의 묶음 |
| Layer |
이미지를 구성하는 개별 파일 시스템 변경 단위 (계층 구조) |
| Manifest |
이미지의 레이어 목록, 설정, 플랫폼 정보를 기술하는 JSON 문서 |
1-2. 동작 원리
graph LR
DEV["개발자 / CI"] -->|"docker push"| REG["OCI Registry
(Harbor 등)"]
REG -->|"docker pull"| K8S["Kubernetes Pod"]
REG -->|"docker pull"| VM["OpenStack VM 내부"]
style REG fill:#e3f2fd,stroke:#1565c0
컨테이너 이미지를 표준 방식으로 push/pull 하는 저장소
1-3. 대표적인 OCI Registry
| Registry |
특징 |
| Docker Hub |
퍼블릭 기본 Registry, 무료 제한 있음 |
| Harbor |
엔터프라이즈 Private Registry (오픈소스) |
| Amazon ECR |
AWS 관리형 |
| Google GCR / Artifact Registry |
GCP 관리형 |
| Azure ACR |
Azure 관리형 |
| GitHub Container Registry (ghcr.io) |
GitHub 통합 |
[02] Harbor — Enterprise급 Private Registry
Harbor는 OCI Registry의 대표적인 오픈소스 구현체로, CNCF Graduated 프로젝트이다.
2-1. 주요 기능
graph TD
HARBOR["Harbor"] --> IMG["이미지 저장 및 배포
(OCI 표준)"]
HARBOR --> RBAC["RBAC
프로젝트별 권한 관리"]
HARBOR --> SCAN["취약점 스캔
(Trivy 내장)"]
HARBOR --> SIGN["이미지 서명
(Notary / Cosign)"]
HARBOR --> REPL["이미지 복제
(멀티 사이트 동기화)"]
HARBOR --> HELM["Helm Chart 저장소
(OCI 기반)"]
style HARBOR fill:#e3f2fd,stroke:#1565c0
| 기능 |
설명 |
| 이미지 저장/배포 |
OCI 표준 push/pull |
| RBAC |
프로젝트 단위 사용자/팀 권한 관리 |
| 취약점 스캔 |
Trivy로 이미지 보안 취약점 자동 검사 |
| 이미지 서명 |
Notary/Cosign으로 이미지 무결성 보장 |
| 이미지 복제 |
여러 Harbor 인스턴스 간 이미지 동기화 |
| Helm Chart |
OCI 기반 Helm Chart 저장소 기능 |
2-2. Air-gap 환경 지원
인터넷이 차단된 폐쇄망(Air-gap) 환경에서도 Harbor를 Private Registry로 사용하면, 외부 Docker Hub 없이 이미지를 관리할 수 있다.
[03] Kubernetes에서 Harbor
sequenceDiagram
participant CI as CI/CD Pipeline
participant Harbor as Harbor Registry
participant K8s as Kubernetes
CI->>Harbor: docker push (빌드된 이미지)
K8s->>Harbor: docker pull (Pod 생성 시)
Harbor-->>K8s: 이미지 전달
K8s->>K8s: Pod 실행
| 역할 |
설명 |
| Pod 이미지 공급 |
Deployment, StatefulSet 등이 참조하는 이미지 저장소 |
| CI/CD 중심 |
빌드 → push → 배포 파이프라인의 중간 저장소 |
| Helm Chart 저장소 |
OCI 기반 Helm Chart를 Harbor에 push/pull |
| Air-gap 지원 |
폐쇄망 Kubernetes 클러스터에서 이미지 공급 |
Kubernetes에서 Harbor 사용 예시:
1
2
3
4
5
6
7
|
# Deployment에서 Harbor 이미지 참조
spec:
containers:
- name: my-app
image: harbor.example.com/project/my-app:v1.0
imagePullSecrets:
- name: harbor-secret
|
[04] OpenStack에서 Harbor
4-1. OpenStack-Helm 환경
OpenStack을 Kubernetes 위에 배포하는 OpenStack-Helm 방식에서는, OpenStack 서비스 자체가 컨테이너로 실행된다. 이 컨테이너 이미지를 Harbor에서 pull한다.
graph LR
HARBOR["Harbor"] -->|"이미지 pull"| OSH["OpenStack-Helm
(K8s 위 OpenStack)"]
OSH --> NOVA["Nova
(컨테이너)"]
OSH --> NEUTRON["Neutron
(컨테이너)"]
OSH --> KEYSTONE["Keystone
(컨테이너)"]
style HARBOR fill:#e3f2fd,stroke:#1565c0
style OSH fill:#fff3e0,stroke:#e65100
4-2. VM 기반 환경
기존 VM 기반 OpenStack에서도 VM 내부에서 Docker를 실행하여 Harbor의 이미지를 사용할 수 있다.
1
|
Glance → VM 생성 → VM 내부에서 docker pull harbor.example.com/...
|
[05] Harbor vs Glance — 역할이 다르다
| 항목 |
Harbor |
Glance |
| 용도 |
컨테이너 이미지 저장소 |
VM 디스크 이미지 저장소 |
| 이미지 포맷 |
OCI (Docker 이미지) |
qcow2, raw, vmdk 등 |
| 사용 위치 |
Kubernetes, Docker |
OpenStack (Nova) |
| 표준 |
OCI Distribution Spec |
OpenStack Image API |
| 사용 명령 |
docker push/pull |
openstack image create |
Harbor와 Glance는 직접 연동하지 않는다. 이미지 포맷이 완전히 다르기 때문이다. 통합이 필요하면 CI/CD 파이프라인에서 동일 소스로부터 각각 빌드하여 관리한다.
5-1. 간접 활용 방식
| 방법 |
설명 |
| 변환 후 업로드 |
컨테이너 이미지 → VM 이미지 변환 → Glance 등록 |
| CI/CD 통합 (권장) |
동일 소스에서 VM 이미지는 Glance로, 컨테이너 이미지는 Harbor로 |
| VM 내부 활용 |
Glance로 VM 생성 후, VM 내부에서 Harbor pull |
[06] Harbor vs Nexus vs KubeKey
| 항목 |
Harbor |
Nexus |
KubeKey |
| 역할 |
OCI Registry (컨테이너 이미지 전용) |
통합 패키지 저장소 |
Kubernetes 설치 도구 |
| 저장 대상 |
컨테이너 이미지, Helm Chart |
Maven, npm, Docker, PyPI 등 |
클러스터 바이너리 |
| Kubernetes 관계 |
이미지 공급 |
간접 (npm/Maven 등) |
클러스터 설치/관리 |
| 강점 |
보안(스캔/서명), RBAC |
다양한 포맷 통합 관리 |
Air-gap K8s 설치 |
1
2
3
|
Harbor = 컨테이너 이미지 창고
Nexus = 전체 패키지 창고 (Docker 포함 다목적)
KubeKey = Kubernetes 설치 도구 (이미지 저장소 아님)
|
[07] 전체 아키텍처
graph TB
subgraph CI_CD["CI/CD Pipeline"]
BUILD["소스 빌드"]
end
subgraph Registry["이미지 저장소"]
HARBOR["Harbor
(Private OCI Registry)"]
end
subgraph K8s["Kubernetes 클러스터"]
POD1["App Pod"]
POD2["App Pod"]
end
subgraph OpenStack["OpenStack"]
OSH["OpenStack-Helm
(서비스 컨테이너)"]
VM["VM 내부
(Docker)"]
GLANCE["Glance
(VM 이미지)"]
end
BUILD -->|"docker push"| HARBOR
BUILD -->|"VM 이미지"| GLANCE
HARBOR -->|"pull"| POD1
HARBOR -->|"pull"| POD2
HARBOR -->|"pull"| OSH
HARBOR -->|"pull"| VM
GLANCE -->|"VM 생성"| VM
style HARBOR fill:#e3f2fd,stroke:#1565c0
style GLANCE fill:#fff3e0,stroke:#e65100
[08] 정리
| 개념 |
한 줄 요약 |
| OCI Registry |
컨테이너 이미지를 표준 방식으로 push/pull하는 저장소 |
| Harbor |
Enterprise급 Private OCI Registry (CNCF Graduated) |
| Glance |
OpenStack VM 디스크 이미지 저장소 |
| Nexus |
Docker 포함 다양한 포맷의 통합 패키지 저장소 |
Harbor는 컨테이너 이미지, Glance는 VM 이미지 → 역할 분리 + CI/CD로 통합 운영