본문 바로가기
열심히 직장인/Hello World

서버와 컨테이너, 그리고 POD (CI/CD 파이프라인 흐름)

by 양파_ 2024. 11. 13.
728x90
반응형

 

지금 개발하고 있는 프로젝트는 POD로 배포된다.

나는 항상 로컬에서만 테스트를 하고 있었고, 배포는 다른 분이 하고 있었기에 어떻게 패키징 돼서 배포되는지는 사실 당장의 관심사가 아니었다.

최근 스프링 애플리케이션에서 쉘 스크립트를 실행해 원격지에서 파일을 다운로드한 후 내용을 수정하고, bash 쉘에서 git 명령어를 사용하는 코드를 작성하게 되었다.

로컬에서 실행할 땐 문제가 없었기에 됬다! 싶었는데 누군가 서버에 올리고 테스트해 봤어? 안될걸~이라고 해서 테스트해 보니 정말 동작하지 않았다.

  1. bash 쉘이 없다. (충격)
  2. git이 설치되지 않았다. (2차 충격)

현재 경로에 temp 디렉토리를 만들고 파일을 다운로드하도록 코드를 작성했고, 로그 상 파일은 정상적으로 다운된 것으로 확인되었다. 서버에 접속해 다운로드한 파일의 내용이 정상인지 보고 싶었는데 배포해 주는 분께 물어보니 접속 방법이 있긴 할 텐데 모른다고 하셔서 3차 충격을 받았다.

왜????? 내가 아는 그 서버에 배포되는 게 아니었나?

의문을 품다가 우리는 POD를 통해 배포한다고 해서 알아본 오늘의 주제는 서버와 컨테이너, 그리고 POD의 관계다.

 


 

 

서버(Server)란?

  • 네트워크를 통해 클라이언트에 서비스를 제공하는 컴퓨터 시스템
  • 종류: 물리 서버 / 가상서버 / 클라우드 서버

 

가상 서버 vs 클라우드 서버

 

공통점: 가상화 기술 기반

차이점:

클라우드 서버 → 인터넷을 통해 제공되는 가상 서버로, 물리서버에 의존하지 않아 유연한 확장성과 고가용성이 특징. 

                                테이너나 쿠버네티스 클러스터 실행 가능

가상서버 → 단일 물리 서버위에 여러 개의 독립 서버를 생성

 

 

컨테이너(Container)란?

  • 애플리케이션과 그 실행에 필요한 라이브러리, 의존성을 하나의 단위로 묶어 배포할 수 있는 가상화된 실행환경 (일관된 실행 환경 보장)
  • 가상머신(가상서버)과 달리 호스트 운영체제의 커널을 공유
  • 하나의 클라우드 서버 위에서 실행되며, 여러 개의 컨테이너 실행 가능
  • 대표적인 기술 : Docker, CRI-O

 

파드(POD)란?

  • 쿠버네티스에서 가장 작은 배포 단위
  • 하나 이상의 컨테이너를 그룹화하여 관리
  • 주로 한 개의 컨테이너만 포함하지만 필요한 경우 하나의 POD안에 여러 개의 컨테이너 배치 가능
  • POD 내의 컨테이너들은 같은 IP 주소를 사용하며 localhost로 서로 통신 가능
  • front, back, db와 같은 각각의 POD에 필요한 컨테이너를 넣어 전체 애플리케이션을 구성 가능 
  • POD 내 파일 저장 특징: POD 내부의 파일 시스템은 일시적으로 POD가 재시작되면 저장된 파일들은 모두 삭제된다.

 

 

서버, 컨테이너, POD의 계층적 관계

컨테이너와 POD는 클라우드 서버 위에서 동작하는 구성 요소!

 

[서버]

├── 물리 서버 (Physical Server)

├── 가상 서버 (Virtual Server)

└── 클라우드 서버 (Cloud Server)

                        └── [컨테이너] 여러 개의 컨테이너가 하나의 서버에서 실행됨

                                               └── [POD] 하나 이상의 컨테이너를 묶어서 관리 (Kubernetes 환경에서)

 

 

 

컨테이너 vs POD

  컨테이너  POD
용도 단일 애플리케이션 또는 서비스 밀접하게 연관된 여러 컨테이너를 그룹화하여 완전한 애플리케이션 구성
리소스 공유 독립적 (컨테이너별 자체 IP) POD내 컨테이너 간 네트워크, IPC, 스토리지 등 리소스 공유
배포 및 관리 Docker 같은 컨테이너 런타임에 의해 직접 관리 쿠버네티스에 의해 생성, 관리, 스케줄링

 


 CI/CD 파이프라인 흐름 ( GITLAB + Docker + HARBOR + OKD)

 

1. 소스코드 Push 단계

- 개발자가 gitlab에 소스코드를 push

- GitLab CI/CD 파이프라인은 .gitlab-ci.yml 파일에 정의된 단계에 따라 실행.

 

2. 빌드 단계 (Docker + Harbor)

- GitLab Runner가 동작하며 Docker를 사용해 소스코드를 컨테이너 이미지로 빌드 

- 빌드된 이미지는 Harbor 레지스트리에 저장

- Harbor는 이미지의 보안 스캔 및 취약점 검사 수행

 

3. 배포 단계 (OKD  + Docker)

- OKD(OpenShift)가 Harbor 레지스트리에서 검증된 이미지를 가져옴

- 배포된 이미지는 Pod 형태로 실행되어 애플리케이션 배포

- OKD는 내부적으로 Docker를 사용해서 컨테이너 생성 및 관리

 

* HARBOR란?

- 엔터프라이즈급 컨테이너 레지스트리

- 컨테이너 이미지를 저장, 관리, 배포하는 오픈소스 도구

- 웹 UI를 통한 직관적인 이미지 관리 가능

 

* OKD( OpenShift Container Platform )란?

- 쿠버네티스를 기반으로 하는 컨테이너 애플리케이션 플랫폼

- POD 생성 및 관리


 

마무리하며..

 

 

그래서 내 근본적인 궁금증에 대해 GPT에게 물어본 내용

 

다운받은 파일은 어디로 갈까? 

-> 컨테이너의 WORKDIR에 지정된 경로에 저장됩니다

Dockerfile에서 지정하지 않았다면 일반적으로 /app 디렉토리가 됩니다.  Pod가 재시작되면 저장된 파일들은 모두 삭제됩니다 현재 경로(./)는 컨테이너 내부의 작업 디렉토리를 의미합니다

 

POD에도 운영체제가 있는걸까? POD에서 리눅스 명령어를 사용해서 파일을 볼 수 있나?

-> Pod 자체는 운영체제를 가지지 않지만, Pod 내의 컨테이너들은 기본 운영체제 이미지를 포함합니다. Pod는 ‘.spec.os.name’필드를 통해 windows 또는 linux를 지정할 수 있습니다

 

POD 내 파일을 확인하는 방법은?

-> KUBECTL 명령어를 실행해 POD 내부 쉘로 직접 접속한다.

-> POD의 로그를 확인한다.

 

 

나는 파일을 다운받아 처리 후 git 명령어를 통해 gitlab에 push까지 하는 프로그램을 만들어야 했는데, 

pod에 대해 알아보다가 설정을 건드릴 자신이 없어서 그냥 git 명령어가 아닌 gitlab api를 사용해 스프링에서 바로 push 하는 것으로 전체 코드를 수정해서 마무리했다.

반응형