두 손끝의 창조자

도커에 설치된 Redmine을 Kubernetes 환경으로 이관 본문

DevOps

도커에 설치된 Redmine을 Kubernetes 환경으로 이관

codinglog 2023. 8. 22. 11:00

온프레미스에서 도커로 서비스하던 레드마인을 NCP로 이관하면서 수행한 내용 기록.

쿠버네티스는 NCP 서비스 사용(Master Node).

백업

데이터 베이스

redmine-postgres 컨테이너에서 데이터를 덤프한다.

legacy-host>docker exec -it redmine-postgres
redmine-postgres_container>/usr/bin/pg_dump -U redmine -d redmine -Fc --file=redmine.sqlc redmine # U=user, d=database

💡 host에 psql이 설치되어 있다면 호스트에서 덤프를 한다.  psql -h [legacy-host-ip] -U redmine -d redmine -p [DB포트]

덤프한 파일을 호스트로 가져온다.

legacy-host>docker cp redmine-postgres:/redmine.sqlc ~/redmine-backup/db/redmine.sqlc

파일

호스트에 볼륨 설정이 되어 있으므로 저장된 파일을 확인한다.

컨테이너의 /usr/src/redmine/files 위치와 연결된 호스트 경로를 확인한다.

설정 파일

설정 파일 디렉토리 전체를 호스트로 가져온다.

legacy-host>docker cp redmine-postgres:/usr/src/redmine/config ~/redmine-backup/config

테마 파일 디렉토리 전체를 호스트로 가져옴

legacy-host>docker cp redmine-postgres:/usr/src/redmine/public/themes ~/redmine-backup/themes

플러그인 파일 디렉토리 전체를 호스트로 가져옴

legacy-host>docker cp redmine-postgres:/usr/src/redmine/plugins ~/redmine-backup/plugins

백업 파일 로컬 PC로 이관

💡 kubectl 이 legacy-host에 설치되어 있으면 legacy-host에서 직접 수행한다.

파일 이동

local>rsync -avz redmine@[legacy-host-ip]:~/redmine-backup ~/redmine-backup
local>rsync -avz redmine@[legacy-host-ip]:[파일볼륨경로] ~/redmine-backup/files

복원

Database pod 생성

StatefulSet 생성

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres-statefulset
spec:
  serviceName : postgres
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:15.4
          ports:
            - protocol: TCP
              containerPort: [DB포트]
          volumeMounts:
            - name: postgres-volume
              mountPath: /var/lib/postgresql/data
          env:
            - name: POSTGRES_USER
              value: redmine
            - name: POSTGRES_PASSWORD
              value: [DB패스워드]        
      volumes:
        - name: postgres-volume
          hostPath:
            path: [데이터베이스 데이터 마운트위치] 
            type: DirectoryOrCreate

Headless Service 생성

apiVersion: v1
kind: Service
metadata:
  name: postgres-service
spec:
  clusterIP: None
  selector:
    app: postgres
  ports:
    - protocol: TCP
      port: [DB포트]

DB 데이터 복원

클라이언트 파드 활용한 DB 접속

  • DB에 접근하기 위해 클-라이언트 파드를 만들어서 활용한다.
  • local>k run -it --rm postgres-client --image=postgres:15.4 --restart=Never -- sh
  • 생성된 파드에 덤프한 파일을 옮긴다.(새 CLI을 열어서 해야함)
  • local>kubectl cp ~/redmine-backup/db/redmine.sqlc default/[postgres-client 파드ID]:/root/redmine.sqlc
  • DB에 접속해 복원한다.
  • 💡 postgres-service 는 kebernetes에서 변환한다.
  • postgres-client>psql -h postgres-service -U redmine -d redmine -p [DB포트] #접속 테스트 postgres-client>pg_restore -h postgres-service -p [DB포트] -U redmine -d redmine /root/redmine.sqlc

설정 및 파일 복원

파일을 클라우드 노드에 복사

로컬에 백업해놓은 파일 데이터를 Node와 연결된 스토리지로 복사한다.

local>rsync -avz ~/redmine-backup/files redmine@[클라우드 노드 IP]:/[REDMINE 파일 마운트 위치]

설정 파일 노드에 복사

local>rsync -avz ~/redmine-backup/config redmine@[클라우드 노드 IP]:/[REDMINE 설정 마운트 위치]

테마 파일 노드에 복사

local>rsync -avz ~/redmine-backup/themes redmine@[클라우드 노드 IP]:/[REDMINE 테마 마운트 위치]

플러그인 파일 노드에 복사

local>rsync -avz ~/redmine-backup/plugins redmine@[클라우드 노드 IP]:/[REDMINE 테마 마운트 위치]

REDMINE 파드 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redmine-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redmine
  template:
    metadata:
      labels:
        app: redmine
    spec:
      containers:
        - name: redmine
          image: redmine:5.0.5
          ports:
            - protocol: TCP
              containerPort: 3000
          env:
            - name: REDMINE_DB_POSTGRES
              value: postgres-service
            - name: REDMINE_DB_PORT
              value: [DB포트]
            - name: REDMINE_DB_USERNAME
              value: redmine
            - name: REDMINE_DB_PASSWORD
              value: [DB패스워드]
          volumeMounts:
            - name: redmine-volume
              mountPath: /usr/src/redmine/files
            - name: redmine-volume-config
              mountPath: /usr/src/redmine/config
            - name: redmine-volume-themes
              mountPath: /usr/src/redmine/public/themes
            - name: redmine-volume-plugins
              mountPath: /usr/src/redmine/plugins
      volumes:
        - name: redmine-volume
          hostPath:
            path: [REDMINE 파일 마운트 위치]
            type: DirectoryOrCreate
        - name: redmine-volume-config
          hostPath:
            path: [REDMINE 설정 마운트 위치]
            type: DirectoryOrCreate
        - name: redmine-volume-themes
          hostPath:
            path: [REDMINE 테마 마운트 위치]
            type: DirectoryOrCreate
        - name: redmine-volume-plugins
          hostPath:
            path: [REDMINE 플러그인 마운트 위치]
            type: DirectoryOrCreate

💡 /usr/src/redmine/config 에서 configuration.yml 만 volume 설정을 하고자 하였으나 쓰기 오류 등 발생하여 전체 디렉토리를 마운트 하였음.

서비스 생성

apiVersion: v1
kind: Service
metadata:
  name: redmine-service
spec:
  selector:
    app: redmine
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
  type: LoadBalancer
반응형
Comments