클라우드 네이티브 애플리케이션 부트캠프 알림

티스토리 뷰

Open Sources

harbor 설치 및 구성

Happy@Cloud 2020. 9. 6. 17:28

harbor는 private container image registry입니다.

Addon으로 private helm chart registry인 Chartmuseum도 같이 제공합니다.

LINE에서 harbor를 도입한 후기도 참조하십시오.

 

harbor 설치 방법 선택

harbor를 설치하는 방법은 docker-compose를 이용하여 container로 설치하는 방법과, 

helm chart를 이용하여 kubernetes에 Pod로 설치하는 방법이 있습니다. 

어떤 방법으로 설치할 지 결정할 때 중요한 것은 LDAP서버를 container로 설치할 지,

kubernetes Pod로 설치할 지를 결정하는 것입니다. 

LDAP서버를 container로 설치한다면 두가지 방법 중 어떤 것을 선택하든 상관 없습니다. 

하지만 LDAP서버를 k8s Pod로 설치한다면 반드시 harbor도 k8s Pod로 설치하여야 합니다. 

 

cgroup의 메모리 설정 변경: Centos에서만 수행

centos는 설치 후에 아래 작업을 반드시 해주십시오.

이 작업을 안해 주면 잘 되다가 다음에 container를 구동할 때 memory allocation error가 납니다.

이는 centos kernel의 버그를 fix하는 workaround입니다.  2020년 9월 7일 현재 Kernel: Linux 3.10.0-1127.19.1.el7.x86_64에서도 버그가있습니다.

*참고) kernel version 보기 명령어: uname -r 

자세한 건 아래 링크를 참조하십시오.

Docker fails to start containers with cgroup memory allocation error

github.com/docker/for-linux/issues/841

But report

bugzilla.redhat.com/show_bug.cgi?id=1507149

$ vi /etc/default/grub

GRUB_CMDLINE_LINUX에 cgroup.memory=nokmem을 추가합니다. 

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto resume=UUID=8d314546-bc27-49a6-ac8a-d122ae76b6f3 rhgb quiet cgroup.memory=nokmem"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true

$ grub2-mkconfig -o /boot/grub2/grub.cfg 명령 수행

$ reboot

$ cat /proc/cmdline 명령으로 cgroup.memory=nokmem이 적용되었는지 확인


 

kubernetes에 harbor 설치

1) helm 설치

https://happycloud-lee.tistory.com/3?category=832245 

 

0. helm 설치하기

Helm은 서비스를 쉽게 설치할 수 있는 툴입니다. 서비스 배포에 필요한 Image, Volume, 환경설정등을 정의한 helm chart를 통해 빠르고 쉽게 배포하게 해 줍니다. helm은 CLI인 helm과 명령을 수행하는 tiller

happycloud-lee.tistory.com

2) helm chart registry 추가

helm repo add bitnami https://charts.bitnami.com/bitnami

3) harbor chart 설정 파일 다운로드 및 수정

$ mkdir -p ~/install/harbor-k8s && cd ~/install/harbor-k8s
$ helm inspect values bitnami/harbor > values.yaml
$ vi values.yaml

위  values.yaml에서 아래 항목 값을 적절하게 변경합니다. 

storageClass는 nfs provisioning설정 시 만든 리소스명을 지정하면 됩니다. 

exposureType: ingress
adminPassword: "P@ssw0rd"
externalURL: http://myharbor.io

## Service parameters
##
service:
  ## @param service.type NGINX proxy service type
  ##
  type: ClusterIP

ingress:
  ## Configure the ingress resource that allows you to access Harbor Core
  ## ref: https://kubernetes.io/docs/user-guide/ingress/
  ##
  core:
    ingressClassName: "nginx"
    hostname: myharbor.io
  notary:
    ingressClassName: "nginx"
    hostname: notary.myharbor.io

persistence:
  ## @param persistence.enabled Enable the data persistence or not
  ##
  enabled: true
  persistentVolumeClaim:
    registry:
      storageClass: "nfs-sc"
      accessModes:
        - ReadWriteOnce
      size: 5Gi
    jobservice:
      storageClass: "nfs-sc"
      accessModes:
        - ReadWriteOnce
      size: 1Gi
      scanData:
        storageClass: "nfs-sc"
        accessModes:
          - ReadWriteOnce
        size: 1Gi
    trivy:
      storageClass: "nfs-sc"
      accessModes:
        - ReadWriteOnce
      size: 5Gi

 

만약, 특정 노드에 배포되기를 원하면 아래도 추가 하십시오.

사전에 Node lable을 추가하셔야 합니다. 

nginx:
  nodeSelector: { "role": "cicd" }
portal:
  nodeSelector: { "role": "cicd" }
core:
  nodeSelector: { "role": "cicd" }
jobservice:
  nodeSelector: { "role": "cicd" }
registry:
  nodeSelector: { "role": "cicd" }
trivy:
  nodeSelector: { "role": "cicd" }
exporter:
  nodeSelector: { "role": "cicd" }

* postgresql, redis는 values.yaml에 nodeSelector를 지정하는 부분이 없습니다.

설치 후에 수동으로 nodeSelector를 추가하여 배포할 노드를 조정하십시오. 

 

4) namespace 'harbor' 생성 

$ kubectl create ns harbor
$ kubens harbor

5) harbor 설치

helm install harbor -f values.yaml bitnami/harbor -n harbor

 

아래 명령을 실행하고, 모든 Pod가 정상적으로 실행될때까지 기다립니다.

watch kubectl get po

 

* harbor-core 파드가 '/etc/core/token' 디렉토리가 없다는 에러가 나면서 설치 안될 때

아래와 같이 빈 ConfigMap을 만들어서 마운트 시키면 해결 됩니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: harbor-core-token
  namespace: harbor
data:
  token: |

Deployment 'harbor-core'의 yaml을 읽어 파일로 만듭니다. 

k get deploy harbor-core -o yaml > core.yaml

기존에 EmptyDir 볼륨을 /etc/core/token으로 마운트 하는 부분을 아래 예처럼 바꾸고 적용하십시오. 

...

        volumeMounts:
        ...
        - mountPath: /etc/core/token
          name: core-token
          subPath: token
        
...
      volumes:
	  ... 
      - name: core-token
        configMap: 
          name: harbor-core-token

 

6) domain 등록

DNS서버 또는 작업 PC의 host PC의 hosts에 도메인을 등록합니다.

7) 설치 확인

ingress주소를 확인합니다.

kubectl get ing

NAME                    CLASS   HOSTS                ADDRESS     PORTS     AGE
harbor-ingress          nginx   myharbor.io          localhost   80, 443   7m38s
harbor-ingress-notary   nginx   notary.myharbor.io   localhost   80, 443   7m38s

웹브라우저를 실행하고 ingress 'harbor-ingress'의  HOSTS로 접근 합니다. 

ID는 admin으로 하고 암호는 values.yaml에서 지정한 값으로 로그인 합니다. 

 

8) harbor 재설치

helm으로 harbor 리소스들을 제거하고 다시 설치하면 됩니다. 

$ helm delete {release name} -n {namespace}
예) helm delete harbor -n harbor

$ helm install {release name} -f {config file} bitnami/harbor -n {namespace}
예) helm install harbor -f harbor-values.yaml bitnami/harbor -n harbor

만약 postgresql과  redis Pod가 'CrashLoopback'에러가 나면 harbor리소스 제거 후 모든 PVC도 제거하고 다시 설치해 보십시오. 

$ helm delete harbor -n harbor
$ kubectl delete pvc --all -n harbor
$ helm install harbor -f harbor-values.yaml bitnami/harbor -n harbor

 

오프라인 설치

오프라인 설치는 필요한 파일, container image를 인터넷이 되는 VM에서 다운로드하여,

설치할 VM으로 복사하시고 수행하면 됩니다.

1) container image 다운로드 

harbor에서 사용하는 container image를 알고 있다면 docker pull {image path}명령으로 다운로드 합니다. 

만약, image 리스트를 모른다면 인터넷이 되는 PC에 harbor를 임시 설치합니다. 

이는 필요한 container image 가 무엇인지 쉽게 찾기 위함입니다. 

아래와 같이 container images를 찾습니다.

kubectl get deploy -o yaml | grep image:
          image: docker.io/bitnami/chartmuseum:0.13.1-debian-10-r210
          image: docker.io/bitnami/harbor-core:2.4.0-debian-10-r0
          image: docker.io/bitnami/harbor-jobservice:2.3.3-debian-10-r29
          image: docker.io/bitnami/harbor-notary-server:2.4.0-debian-10-r0
          image: docker.io/bitnami/harbor-notary-signer:2.4.0-debian-10-r0
          image: docker.io/bitnami/harbor-portal:2.4.0-debian-10-r0
          image: docker.io/bitnami/harbor-registry:2.3.3-debian-10-r28
          image: docker.io/bitnami/harbor-registryctl:2.4.0-debian-10-r0

 

2) container image를 압축하고, 설치할 대상 VM에 복사한 후 이미지를 로딩합니다. 

- 압축파일 만들기: docker save <image path> -o <압축파일명>.tar

예) docker save docker.io/bitnami/chartmuseum:0.13.1-debian-10-r210 -o chartmuseum.tar

- 복사: scp <압축파일명>.tar root@<target VM IP>:<target VM의 대상 디렉토리>

- 이미지 로딩하기: docker load -i <압축파일명>.tar

* 디렉토리 전체를 복사할 때는 -r 옵션을 사용합니다.

scp -r <디렉토리> root@<target VM IP>:<target VM의 대상 디렉토리>

예) scp -r subdir root@169.10.12.155:~/install/harbor/    <- ~/install/harbor의 서브 디렉토리로 복사됨

3) horbor helmchart, 설치 설정 파일 복사

아래 예와 같이 helm chart를 다운로드 합니다. 

root@ubuntu1:~/install/harbor-k8s# helm pull bitnami/harbor
root@ubuntu1:~/install/harbor-k8s# ll
total 368
drwxr-xr-x 2 root root   4096 Nov 29 20:19 ./
drwxr-xr-x 6 root root   4096 Nov 29 18:23 ../
-rw-r--r-- 1 root root 220052 Nov 29 20:19 harbor-11.1.0.tgz
-rw-r--r-- 1 root root 142451 Nov 29 18:52 values.yaml

chart파일과 설치 설정 파일(values.yaml)을 대상 VM으로 복사합니다. 

4) harbor 설치

대상 VM에서 harbor chart압축을 해제 하고 '4) namespace 'harbor' 생성' 단계부터 설치를 합니다

 


docker-compose로 harbor 설치

 

1) 설치파일 다운로드

$ mkdir -p ~/install && cd ~/install
$ curl -s https://api.github.com/repos/goharbor/harbor/releases/latest | grep browser_download_url | cut -d '"' -f 4 | grep '\.tgz$' | wget -i -
$ tar xvzf harbor-offline-installer*.tgz
$ cd harbor

2) docker-compose 설치

$ curl -s https://api.github.com/repos/docker/compose/releases/latest | grep browser_download_url  | grep docker-compose-linux-x86_64 | cut -d '"' -f 4 | wget -qi -
$ chmod +x docker-compose-linux-x86_64
$ install docker-compose-linux-x86_64 /usr/local/bin/docker-compose
또는 mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
$ docker-compose version

현재 user를  docker그룹에 추가하고, docker 그룹을 생성함

$ sudo usermod -aG docker $USER
$ newgrp docker

3) SSL 인증서 생성

아래 글을 참조하여 SSL인증서를 만듭니다. 

주의) Mac사용자는 'Mac에 인증서 설치하기' 항목도 수행하여 주십시오. 

https://happycloud-lee.tistory.com/238?category=832250 

 

openssl로 SSL인증서 만들기와 Mac+Chrome에서 ERR_CERT_INVALID 에러 조치하기

openssl은 테스트나 학습 목적으로 SSL을 사용할 때 테스트 인증서를 만드는 유틸리티입니다. 실제 SSL로 서비스를 하기 위해서는 공인된 루트 인증기관(CA: Certification Authority. Verisign, Comodo)으로 부

happycloud-lee.tistory.com

 

4) 설치 환경 설정 파일 수정

설치 디렉토리로 이동
$ cd ~/work/harbor
$ cp harbor.yml.tmpl harbor.yml
$ vi harbor.yml

아래 항목을 적절히 수정 하세요. 

hostname, http.port, https.port, https.certificate, https.private_key, harbor_admin_password, data_volume

- http port와 https port는 포트 충돌을 피하기 위해 변경해주는게 좋습니다.  80, 443, 8443 외의 포트번호로 바꾸십시오.
  (netstat -anop | grep {port} 명령으로 기존에 포트가 사용중인지 확인할 수 있습니다.)
- hostname은 위에서  SSL key만들때 사용한 commonName으로 해야 합니다. (예제에서는 myharbor.io)

# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: myharbor.io

# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 8080

# https related config
https:
  # https port for harbor, default is 443
  port: 6443
  # The path of cert and key files for nginx
  certificate: /root/work/harbor/tls.crt
  private_key: /root/work/harbor/tls.key

{중략}

# The initial password of Harbor admin
# It only works in first time to install harbor
# Remember Change the admin password from UI after launching Harbor.
harbor_admin_password: happy@cloud

{중략}

# The default data volume
data_volume: /data/harbor

5) harbor 설치 

로그 디렉토리를 만듭니다. 

$ mkdir /var/log/harbor

설치 파일을 실행합니다. notary 와 chartmuseum을 같이 설치 하십시오.

$ ./install.sh --with-notary --with-chartmuseum

 

6) domain 등록

- DNS서버 또는 hosts에 도메인을 등록합니다.

hosts에 등록할때는 k8s cluster의 모든 노드와 host PC에 하셔야 합니다.  

$ vi /etc/hosts

 

7) 설치 확인

이제 웹브라우저를 실행하고 https://{host}:{https port}로 접근합니다. 

아래와 같이 로그인 페이지가 나오면 일단 설치는 성공입니다. 

id에 'admin'이라고 입력하고, 암호는 harbor.yml에서 설정한 값을 입력하여 로그인합니다. 

로그인까지 성공하면 성공적으로 설치된 것입니다. 

 

8) harbor 재시작

docker-compose를 이용하여 아래와 같이 재시작할 수 있습니다. 

harbor 사용중에 갑자기 연결이 안되면 docker-compose ps명령으로 중단된 서비스가 있는지 확인하고, 하나라도 중단되거나 재시작중이면 harbor를 전체 재시작 하십시오.

* 중요: root가 아닌 user 권한으로 설치 시 harbor.yml 이 있는 디렉토리 하위에 자동 생성되는 'common'디렉토리의 소유권 변경해야 함 

만약 pocuser로 섥치했다면 아래와 같이 하면 됨
[pocuser@bastion harbor]$ chown -R pocuser:pocuser common

docker-compose up할때는 '-d'옵션을 붙여서 백그라운드로 실행하십시오. 이 옵션을 주지 않고 올린 후 CTRL-C로 중단하면, 모든 서비스가 내려가게 됩니다.  

$ docker-compose restart 

또는 

$ docker-compose down
$ docker-compose up -d

container들의 상태를 보려면 docker-compose ps 명령을 이용 하십시오. 

9) uninstall

harbor디렉토리로 이동. docker-compose.yml이 있는 디렉토리입니다. 

$ docker-compose down
$ rm -rf /data/harbor /var/log/harbor

다시 설치할 때는 아래와 같이 log디렉토리를 만들고 install.sh를 실행합니다.
$ mkdir /var/log/harbor
$ ./install.sh --with-notary --with-chartmuseum

오프라인 설치

오프라인 설치는 필요한 파일, container image를 인터넷이 되는 VM에서 다운로드하여,

설치할 VM으로 복사하시고 수행하면 됩니다.

1) container image 다운로드 

harbor에서 사용하는 container image를 알고 있다면 docker pull {image path}명령으로 다운로드 합니다. 

만약, image 리스트를 모른다면 인터넷이 되는 PC에 harbor를 임시 설치합니다. 

이는 필요한 container image 가 무엇인지 쉽게 찾기 위함입니다. 

아래와 같이 container images를 찾습니다.

[root@osboxes ~]# docker images | grep harbor
goharbor/harbor-exporter                          v2.3.4    41f7fb260d0d   2 weeks ago    81.1MB
goharbor/chartmuseum-photon                       v2.3.4    f460981da720   2 weeks ago    179MB
goharbor/redis-photon                             v2.3.4    e4780c57b230   2 weeks ago    155MB
goharbor/trivy-adapter-photon                     v2.3.4    af0652363af0   2 weeks ago    130MB
goharbor/notary-server-photon                     v2.3.4    66c118fdbe3e   2 weeks ago    110MB
goharbor/notary-signer-photon                     v2.3.4    27d49a4ae0d3   2 weeks ago    108MB
goharbor/harbor-registryctl                       v2.3.4    0daeaba57fc6   2 weeks ago    133MB
goharbor/registry-photon                          v2.3.4    8497f259228a   2 weeks ago    81.9MB
goharbor/nginx-photon                             v2.3.4    2218fcda1ff0   2 weeks ago    45MB
goharbor/harbor-log                               v2.3.4    4d507b2e8131   2 weeks ago    159MB
goharbor/harbor-jobservice                        v2.3.4    5924b12f0b85   2 weeks ago    211MB
goharbor/harbor-core                              v2.3.4    dc8b74f8c4f3   2 weeks ago    193MB
goharbor/harbor-portal                            v2.3.4    770e6950323b   2 weeks ago    58.2MB
goharbor/harbor-db                                v2.3.4    8e2ed50e4699   2 weeks ago    228MB
goharbor/prepare                                  v2.3.4    cce1a590410d   2 weeks ago    254M

2) container image를 압축하고, 설치할 대상 VM에 복사한 후 이미지를 로딩합니다. 

- 압축파일 만들기: docker save <image path> -o <압축파일명>.tar

예) docker save goharbor/harbor-exporter -o harbor-exporter.tar

- 복사: scp <압축파일명>.tar root@<target VM IP>:<target VM의 대상 디렉토리>

- 이미지 로딩하기: docker load -i <압축파일명>.tar

* 디렉토리 전체를 복사할 때는 -r 옵션을 사용합니다.

scp -r <디렉토리> root@<target VM IP>:<target VM의 대상 디렉토리>

예) scp -r subdir root@169.10.12.155:~/install/harbor/    <- ~/install/harbor의 서브 디렉토리로 복사됨

3) docker-compose 복사

'docker-compose'파일을 대상 VM에 복사합니다. 

4) harbor 설치

'3) SSL 인증서 생성'단계부터 설치를 합니다. 

 


LDAP  연동

harbor설치 후 admin이 아닌 다른 유저를 생성하고 싶다면 LDAP을 연결 하십시오.

1) LDAP  설치

LDAP설치와 유저 생성 방법은 여기를 참조하십시오.

harbor를 docker-compose로 설치하였다면 LDAP도 container방식으로 설치하여야 합니다. 

k8s Pod방식으로 harbor를 설치하였다면 LDAP은  container형태와 k8s Pod형태 중 어떤 형식으로 설치하든 정상 동작합니다. 

 

2) LDAP 설정

admin으로 로그인 후 configuration에서 Auth Mode를 LDAP으로 변경한 후 아래 예제를 참조하여 셋팅하십시오.

아래는 설정 예시 입니다. 

LDAP을 container형태로 설치한 경우는 LDAP URL은 LDAP이 설치된 VM의 IP를 지정하면 됩니다. 

LDAP을 k8s Pod형태로 설치한 경우는 harbor도 k8s Pod로 설치하여야 하고, LDAP URL은 ldap://{LDAP service 주소}로 지정하여야 합니다. 예를 들면 ldap://ldap-openldap.ldap과 같이 k8s의 service 주소를 지정하여야 합니다. 

Auth Mode가 Database인 상태에서 user를 하나 생성하면, Auth mode를 더 이상 바꾸지 못합니다.

이런 경우는 harbor를 uninstall하고 다시 설치하실 수밖에 없습니다.

 

3) user 추가

harbor에서 user를 수동으로 추가할 수는 없습니다. 

LDAP에 추가한 user로 로그인을 하면 자동으로 harbor에 계정이 생성됩니다. 

4) group 추가

group은 수동으로 추가해 줘야 합니다. 

 

아래 예제와 같이 DN과 Name을 입력하여 LDAP의 그룹과 연결 합니다. 

DN: cn=developers,ou=groups,dc=myldap,dc=io

 

project 생성

harbor도 다른 image registry처럼 image를 관리하기 위해서는 project(hub.docker.com 의 Organization과 동일한 역할)를 만들어야 합니다. 

 

생성한 Project를 접근할 수 있는 멤버를 LDAP user 또는 group에서 추가할 수 있습니다. 

group을 추가할때는 harbor에 등록한 group을 지정하거나, LDAP에 바로 연결하여 group을 지정할 수 있습니다. 

LDAP에 연결하여 group을 가져오면, harbor에 자동으로 등록 됩니다. 

* helm chart를 이용하여 k8s Pod형태로 harbor를 설치한 경우는 Group 추가 옵션이 없습니다.

harbor에 LDAP group을 먼저 추가하고 Member에 group을 추가할 수 있습니다. 

 

Robot Account 생성

Robot Account는 docker CLI와  helm CLI에서만 사용할 수 있는 특수 계정입니다.

실제 harbor의 로그인 유저 계정 암호는 변경될 수 있기 때문에 Robot Account를 이용하는 것이 좋습니다. 

Admistrator는 "Administration > Robot Accounts'메뉴에서 만들 수 있습니다.  

주의할 것은 Name앞에 'robot$'가 붙는다는 것입니다. 

 

각 Project 멤버 중 'Project Admin'역할을 부여 받은 사람은 직접 robot account를 만들 수 있습니다.  

아래와 같이 Project를 열고 'Robot Accounts'탭을 누른 후 [NEW ROBOT ACCOUNT]버튼을 클릭하십시오. 

이렇게 Project에서 만든 robot account의 이름은 'robot${project}+{username}'으로 만들어 집니다. 

 

이제 docker login이나 helm repo add 같은 명령에서 실제 로그인 유저가 아닌 이 robot account를 사용할 수 있습니다. 

username을 지정할 때 주의할 점은 '$'가 특수문자이기 때문에 앞에 역슬래쉬를 반드시 붙여야 한다는 것입니다. 

'+'는 앞에 역슬래쉬를 안 붙여도 됩니다. 예를 들어 아래와 같이 사용하시면 됩니다. 

# docker login myharbor.io -u robot\$sc-ondal -p qYyyEeo3A1wRY7cYx3iNt0GEJud2VZJQ
...
Login Succeeded

# docker login myharbor.io -u robot\$sc-ondal+admin -p 4PdxlTulsrTjonSY3BDW5HLXalxPadRu
...
Login Succeeded

 

Container image를 harbor에 푸시하기 위한 docker 로그인 설정

build된 이미지를 harbor에 푸시하기 위한 작업입니다. 

docker로 harbor image registry로 로그인할 때 아래와 같이 에러가 날것입니다. 

이는 로그인을 시도하는 client PC 또는 VM에 harbor를 SSL로 접근하기 위해 필요한 CA(Certification Authority) 정보가 없기 때문입니다. 

# docker login myharbor.io
Username: ondal
Password:
Error response from daemon: Get "https://myharbor.io/v2/": x509: certificate signed by unknown authority

두가지 방법으로 로그인을 성공시킬 수 있습니다. 

1) insecure 모드로 인증

/etc/docker/daemon.json에 아래와 같이 CA없이 로그인할 registry host를 등록 하고, docker를 재기동 합니다. 

아래 예와 같이 'insecure-registries' 항목을 추가 하고 harbor의 host를 등록 합니다. 

$ vi /etc/docker/daemon.json

{
  "insecure-registries": [ "myharbor.io" ]
}

$ systemctl restart docker
$ watch kubectl get po -A

 

2) CA 파일 등록 하기

보안을 좀 더 강화하기 위해서는 docker login을 시도하는 Client PC/VM에 CA파일을 만듭니다. 

- /etc/docker디렉토리 밑에 certs.d/{harbor host} 디렉토리를 만듭니다.

예를 들어 harbor host가  myharbor.io라면 아래와 같이 디렉토리를 만듭니다. 

$ mkdir -p /etc/docker/certs.d/myharbor.io

- CA 파일 구하기

제일 쉬운 방법은 생성한 프로젝트를 들어가서 'Repositories'탭을 누른 후 [REGISTRY CERTIFICATE]버튼을 눌러 CA파일을 다운로드 하는 것입니다. 

다른 방법은 아래와 같습니다. 

k8s Pod로 harbor를 설치한 경우

$ mkdir -p ~/work/certs && cd ~/work/certs
$ kubectl get secret harbor-ingress -o yaml 

data:
  ca.crt: LS0tLS1CRUdJTiBD...tLQo=
  tls.crt: LS0tLS1CRUdJTi...S0tCg==
  tls.key: LS0tLS1CRUdJ...Qklu

ca.crt파일과 tls.key파일을 작성 합니다. 아래 순서대로 작업하시면 됩니다.

$ echo {secret 값} | base64 -d

결과 값을 클립보드에 복사

$ vi {filename} 

위 값을 붙여넣기 하고 저장

 

docker-compose로 harbor를 설치한 경우

위 설치 가이드대로 설치했다면 harbor.yml파일의 'https'항목에 위치가 있으며, 기본값은 '/etc/pki/tls/certs/harbor_registry.crt'파일입니다.

 

- CA 파일을 /etc/docker/certs.d/{harbor host}디렉토리로 복사 합니다. 

k8s Pod로 설치한 경우는 ca.crt파일을 복사하고, docker-compose로 설치한 경우는 harbor 설치 시 생성한 확장자가 crt인 파일을 복사 합니다. 

- docker를 재시작 합니다. 

$ systemctl restart docker
$ watch kubectl get po -A

모든 Pod가 정상적으로 실행되면 다시 docker login을 시도 합니다. 

 

k8s 클러스터에 컨테이너 배포시 harbor 사용 

위 'docker 로그인 설정' 작업은 build된 이미지를 harbor에 푸시하기 위한 작업입니다. 

k8s에 컨테이너를 배포할 때 harbor registry에서 image를 다운로드 받기 위해서는 이 작업도 반드시 해줘야 합니다. 

왜냐하면 harbor registry를 접근할 때 http가 아닌 https로 접근하기 때문에 정식 SSL 인증서로 harbor를  구성하지 않았다면, 

image를 다운로드 못하기 때문입니다.

설사 public repository에 있는 image라고 해도 https통신 자체가 안되기 때문에 image를 다운로드 못합니다.  

따라서 정식 SSL 인증서가 없는 경우는 insecure모드로 harbor registry를 접근하도록 구성해야 합니다. 

k8s에서 사용하는 Container Runtime 엔진에 따라 아래와 같이 작업합니다. 

1) ContainerD

각 노드의 /etc/containerd/config.toml 파일에 아래 예제와 같이 설정을 추가합니다. 

- [plugins.cri.registry.configs."myharbor.io".tls] 항목이 'myharbor.io'라는 harbor registry를 insecure 모드로 셋팅하는 겁니다. 

- 그 위에 있는 4줄은 image registry를 미러링(mirroring)하는 설정입니다. 이 예제에서는 docker.io를 myharbor.io로 미러링합니다.
   예를 들어 'docker.io/library/redis:latest'로 yaml에 명시되어 있다면 docker.io가 아니라 'myharbor.io'에서 이미지를 다운로드하게 됩니다. 즉, 'myharbor.io/library/redis:latest'로 변경이 되는 겁니다. 

[plugins.cri.registry]
    [plugins.cri.registry.mirrors]
        [plugins.cri.registry.mirrors."docker.io"]
            endpoint = ["http://myharbor.io"]
[plugins.cri.registry.configs."myharbor.io".tls]
    insecure_skip_verify = true

* 참고) image registry에 80 또는 443포트 외의 다른 포트를 쓴다면 설정 시 포트도 같이 적어야 합니다. 예) myharbor.io:5000

config.toml파일을 수정 한 후 containerd를 재시작 합니다. 

$ systemctl restart containerd

 

2) CRI-O

각 노드의 '/etc/containers/registries.conf.d/' 디렉토리에 registry를 위한 설정 파일을 생성합니다. 

파일 명은 아무거나 상관 없고 확장자는 conf라고 합니다. 예) myharbor.conf 

참고) https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md

아래 예제를 참고하여 작성하십시오. 

- unqualified-search-registries: 미러링할 registry 주소를 배열로 지정

- 맨 아래 3줄이 myharbor.io에 대한 insecure 설정입니다. 

- 그 위에 있는 설정들은 docker.io/library로 시작하는 image를 다운로드 하려할 때 'myharbor.io/library'로 미러링하게 하는 설정입니다. 

unqualified-search-registries = ["docker.io"]

[[registry]]
location = "docker.io/library"
insecure = false
blocked = false

[[registry.mirror]]
location = "myharbor.io/library"
insecure = true

[[registry]]
location = "myharbor.io"
insecure = true

파일을 생성한 후 아래와 같이 crio 서비스를 재시작 합니다. 

$ systemctl daemon-reload
$ systemctl restart crio

 

* 미러링을 하는 이유는 yaml파일의 image 경로를 바꾸지 않고 내부의 다른 image registry에서 이미지를 다운로드 하기 위해서입니다. 

 

helm chart upload

helm push plugin(github.com/chartmuseum/helm-push)으로 잘 되지 않습니다.

helm push 플러그인은 설치되지만 push하려고 하면 아래와 같이 실험 버전이라는 메시지가 나옵니다.

환경변수 셋팅을 해도 안됩니다.  

# helm push openldap-1.2.7.tgz library
Error: this feature has been marked as experimental and is not enabled by default. Please set HELM_EXPERIMENTAL_OCI=1 in your environment to use this feature

그냥, 간단하게 harbor web console에서 upload하시면 됩니다.

Chart File에 chart압축파일을 지정하고, Prov File은 비우시면 됩니다.

 

helm chart 사용 방법

harbor project를 helm chart registry로 사용할 수 있습니다. 

아래와 같이 helm chart registry를 추가하여 사용하면 됩니다.

1) 인증서 파일 구하기

위 'docker 로그인 설정'의 CA파일 구하기를 참조하여 구합니다. 

2) helm chart registry추가

아래와 같이 --username, --password, CA file을 파라미터로 제공해야 됩니다. 

user는 로그인 유저로 해도 되지만 암호가 변경되거나 유저가 삭제될 수 있기 때문에 robot account를 사용하는 것이 좋습니다.  

helm repo add harbor https://myharbor.io/chartrepo/sc-ondal --username robot\$sc-ondal --password qYyyEeo3A1wRY7cYx3iNt0GEJud2VZJQ --ca-file ca.crt

 

3) search chart and install

$ helm repo update

 

댓글

클라우드 네이티브 애플리케이션 부트캠프 알림