Study/CI&CD

Nexus 3.71.0 버전 이후 OrientDB 지원 중단 관련 설정 변경하기

Bluesky_ 2024. 11. 6. 21:37
반응형

Nexus 3.71.0 버전 이후 OrientDB 지원 중단

kubernetes pod에 띄워 잘 사용하던 nexus가 어느 날부터 뜨지 않는다.

로그를 살펴보니 다음과 같이 안내되어 있다.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

This instance is using a legacy Orient database.
You must migrate to H2 or PostgreSQL before upgrading to this version. See our database migration help documentation at:
https://links.sonatype.com/products/nxrm3/docs/unsupported-db.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

https://help.sonatype.com/en/migrating-to-a-new-database.html

이전 버전의 nexus 사용 시 별다른 설정을 하지 않으면 기본 설정이 내장 db인 OrientDB 를 사용하는데 3.71.0 이상 버전을 사용하면 더 이상 OrientDB 를 지원하지 않으므로 내장 H2 나 외부 PostgreSQL 로 변경해야 한다.

Migration 하기

기존 데이터를 migration 하려면 아래 링크를 참조하면 된다.
https://help.sonatype.com/en/upgrading-to-nexus-repository-3-71-0-and-beyond.html

내 경우 그냥 기존 데이터를 버리고 새로 설치했다.

설정하기

기존 데이터를 버리고 새로 설정을 진행하려고 하면 migration 과정은 생략하고 기존 /nexus-data 폴더를 비운 후 아래 설정만 진행해 주면 된다.

PostgreSQL 사용 시엔 /nexus-data/etc/fabric 위치에 nexus-store.properties 파일을 생성하고 아래 정보를 적절히 추가해 준다.

username=<postgres_user>
password=<postgres_password> 
jdbcUrl=jdbc\:postgresql\://<database-host>\:<database-port>/nexus

외부 PostgreSQL을 사용하건 내장 H2을 사용하건 두 경우 모두 아래 설정을 /nexus-data/etc/nexus.properties 파일에 추가해 준다.

nexus.datastore.enabled=true

Kubernetes Deployment 설정 참고 사항

docker hub의 sonartype/nexus3 이미지를 사용하는 경우 기본 설정이 아래와 같다.

ENV INSTALL4J_ADD_VM_PARAMS=-Xms2703m -Xmx2703m -XX:MaxDirectMemorySize=2703m -Djava.util.prefs.userRoot=/nexus-data/javaprefs

kubernetes로 띄우는 경우 resource limit 설정을 위 설정 이상으로 잡아주어야 한다.
내 경우 대략 아래와 같이 설정하였다.

    spec:
      containers:
      - name: nexus
        image: sonatype/nexus3:latest
        ports:
        - containerPort: 8081
        - containerPort: 8083
        resources:
          requests:
            memory: '1Gi'
          limits:
            memory: '3Gi'

이전 설정은 limit가 2Gi 였는데 startup 시점에 2Gi 를 초과하면서 pod가 evict 되어 늘려주어야 했다.

Nexus 설정 다시 하기

이전 nexus data를 migration 하지 않고 새로 진행하면서 관련 설정에 대해 기록해 본다.
rancher desktop을 사용하면서 nexus, jenkins 사용 관련하여 필요한 설정들이다.

nexus admin password 설정

초기 비번이 /nexus-data/admin.password 위치에 저장되어 있다. 해당 비번으로 로그인 후 변경해 준다.
변경 이후 해당 파일은 삭제된다.

nexus repository 구성

maven repository

내 경우 기본 설정된 maven repository (maven-releases , maven-snapshots )를 그대로 사용하여서 별도의 설정은 필요 없었다.

docker repository

docker repository의 경우 기본 설정으로 제공되지 않기 때문에 docker hosted repository를 추가해주어야 한다.

내 경우 nexus-service:8083 로 docker hosted port를 설정하여 사용하고 있다.
따라서 nexus에서 repository 생성 시 http 요청을 8083 으로 설정해 준다.

여기까지 설정하면 jenkins에서 docker image upload는 잘 동작한다.

이전엔 nexus docker hosted repostiory 추가 할 때 v1 api 설정을 활성화해야 했던 거 같은데 굳이 하지 않아도 이제 정상 호출이 되는 듯했다.

rancher-desktop wsl insecure-registries 설정 추가

pod 생성에 에러가 발생하여 kubectl describe po [해당 pod] 로 확인해 보니 다음과 같은 에러가 발생한다.

  Warning  Failed                           12m (x3 over 12m)     kubelet            Failed to pull image "nexus.bluesky.local:8083/luversof/bluesky-cloud-admin-server:0.0.1-SNAPSHOT.179": Error response from daemon: Get "https://nexus.bluesky.local:8083/v2/": http: server gave HTTP response to HTTPS client

kubernetes deployment에서 upload 된 docker image 호출 시 기본 설정은 https로 호출을 한다.
http로 호출을 변경하려면 wsl의 /etc/docker/daemon.json 파일에 insecure-registries설정을 추가해줘야 한다.
(내 경우 rancher desktop을 사용하고 있어 해당 사용 기준 설정임)

{
   // 아래 내용 추가
   "insecure-registries": [  
       "nexus.bluesky.local:8083", "nexus-service:8083"  
   ]  
}

kubernetes secret 생성

http 호출로 변경하고 다시 배포해 보면 pod describe에서 다음과 같이 에러가 보인다.

  Warning  Failed                           9s               kubelet            Failed to pull image "nexus.bluesky.local:8083/luversof/bluesky-cloud-admin-server:0.0.1-SNAPSHOT.179": Error response from daemon: Head "http://nexus.bluesky.local:8083/v2/luversof/bluesky-cloud-admin-server/manifests/0.0.1-SNAPSHOT.179": no basic auth credentials

http로 호출은 하였지만 인증을 처리하지 못하였다.
내 경우 deployments에 imagePullSecret 을 다음과 같이 설정하였다.

      imagePullSecrets:
        - name: regcred

image를 pull 할 때 해당 secret을 사용하여 인증을 처리한다.
해당 secret을 대략 다음처럼 생성해 준다.

kubectl -n default create secret docker-registry regcred --docker-server=nexus.bluesky.local:8083 --docker-username=[유저이름] --docker-password=[비밀번호] --docker-email=[이메일]

 

반응형