Harbor 설치를 위한 가이드
private registry 즉 컨테이너 이미지 저장소로 사용할 예정으로 Disconnected 환경에 구축
준비물
- 파일을 준비할 인터넷이 가능한 서버
사양
CPU 4
MEM 8
Disk 200
사용 Port
443 : HTTPS 연결을 위한 Harbor 포털 및 core API
4443 : Harbor 용 Docker Content Trust 서비스에 대한 연결
80 : HTTP 연결을 위한 Harbor 포털 및 core API
인터넷 환경에서 파일 전달
curl -OL <https://github.com/goharbor/harbor/releases/download/v2.12.2/harbor-offline-installer-v2.12.2.tgz>
scp * root@192.168.200.63:/root/harbor
tar zxvf harbor-offline-installer-v2.12.2.tgz
cd harbor
HTTPS 지원을 위한 인증서 생성
- Harbor는 기본적으로 인증서를 제공하고 있지 않아 HTTPS를 구성하려면 SSL 인증서를 생성 해야 합니다.
- Harbor Registry의 호스트 이름으로 harbor.zh.om 을 사용 하도록 하겠습니다
CA 인증서 개인키와 CA 인증서를 생성 합니다
$ mkdir -p certs
$ cd certs
# Root CA의 개인키 생성
$ openssl genrsa -out ca.key 4096
# Root CA의 인증서를 생성
# -subj 옵션에는 조직을 반영 하도록 옵션의 값을 조정
$ openssl req -x509 -new -nodes -sha512 -days 3650 \\
-subj "/C=KR/ST=Seoul/L=Seoul/O=beomzh/OU=support/CN=harbor.zh.om" \\
-key ca.key \\
-out ca.crt
서버 인증서를 위한 개인키와 인증서 서명 요청 파일을 생성 합니다.
- 서버의 개인키를 생성하고, 생성한 개인키를 넣어 인증서 서명 요청(CSR : Certificate Signing Request) 파일을 생성합니다. CSR은 SSL 인증서를 발급하기 위해 필요한 정보를 담고 있는 인증서 신청 형식 데이터 입니다.
- CSR에 포함되어 있는 내용으로는 개인키(Private Key)와 공개키(Public Key)의 키쌍 중에서 공개키가 포함되어 있고 인증서가 적용되는 도메인에 대한 정보가 포함됩니다.
# 서버 인증서 개인키 생성
$ openssl genrsa -out harbor.zh.om.key 4096
# 서버 인증서 서명 요청(Csr) 생성
# -subj 옵션에는 조직을 반영 하도록 옵션의 값을 조정
$ openssl req -sha512 -new \\
-subj "/C=KR/ST=Seoul/L=Seoul/O=beomzh/OU=support/CN=harbor.zh.om" \\
-key harbor.zh.om.key \\
-out harbor.zh.om.csr
주체대체이름(SAN : Subject Alternative Name)을 위한 x509 v3 확장 파일 생성
- FDQN 또는 IP주소를 사용하여 Harbor 호스트에 연결 여부에 관계없이 SAN 및 x509 v3를 준수하는 Harbor 호스트에 대한 인증서를 생성하기 위한 확장 파일을 생성 합니다.
$ cat > v3ext.conf <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=zh.om
DNS.2=www.zh.om
DNS.3=harbor.zh.om
IP.4=192.168.200.123
EOF
서버 인증서를 생성 합니다.
- Harbor 호스트를 위한 서버 인증서를 생성 합니다.
- 여기서 인증서 기간은 10년으로 설정
openssl x509 -req -sha512 -days 36500 \\
-extfile v3ext.conf \\
-CA ca.crt -CAkey ca.key -CAcreateserial \\
-in harbor.zh.om.csr \\
-out harbor.zh.om.crt
Harbor 및 Docker에 인증서 업데이트
- ca.crt, habor.zh.om.crt 그리고 habor.zh.om.key 파일을 생성후 Harbor 및 Docker에 제공하여 직접 서명한 인증서를 사용 할 수 있도록 Harbor를 재구성해야 합니다.
- Docker에서는 .crt파일을 CA (인증 기관)으로 해석 하고 .cert 파일을 클라이언트 인증서로 해석 합니다.
- 클라이언트 인증서로 해석하기 위해 .crt 형식이 아닌 .cert 형식으로 변환해주어야 합니다.
$ openssl x509 -inform PEM -in harbor.zh.om.crt -out harbor.zh.om.cert
만들어진 인증서 파일들(서버 인증서, key 그리고 CA 파일들)을 Docker 인증서 폴더 위치에 복사합니다
# /etc/docker/cert.d/ 하위 디렉토리는 인증서의 FDQN으로 생성
mkdir -p /etc/docker/certs.d/harbor.zh.om
# 생성한 Docker 인증서 폴더에 인증서들을 복사
cp -pfv harbor.zh.om.cert /etc/docker/certs.d/harbor.zh.om/
cp -pfv harbor.zh.om.key /etc/docker/certs.d/harbor.zh.om/
cp -pfv ca.crt /etc/docker/certs.d/harbor.zh.om/
# Docker Engine 재시작
sudo systemctl restart docker
Docker 클라이언트가 Private Registry에 로그인 할 때 HTTPS로 연결 되는데 자체 서명한 CA인증서를 사용하는 Private Registry 서버에는 Docker 클라이언트가 Root CA에 대한 인증 기관의 인증서를 가지고 있지 않아 인증을 할 수 없어 로그인 에러가 발생하므로 Root CA인증서, 서버 인증서 및 서버 개인키를 Docker 클라이언트 인증서 저장소로 복사합니다.
호스트에 생성한 Root CA 인증서를 추가 합니다
sudo mkdir -p /usr/local/share/ca-certificates
sudo cp -p ca.crt /usr/local/share/ca-certificates/harbor-ca.crt
sudo cp -p harbor.zh.om.crt /usr/local/share/ca-certificates/harbor-server.crt
sudo update-ca-certificates
Harbor의 웹서버 nginx에서 사용 할 인증서를 Harbor의 디렉토리에 복사합니다.
(Disconnected 또는 개발 환경에서는 사용 할 경우라는 HTTP로 사용도 가능합니다.)
# 아래 harbor.yml 수정 섹션에서 정의 할 Harbor 웹서버 nginx에서 사용될 인증서 디렉토리 생성
sudo mkdir -p /harbor/certs
sudo cp harbor.zh.om.crt /harbor/certs/harbor.zh.om.crt
sudo cp -p harbor.zh.om.key /harbor/certs/harbor.zh.om.key
Harbor 설치 프로그램의 시스템 수준 매개변수 파일 harbor.yml 수정
harbor.yml 파일은 설치에 필요한 시스템 매개 변수 설정을 위해 제공하는 파일이며 install.sh 스크립트가 harbor.yml에 설정된 매개 변수를 바탕으로 설치를 하게 됩니다.
기본적인 설치를 위해 harbor.yml 파일에서 필수로 설정해야 하는 매개 변수는 다음과 같습니다.
### harbor.yml.tmpl 파일에서 아래 내용 변경
# Harbor 접속 URL
hostname: harbor.zh.om
http:
port: 80
https:
port: 443
# HTTPS를 위해 cert와 key 파일의 위치
# The path of cert and key files for nginx
certificate: /root/harbor/certs/harbor.zh.om.crt
private_key: /root/harbor/certs/harbor.zh.om.key
# Harbor 관리자 암호
harbor_admin_password: beomzh
database:
# Harbor의 DB로 사용되는 PostgreSQL의 어드민 암호
password: openmaru
max_idle_conns: 100
max_open_conns: 900
# Harbor 데이터 위치
data_volume: /root/harbor/data
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
# Harbor의 log 위치
location: /var/log/harbor
로그인 기본 관리자 계정은 admin 이며 암호는 harbor.yml에서 입력한 beomzh 입니다. 만약, 암호를 설정하지 않았다면 기본 암호는 Harbor12345 입니다.
Reconfigure Harbor
harbor.yml을 수정후 무언가 반영할 때는 다음과 같이 진행 합니다.
$ ./prepare
$ sh +x install.sh
# Harbor stop
$ sudo docker-compose down -v
# Harbor Start
$ sudo docker-compose up -d
참고 사이트
Installing Rancher Air Gapped with Harbor for Offline Environment
https://goharbor.io/docs/2.12.0/install-config/configure-https/