프라이빗 컨테이너 레지스트리로 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
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 인증서를 생성한다.
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/
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
'kubenetes' 카테고리의 다른 글
Dockerfile로 flask web docker image build 하는 방법 (0) | 2022.03.23 |
---|---|
let's encrypt의 certbot을 사용해 harbor https 적용하기 (0) | 2022.03.22 |
kubernetes dashboard login skip하는 방법 (0) | 2022.03.20 |
kubernetes dashboard 설치 (0) | 2022.03.20 |
kubernetes 설치 (0) | 2022.03.19 |
댓글