본문 바로가기
kubenetes

harbor 설치

by kyeongseo.oh 2022. 3. 21.

프라이빗 컨테이너 레지스트리로 harbor을 설치한다.

 

서버 스펙은 아래와 같음

[root@kw2 ~]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core) 

[root@kw2 ~]# cat /proc/cpuinfo | grep 'processor' | wc -l 
4 

[root@kw2 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:            15G        620M         14G        9.0M        142M         14G
Swap:          7.9G          0B        7.9G

 

host file은 아래와 같음

vi /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.30.1.146 harbor.ks.io harbor

1. firewalld를 disable하고 시작한다.

[root@kw2 ~]# systemctl stop firewalld
[root@kw2 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

 

2. docker, docker compose를 설치한다.

docker compose는 두 개 서비스를 한 개 이미지로 묶어서 build하는 것을 지원해준다고 함

docker compose는 아래 링크에서 원하는 버전을 찾아 다운받으면 된다.

 

https://github.com/docker/compose/releases

 

Releases · docker/compose

Define and run multi-container applications with Docker - docker/compose

github.com

 

docker compose 2.3.3 linux-x86-64를 다운받았음

curl -L "https://github.com/docker/compose/releases/download/v2.3.3/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose

 

docker-compose 권한 설정, version 확인

[root@harbor bin]# chmod +x /usr/local/bin/docker-compose

[root@harbor bin]# docker-compose --version
Docker Compose version v2.3.3

 

docker repo를 세팅하고 docker를 설치한다.

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli

 

docker 서비스 활성화

systemctl start docker
systemctl enable docker

 

3. ssl 인증서를 생성한다.

openssl 참고 링크

 

OpenSSL Quick Reference Guide | DigiCert.com

Instead of generating a private key and then creating a CSR in two separate steps, you can actually perform both tasks at once. This command generates a new private key (-newkey) using the RSA algorithm with a 2048-bit key length (rsa:2048) without using a

www.digicert.com

cert 디렉토리를 생성한다.

mkdir -p ~/certs
cd ~/certs

 

CA 인증서를 생성한다. (private key를 생성)

[root@harbor certs]# openssl genrsa -out ca.key 4096
Generating RSA private key, 4096 bit long modulus
.....++
..................................++
e is 65537 (0x10001)


# ca.key가 생성되었음
[root@harbor certs]# ll
total 4
-rw-r--r--. 1 root root 3243 Mar 22 16:43 ca.key

 

CA 인증서 private key에서 public key를 추출한다.

private key 파일에는 private key와 public key가 모두 포함되어 있다.

csr을 생성할 때 -subj 스위치를 사용하여 명령 자체 내에서 필요한 모든 정보를 제공할 수 있다.

-subj 옵션을 사용해 조직의 정보를 반영한다.

CN에는 IP 혹은 서버의 FQDN을 지정한다.

openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=KR/ST=SUWON/L=SUWON/O=Data Dynamics Inc/OU=Lab/CN=172.30.1.146/emailAddress=kyeongseo96@gmail.com" \
 -key ca.key \
 -out ca.crt

 

SERVER 인증서를 생성한다. (private key 생성)

[root@harbor certs]# openssl genrsa -out harbor.ks.io.key 4096
Generating RSA private key, 4096 bit long modulus
...................................................................................++
...................................................................................++
e is 65537 (0x10001)

 

SERVER 인증서 private key에서 public key를 추출한다.

-subj 옵션을 사용해 조직의 정보를 반영한다.

CN에는 IP 혹은 서버의 FQDN을 지정한다.

openssl req -sha512 -new \
-subj "/C=KR/ST=SUWON/L=SUWON/O=Data Dynamics Inc/OU=Lab/CN=172.30.1.146/emailAddress=kyeongseo96@gmail.com" \
 -key harbor.ks.io.key \
 -out harbor.ks.io.csr

 

x509 v3 extension file을 생성한다.

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=172.30.1.146
DNS.2=harbor.ks.io
DNS.3=harbor
EOF

 

v3.ext 파일을 사용해 harbor 호스트에 대한 인증서를 생성한다.

openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in harbor.ks.io.csr \
    -out harbor.ks.io.crt
    
    
#output
Signature ok
subject=/C=KR/ST=SUWON/L=SUWON/O=Data Dynamics Inc/OU=Lab/CN=172.30.1.146/emailAddress=kyeongseo96@gmail.com
Getting CA Private Key

# ca.srl와 harbor.ks.io.crt가 생성되었다.
[root@harbor certs]# ll
total 28
-rw-r--r--. 1 root root 2139 Mar 22 16:45 ca.crt
-rw-r--r--. 1 root root 3243 Mar 22 16:43 ca.key
-rw-r--r--. 1 root root   17 Mar 22 16:51 ca.srl
-rw-r--r--. 1 root root 2199 Mar 22 16:51 harbor.ks.io.crt
-rw-r--r--. 1 root root 1760 Mar 22 16:48 harbor.ks.io.csr
-rw-r--r--. 1 root root 3243 Mar 22 16:47 harbor.ks.io.key
-rw-r--r--. 1 root root  263 Mar 22 16:50 v3.ext

 

4. harbor 및 docker에 인증서를 제공한다.

 

서버 인증서와 키를 Harbor 호스트의 certficates 폴더에 복사한다.

mkdir -p /data/cert
cp harbor.ks.io.crt /data/cert/
cp harbor.ks.io.key /data/cert/

 

docker에서 사용하기 위해 crt 파일을 cert 파일로 변환한다.

docker는 .crt 파일을 CA 인증서로 해석하고, .cert 파일을 클라이언트 인증서로 해석한다고 함.

# /root/certs 에서 진행한다.
openssl x509 -inform PEM -in harbor.ks.io.crt -out harbor.ks.io.cert

 

적절한 폴더를 만든 후 서버 인증서, 키 및 CA 파일을 harbor 호스트의 Docker 인증서 폴더에 복사한다.

만약 nginx 기본 포트 443을 이미 다른 서비스에서 사용하고 있는 경우 /etc/docker/certs.d/yourdomain.com:port를 생성하거나 /etc/docker/certs.d/harbor_IP:port 생성하라고 가이드함.

# /root/certs 에서 진행한다.
mkdir -p /etc/docker/certs.d/harbor.ks.io/
cp harbor.ks.io.cert /etc/docker/certs.d/harbor.ks.io/
cp harbor.ks.io.key /etc/docker/certs.d/harbor.ks.io/
cp ca.crt /etc/docker/certs.d/harbor.ks.io/

 

os 수준에서 인증서를 신뢰하도록함.

[root@harbor certs]# cp harbor.ks.io.crt /etc/pki/ca-trust/source/anchors/harbor.ks.io.crt
[root@harbor certs]# update-ca-trust

 

docker를 재시작한다.

systemctl restart docker

 

5. harbor 설치 파일을 다운로드한다.

다음 링크에서 원하는 버전의 offline-installer를 다운받는다.

https://github.com/goharbor/harbor/releases/ 

 

Releases · goharbor/harbor

An open source trusted cloud native registry project that stores, signs, and scans content. - goharbor/harbor

github.com

latest version인 2.4.2를 다운받았다.

wget "https://github.com/goharbor/harbor/releases/download/v2.1.3/harbor-offline-installer-v2.1.3.tgz"
tar xfvz harbor-offline-installer-v2.1.3.tgz
cd ~/harbor
cp harbor.yml.tmpl harbor.yml

 

6. harbor.yml 파일을 수정한다.

다음 3곳을 수정한다.

hostname: harbor.ks.io

  # The path of cert and key files for nginx
  certificate: /data/cert/harbor.ks.io.crt
  private_key: /data/cert/harbor.ks.io.key

 

7. harbor 설치 스크립트 실행

./prepare

./install.sh

 

8. web ui 접속

172.30.1.146으로 접속하면 web ui 접속 가능 (혹은 hosts 파일에 등록 후 harbor.ks.io로 접속)

기본 id/pwd는 admin/Harbor12345 이다.

 

9. harbor에 docker login을 실행함.

[root@harbor harbor]# docker login harbor.ks.io
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

 

10. private harbor에 이미지 push

 

일단 docker hub에서 centos 이미지를 받아줌

## docker hub에서 centos:latest 이미지 pull
[root@harbor harbor]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

## image 확인
[root@harbor harbor]# docker images
REPOSITORY                      TAG       IMAGE ID       CREATED        SIZE
goharbor/harbor-exporter        v2.4.2    ddbe51a2d92c   7 days ago     84.3MB
goharbor/chartmuseum-photon     v2.4.2    4c8a43a14da1   7 days ago     175MB
goharbor/redis-photon           v2.4.2    61d136910774   7 days ago     158MB
goharbor/trivy-adapter-photon   v2.4.2    f32f7db1569e   7 days ago     167MB
goharbor/notary-server-photon   v2.4.2    1465d8e1d2e5   7 days ago     112MB
goharbor/notary-signer-photon   v2.4.2    547245607828   7 days ago     110MB
goharbor/harbor-registryctl     v2.4.2    f43545bdfd12   7 days ago     138MB
goharbor/registry-photon        v2.4.2    1927be8b8775   7 days ago     80.8MB
goharbor/nginx-photon           v2.4.2    4189bfe82749   7 days ago     47.3MB
goharbor/harbor-log             v2.4.2    b2279d3a2ba5   7 days ago     162MB
goharbor/harbor-jobservice      v2.4.2    d22f0a749835   7 days ago     222MB
goharbor/harbor-core            v2.4.2    672a56385d29   7 days ago     199MB
goharbor/harbor-portal          v2.4.2    bc60d9eaf4ad   7 days ago     56.3MB
goharbor/harbor-db              v2.4.2    91d13ec46b2c   7 days ago     226MB
goharbor/prepare                v2.4.2    d2100ed70ba4   7 days ago     269MB
centos                          latest    5d0da3dc9764   6 months ago   231MB

 

Harbor webui에서 push command를 볼 수 있음

 

 

# 이미지에 태그 달기
[root@harbor ~]# docker tag centos harbor.ks.io/library/centos:v1

# 이미지 확인
[root@harbor ~]# docker images | grep centos
harbor.ks.io/library/centos     v1        5d0da3dc9764   6 months ago   231MB
centos                          latest    5d0da3dc9764   6 months ago   231MB

# private harbor에 push
[root@harbor ~]# docker push harbor.ks.io/library/centos:v1
The push refers to repository [harbor.ks.io/library/centos]
74ddd0ec08fa: Pushed
v1: digest: sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc size: 529

 

Harbor web ui에서 확인하니 이미지가 잘 push되었음.

 

 

11. private harbor에서 이미지 pull

 

먼저 기존 이미지를 제거해준다. docker rmi 커맨드를 사용한다.

# 이미지 삭제 전
[root@harbor ~]# docker images | grep centos
centos                          latest    5d0da3dc9764   6 months ago   231MB
harbor.ks.io/library/centos     v1        5d0da3dc9764   6 months ago   231MB

# 이미지 삭제
[root@harbor ~]# docker rmi harbor.ks.io/library/centos:v1
Untagged: harbor.ks.io/library/centos:v1
Untagged: harbor.ks.io/library/centos@sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc

# 이미지 삭제 후
[root@harbor ~]# docker images | grep centos
centos                          latest    5d0da3dc9764   6 months ago   231MB

 

harbor에서 이미지를 pull한다.

[root@harbor ~]# docker pull harbor.ks.io/library/centos:v1
v1: Pulling from library/centos
Digest: sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc
Status: Downloaded newer image for harbor.ks.io/library/centos:v1
harbor.ks.io/library/centos:v1

[root@harbor ~]# docker images | grep centos
centos                          latest    5d0da3dc9764   6 months ago   231MB
harbor.ks.io/library/centos     v1        5d0da3dc9764   6 months ago   231MB

 

12. k8s cluster에서 harbor에 접속하기

k8s cluster에서 사용하기 위한 cr로 harbor을 설치한 것이기 때문에 k8s cluster에서 접속이 되야함.

 

docker login을 시도해봄.

[root@km ~]# docker login harbor.ks.io
Username: admin
Password:
Error response from daemon: Get "https://harbor.ks.io/v2/": x509: certificate is valid for *.divido.org, divido.org, not harbor.ks.io

 

인증오류가 발생함.

k8s cluster에 harbor 인증서를 복사해준다.

# docker 인증서 디렉토리 생성
[root@harbor harbor]# for i in {4..5} ; do ssh 172.30.1.14${i} "mkdir -p /etc/docker/certs.d/harbor.ks.io/" ; done

# 인증서 파일 복사
[root@harbor harbor]# scp /etc/docker/certs.d/harbor.ks.io/* 172.30.1.144:/etc/docker/certs.d/harbor.ks.io/
root@172.30.1.144's password:
ca.crt                                                                                                           100% 2139     2.6MB/s   00:00
harbor.ks.io.cert                                                                                                100% 2199     3.9MB/s   00:00
harbor.ks.io.key                                                                                                 100% 3243     6.3MB/s   00:00
[root@harbor harbor]# scp /etc/docker/certs.d/harbor.ks.io/* 172.30.1.145:/etc/docker/certs.d/harbor.ks.io/
root@172.30.1.145's password:
ca.crt                                                                                                           100% 2139     2.2MB/s   00:00
harbor.ks.io.cert                                                                                                100% 2199     3.6MB/s   00:00
harbor.ks.io.key

 

근데 동일한 에러가 난다.

생각해보니 hosts 파일을 잘못 써놨다.

k8s를 3대로 설치할 생각으로 172.30.1.146을 kw2.dd.io로 했었던 게 그대로 남아있어서 에러가 났던거임

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.30.1.144 km.dd.io
172.30.1.145 kw1.dd.io
172.30.1.146 harbor.ks.io

 

이제 로그인 잘된다.

[root@km harbor.ks.io]# docker login harbor.ks.io
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

 


harbor 설정 변경 후 재시작하는 방법

docker-compose 명령은 harbor 압축파일을 푼 디렉토리에서 실행해야한다.

cd ~/harbor
./prepare
docker-compose down -v
docker-compose up -d

댓글