harbor 이중화(HA) 구성

Sbae·2024년 1월 19일
0
post-thumbnail

현재 kubernetes 자동화 설치 툴을 개발 중입니다.
해당 글은 사용자 환경마다 상이할 수 있습니다.
관리자 권한을 기준으로 작성하였습니다.

요구사항

harbor 이중화는 할 수 없나요?(해줘)

모코코 줘!

Harbor 이중화 구성

  • 2개의 노드 모두 설정
  • /etc/docker/certs.d/<ip>/<crt file>
    • 도메인일 경우는 필요없지만 사설 인증서를 사용하여 IP로 설치할 경우는 인증서 파일이 필요하다.
  • IP로 구성할 때와 도메인으로 구성할 경우는 harbor.yml 파일 내용이 다르다.

테스트 환경

  • OS(공통)
    • ubuntu
  • VM
    • 192.168.77.73
    • 192.168.77.75

Harbor 복제 기능을 이용한 이중화 구성

  • IP를 기준으로 설치

Harbor.yml

harbor.yml 작성 후 설치

  • 필요 없는 부분은 삭제함.
  • 주석 부분 외 전부 기본값으로 사용함.(사용자에 따라 변경)
hostname: <domain or ip>                 # 도메인 주소 or ip 주소

http:
  port: <port number>                    # 사용할 포트

# domain으로 이중화를 구성할 때는 https는 사용하지 않는다.
# 트래픽이 외부 도메인이랑 연결해주는 nginx랑 충돌이 생겨서 그런 것 같은데 port 변경해서 하는 것은 검증안됨
https:
  port: <port number>                    # 사용할 포트
  certificate: <crt file path>           # crt 파일 경로
  private_key: <key file path>           # key 파일 경로

harbor_admin_password: <password>        # harbor pw

# domain으로 이중화 할 경우 주석 해제
# external_url: https://<domain>

database:
  password: root123
  max_idle_conns: 100
  max_open_conns: 900

data_volume: /data

trivy:
  ignore_unfixed: false
  skip_update: false
  offline_scan: false
  security_check: vuln
  insecure: false

jobservice:
  max_job_workers: 10

notification:
  webhook_job_max_retry: 10

chart:
  absolute_url: disabled

log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor

_version: 2.6.0

proxy:
  http_proxy:
  https_proxy:
  no_proxy:
  components:
    - core
    - jobservice
    - trivy

upload_purging:
  enabled: true
  age: 168h
  interval: 24h
  dryrun: false

cache:
  enabled: false
  expire_hours: 24

Endpoint 설정

  • Administration > Registries > NEW ENDPOINT > 작성 후 TEST CONNECTION
  • Endpoint URL에 https://:도 입력 가능하지만 검증된 인증서가 아니기때문에 Verify remote cert는 해제해야한다.

Replications 설정

  • Administration > Replications > NEW REPLICATION RULE
  • 각각의 옵션은 사용자 설정에 맞춰서 생성한다.

Nginx 프록시를 이용한 이중화 구성

  • Domain을 기준으로 설치
  • 도메인 > Nginx > Harbor 순서의 트래픽

필수사항

  • 1개의 Domain에 여러 개의 ip가 붙어있어야한다.
  • Nginx 설치
    • 테스트 기준 버전 v1.24.0

Harbor.yml

  • 내용은 위와 동일
hostname: <domain>                       # 도메인 주소

http:
  port: <port number>                    # 사용할 포트

harbor_admin_password: <password>        # harbor pw

external_url: https://<domain>

database:
  password: root123
  max_idle_conns: 100
  max_open_conns: 900

data_volume: /data

trivy:
  ignore_unfixed: false
  skip_update: false
  offline_scan: false
  security_check: vuln
  insecure: false

jobservice:
  max_job_workers: 10

notification:
  webhook_job_max_retry: 10

chart:
  absolute_url: disabled

log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor

_version: 2.6.0

proxy:
  http_proxy:
  https_proxy:
  no_proxy:
  components:
    - core
    - jobservice
    - trivy

upload_purging:
  enabled: true
  age: 168h
  interval: 24h
  dryrun: false

cache:
  enabled: false
  expire_hours: 24

Nginx default.conf

server {
  listen       80;                                                                            # port number
  server_name  <domain>;                                                                      # 도메인
  return 301 https://<domain>$request_uri;                                                    # 도메인
}

upstream harbor_http {
  least_conn;
  zone zone_harbor_http_upstream 128k;
  server <ip>:<http port> max_fails=10 fail_timeout=1s;                                       # harbor <ip>:<http port>
  server <ip>:<http port> max_fails=10 fail_timeout=1s backup;                                # harbor <ip>:<http port>
}

server {
  listen                    443 ssl;
  listen                    4443 ssl;
  server_name               <domain>;                                                         # 도메인
  default_type  application/octet-stream;

  # 각각의 SSL 설정 및 proxy 설정은 사용자 별로 맞춰서 설정한다.
  # SSL
  ssl_certificate /etc/nginx/ssl/tls.crt;
  ssl_certificate_key /etc/nginx/ssl/tls.key;
  # ssl_protocols TLSv1.1 TLSv1.2;
  # ssl_ciphers '!aNULL:kECDH+AESGCM:ECDH+AESGCM:RSA+AESGCM:kECDH+AES:ECDH+AES:RSA+AES:';
  # ssl_prefer_server_ciphers on;
  # ssl_session_cache shared:SSL:10m;

  # chunked_transfer_encoding on;
  client_max_body_size  0;
  # proxy_send_timeout    120;
  # proxy_read_timeout    300;
  # proxy_buffering       off;
  # proxy_http_version    1.1;
  # keepalive_timeout     5 5;
  # tcp_nodelay           on;

  # access_log /var/log/nginx/harbor-access.log main;
  # access_log /var/log/nginx/harbor-access.json_log json;
  # error_log /var/log/nginx/harbor-error.log;

  location / {
    proxy_set_header Host              $host;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-Host  $http_host;
    proxy_set_header X-Forwarded-Ssl   on;
    proxy_redirect          off;
    proxy_pass              http://harbor_http;
    #health_check fails=3 port=8082;
  }
}

참고

profile
끄적이는 일반인

0개의 댓글