Kubernetes에서 Nexus Registry 사용하기 ('/v2/ failed with status' 에러 해결)

brillog·2024년 1월 22일
0

Opensource

목록 보기
4/4

Prerequisites

$ kubectl get all -n nexus
NAME                         READY   STATUS    RESTARTS   AGE
pod/nexus-5d4d77f854-hqzw9   1/1     Running   0          8h

NAME                    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/nexus-service   NodePort   172.20.124.79   <none>        8081:32000/TCP   29h

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nexus   1/1     1            1           29h

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nexus-5d4d77f854   1         1         1       8h
replicaset.apps/nexus-98664b57c    0         0         0       29h

Repository 생성

admin page에서 repository 생성 ('Create repository' 클릭)

  • Recipe: docker (hosted)
  • Name: 자유
  • HTTP: registry가 사용할 포트 지정 (ex. 5000으로 설정)

NexusRepositorySetting

이 때 docker login을 그냥 docker login https://nexus.mydomain.com/repositry/registry과 같이 하면 다음과 같은 에러가 발생함

$ docker login registry.mydomain.com
Username: admin
Password:
Error response from daemon: login attempt to https://nexus.mydomain.com/v2/ failed with status: 404 Not Found

registry 포트 (ex. 5000)를 위한 domain을 따로 생성해야 하기 때문에 이를 위한 service와 ingress를 추가로 생성해 줘야 함

Service & Ingress 설정

Service 생성 or 수정

Service는 새로 생성 or 기존 Service를 edit 하는 방식 중 선택

Case 1) Service 생성

service.yaml 배포

apiVersion: v1
kind: Service
metadata:
  annotations:
  name: registry-service
  namespace: nexus
spec:
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: web
    port: 5000
    protocol: TCP
    targetPort: 5000
  selector:
    app: nexus-server
  sessionAffinity: None
  type: NodePort

Case 2) Service 수정

kubectl edit svc nexus-service -n nexus -o yaml로 기존 Nexus Service 수정

...
spec:
  ...
  ports:
  - name: web
    nodePort: 32000
    port: 8081
    protocol: TCP
    targetPort: 8081
  - name: docker-registry  # 추가
    nodePort: 32001
    port: 5000
    protocol: TCP
    targetPort: 5000

Ingress 생성

ingress.yaml 배포

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: nexus
  name: nexus-registry-ingress
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/load-balancer-name: <생성할_LB_NAME>
    alb.ingress.kubernetes.io/subnets: <SUBNET_ID_1>,<SUBNET_ID_2>0f270c23469d3d818
    alb.ingress.kubernetes.io/group.name: <GROUP_NAME>
    # SSL Settings
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:<REGION-CODE>:<ACCOUNT_ID>:certificate/<CERTIFICATE_ID>
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
    alb.ingress.kubernetes.io/ssl-redirect: '443'
spec:
  rules:
    - host: registry.mydomain.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: registry-service # Case 1 (Case 2의 경우는 'nexus-service'로 입력)
                port:
                  number: 5000

배포한 리소스 생성 확인

$ kubectl get all -n nexus
NAME                        READY   STATUS    RESTARTS   AGE
pod/nexus-9b9f54dcb-gb9qw   1/1     Running   0          62m

NAME                            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/registry-service.       NodePort   172.20.151.43   <none>        5000:31786/TCP   54m
service/nexus-service           NodePort   172.20.124.79   <none>        8081:32000/TCP   31h

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nexus   1/1     1            1           31h

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nexus-5d4d77f854   0         0         0       10h
replicaset.apps/nexus-98664b57c    0         0         0       31h
replicaset.apps/nexus-9b9f54dcb    1         1         1       62m
$ kubectl get ingress -n nexus
NAME                     CLASS    HOSTS                    ADDRESS        PORTS   AGE
nexus-registry-ingress   <none>   registry.mydomain.com    <ALB_DNS>      80      52m
nexus-web-ingress        <none>   nexus.mydomain.com       <ALB_DNS>      80      3h

트러블슈팅

위와 같이 registry port로 설정한 5000번 포트 사용을 위한 Service, Ingress 생성 후 docker login 시 아래와 같은 에러가 발생함

$ docker login registry.mydomain.com
Username: admin
Password:
Error response from daemon: login attempt to https://registry.mydomain.com/v2/ failed with status: 401 Unauthorized

아래와 같이 Nexus admin page > Realms > 'Docker Bearer Token Realms'를 Active 쪽으로 이동 > Save 클릭한 뒤 docker login 시 정상적으로 로그인되는 것을 확인할 수 있음

NexusSecuritySetting

로그인 결과 확인

docker login registry.mydomain.com
Username: admin
Password:
Login Succeeded

Reference

개인적으로 공부하며 작성한 글로, 내용에 오류가 있을 수 있습니다.

profile
클라우드 엔지니어 ♡

0개의 댓글