💡 핵심 요약 (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
- Bitnami Helmchart 사용 (https://github.com/bitnami/charts/tree/main/bitnami/harbor)
values.yamlexposureType: ingressnginx.tls.enabled: truenginx.behindReverseProxy: false- 내부 호스팅시 정상동작하였으나, 클라우드 로드밸런서 사용시 에러 발생함
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
- [Error fix] change harbor exposure to proxy · myeong-han/playgrounds-fredric@0a01de9
values.yamlexposureType: proxynginx.tls.enabled: falsenginx.behindReverseProxy: true
- NodePort 서비스로 변경됨.
docker push정상작동
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
- Bitnami Helmchart 사용 (https://github.com/bitnami/charts/tree/main/bitnami/harbor)
- Cloudflare 무료플랜 CDN서비스 사용하여 프록싱됨
- 크기가 1GB가 넘는 대용량 이미지
push시에 문제 확인됨
Root Cause
- Cloudflare 무료플랜은 최대 업로드 크기가 100MB로 제한됨
- CDN서비스이기 때문에 업로드 제한이 존재함.
- DNS만 사용시에는 Cloudflare에 네트워크 트래픽에 대한 책임이 없으므로 제한이 없음.
- CDN을 사용하지 않을경우 주요한 차이점:
- 포트포워딩을 할 수 없으므로 리버스프록시가 필요해짐.
- TLS자동적용이 안되므로 자체적으로 관리 필요
Plan
- TLS적용과 서비스라우팅을 위한 리버스프록시 LB를 NodePort로 expose
- TLS는 Certmanager로 관리할수 있도록 함.
- 내부에서 TCP라우팅을 하기 위한 범용적 LB
- harbor service경로로 라우팅 등록
- IPTime을 사용하여 머신 퍼블릭IP와 DDNS의 80포트를 리버스프록시 LB로 포워딩
- Cloudflare CNAME을 DNS Only(프록시 off)로 harbor 도메인에 IPTime DDNS 등록
Resolution //TODO
Leave a Reply