Harbor 컨테이너 레지스트리 장애 해결: 컴포넌트 복구

💡 핵심 요약 (Executive Summary)

본 가이드는 harbor 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.

📑 Table of Contents

When: docker push

Issue: unknown blob ()
bash
docker push my-harbor/base/ubuntu:latest

>>>
The push refers to repository [my-harbor/base/ubuntu]
a46a5fb872b5: Pushing [==================================================>]  80.62MB
unknown blob
Given
Root Cause
  • LB등의 리버스프록시를 사용할 시 nginx.conf에서 아래의 HTTP Header 제거 필요
  • proxy_set_header X-Forwarded-Proto $scheme;
  • bitnami helmchart의 경우 다음과 같은 템플릿 예외가 있음
  • templates/nginx/configmap-http.yaml
yaml
data:
      nginx.conf: |+
      ...
              {{- if not .Values.nginx.behindReverseProxy }}
              proxy_set_header X-Forwarded-Proto $scheme;
              {{- end }}
Resolution

Issue: 413 Request Entity Too Large ()
bash
docker push my-harbor/n8n/n8n-base:debian

>>>
The push refers to repository [my-harbor/n8n/n8n-base]
f92f9df0c0a1: Pushing [==================================================>]  1.204GB
d8f1ee01d682: Layer already exists
c3b7ec7bda15: Layer already exists
5f3b966899d3: Layer already exists
c37a8863d35e: Layer already exists
7f0175a09165: Pushing [==================================================>]  569.7MB
9ea571566ff7: Layer already exists
8d6551b23d41: Layer already exists
8badcfdd9076: Layer already exists
unknown: <html>
<head><title>413 Request Entity Too Large</title></head>
<body>
<center><h1>413 Request Entity Too Large</h1></center>
<hr><center>cloudflare</center>
<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'8db2408d5dcfdd55',t:'MTczMDM2MzE1OS4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
</html>
Given
Root Cause
  • Cloudflare 무료플랜은 최대 업로드 크기가 100MB로 제한됨
  • CDN서비스이기 때문에 업로드 제한이 존재함.
  • DNS만 사용시에는 Cloudflare에 네트워크 트래픽에 대한 책임이 없으므로 제한이 없음.
  • CDN을 사용하지 않을경우 주요한 차이점:
    • 포트포워딩을 할 수 없으므로 리버스프록시가 필요해짐.
    • TLS자동적용이 안되므로 자체적으로 관리 필요
Plan
  1. TLS적용과 서비스라우팅을 위한 리버스프록시 LB를 NodePort로 expose
  2. TLS는 Certmanager로 관리할수 있도록 함.
  3. 내부에서 TCP라우팅을 하기 위한 범용적 LB
  4. harbor service경로로 라우팅 등록
  5. IPTime을 사용하여 머신 퍼블릭IP와 DDNS의 80포트를 리버스프록시 LB로 포워딩
  6. Cloudflare CNAME을 DNS Only(프록시 off)로 harbor 도메인에 IPTime DDNS 등록
Resolution //TODO

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *