본문 바로가기

윈도우 개발환경

쿠버네티스로 MSA DevOps 환경 구축; Harbor - Registry 개선

Minikube에서 제공하는 Registry는 개발할 때 가볍게 사용하기에는 무리가 없지만, 개발이 복잡해지거나 관리해야 할 컨테이너가 많아지면 불편해지기 시작한다. 물론 클라우드 플랫폼을 서비스하는 회사들이 제공하는 컨테이너 레지스트리를 사용하면 기능면에서 편리하지만 이것저것 막 테스트 하기에는 비용 지출이 좀 생긴다. 이때 고려해 볼 만한 제품이 브로드콤에서 제공하는 Harbor이다.

 

Harbor

Our mission is to be the trusted cloud native repository for Kubernetes

goharbor.io

Harbor는 도커에 설치하거나 쿠버네티스에 설치해서 사용하는데, 이번에는 지난번에 설치해 놓은 minikube에 설치해서 사용할 수 있도록 만들어 보기로 했다.

 

harbor registry도 default namespace를 사용하면 pod목록을 표시하면 나타나기 때문에 kube-xxx처럼 별도의 namespace를 만들고 생성한다.

 

kubectl create namespace harbor

 

쿠버네티스로 설치하기 위한 Helm Chart를 가져온다. 먼저 harbor용 helm 리포지토리를 추가하고 helm chart를 내려 받는다.

 

helm repo add harbor https://helm.goharbor.io
helm fetch harbor/harbor --untar

 

Harbor 공홈에 나와 있듯이 Helm을 사용해서 설치하기 위해서는 몇 가지 값을 변경해야 한다. harbor폴더로 가서 values.yaml 파일을 열고

 

나는 내 노트북에서 사용할 예정이므로 https를 사용하지 않기 위해 tls를 disable 했고

 

# values.yaml
...
    # the port must be included in the command when pulling/pushing images.
    # Refer to https://github.com/goharbor/harbor/issues/5291 for details.
    enabled: false
    # The source of the tls certificate. Set as "auto", "secret"
...

 

https를 사용하지 않으면 삭제하라고 한 ssl-redirect도 다 코멘트로 막고,

 

# values.yaml
...
      # note different ingress controllers may require a different ssl-redirect annotation
      # for Envoy, use ingress.kubernetes.io/force-ssl-redirect: "true" and remove the nginx lines below
      # ingress.kubernetes.io/ssl-redirect: "true"
      ingress.kubernetes.io/proxy-body-size: "0"
      # nginx.ingress.kubernetes.io/ssl-redirect: "true"
      nginx.ingress.kubernetes.io/proxy-body-size: "0"
    # ingress-specific labels
    labels: {}
...

 

내부 도메인명을 임의로 "harbor.internal"로 하고 "C:\Windows\System32\drivers\etc\hosts" 파일에 추가하고,

 

# C:\Windows\System32\drivers\etc\hosts
...
192.168.59.103 harbor.internal

 

values.yaml에 해당 도메인으로 모두 수정하고,

 

# values.yaml
...
  ingress:
    hosts:
      core: harbor.internal
      # core: core.harbor.domain
    # set to the type of ingress controller if it has specific requirements.
    # leave as `default` for most ingress controllers.
...
#
# If Harbor is deployed behind the proxy, set it as the URL of proxy
externalURL: http://harbor.internal

# The persistence is enabled by default and a default StorageClass
...

 

네트워크를 열기 위한 설정을 NodePort를 제외하고 LoadBalaner, ClusterIP는 코멘트로 막고,

 

# values.yaml
...
    # loadBalancer:
    #   # The name of LoadBalancer service
    #   name: harbor
    #   # Set the IP if the LoadBalancer supports assigning IP
    #   IP: ""
    #   ports:
    #     # The service port Harbor listens on when serving HTTP
    #     httpPort: 80
    #     # The service port Harbor listens on when serving HTTPS
    #     httpsPort: 443
    #   # Annotations on the loadBalancer service
    #   annotations: {}
    #   # loadBalancer-specific labels
    #   labels: {}
    #   sourceRanges: []
...

 

helm install을 실행했다.

 

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

 

 

설치가 끝나고 ingress와 service를 확인해 보니

 

 

로 나와 registry는 외부 Port가 할당되지 않아 PortForard를 해줘야 하는 것 같이 보인다. 먼저 harbor.internal을 브라우저로 열어 보면

 

 

잘 연결이 되고, 5000번 포트는 연결이 되지 않는 것을 확인하고 PortForwarding을 해 주고 나니 연결이 되었다.

 

kubectl port-forward -n harbor service/harbor-registry 5000:5000

 

localhost:5000/v2/_catalog를 요청하니 Unauthorized에러가 나와 스택오버플로를 찾아보니, harbor에서는 /v2부터 아래와 같이 연결을 해야 한다고 한다.

 

TOKEN=$(echo -n '<your username>:<your password>' | base64) 
curl -v -k -H "Authorization: Basic $TOKEN" http://<harbor registry server>/v2/_catalog