Cloud

쿠버네티스! 오픈쉬프트! 그리고 컨테이너 I

naleejang 2020. 11. 16. 12:04

안녕하세요~!!이번에는 컨테이너 관리 플랫폼인 쿠버네티스의 기업용 배포판인 오픈쉬프트에 대해 알아보면서 알게된것 그리고, 견해들을 정리해 보았습니다. 개발에서 손을 놓은지가 오래되어서 그런지 생각보다 봐야할 것도 많고 알아야할것도 참 많다 라는 생각을 했습니다. 오래오래 보고 같이 보면 좋으니까 여기에 포스팅해 봅니다. 

 

컨테이너 기술이 나오기까지

물리서버, 가상서버 그리고 컨테이너는 모두 비슷한 속성을 가지고 있습니다. 이들은 모두 기업의 IT 인프라를 구성하기 위한 자원들이며, 기업의 서비스를 하기 위한 어플리케이션을 개발하고, 운영하기 위한 용도로 사용됩니다. 

예를 들어 회사에서 애플리케이션 서버를 하나 구성한다고 가정해 봅시다. 베어메탈 서버로 구성을 하든, 가상 서버로 구성을 하든, 컨테이너로 구성을 하든 모든 서버는 CPU가 필요하고, Memory가 있어야 하며, 서로간에 통신을 할 수 있는 네트워크 IP가 필요합니다. 또한 운영체제를 설치하고 다양한 애플리케이션들을 설치 할 Disk가 필요합니다. 또한, 운영체제도 있어야겠죠! 운영체제 위에는 애플리케이션을 서비스 할 수 있는 Web, Was, DB와 같은 애플리케이션도 필요합니다. 

 

이때 우리는 베어메탈 서버를 이용하여 구성을 할 수도 있고, 가상 서버를 이용하여 구성을 할 수도 있을 것이며, 컨테이너를 이용하여 구성을 할 수도 있을 것입니다. 

 

베어메탈 서버를 이용하여 애플리케이션 서버를 구성할 경우 운영체제를 설치하고, 네트워크 환경을 설정한 후 각종 애플리케이션을 설치해야 합니다. 가상 서버를 이용할 경우에는 기존에 준비되어 있는 운영체제 종류와 서버 사양을 선택한 후 가상 서버가 생성되면 애플리케이션을 설치합니다. 컨테이너 환경일 경우에는 기존의 베어메탈 서버나 가상 서버를 이용하여 해당 애플리케이션이 구성되어 있는 컨테이너 이미지를 컨테이너 레지스트리에서 다운로드 받아 컨테이너로 실행만 하면 됩니다.

 

베어메탈 환경에서는 직접 서비스를 구성할 수도 있지만, 하이퍼바이저 환경을 구성하여 여러개의 가상서버를 제공할 수도 있습니다. 또는 베어메탈 서버나 가상서버에 컨테이너 환경을 구성하여 컨테이너를 제공할 수 있습니다. 고사양의 베어메탈 서버에 단일 애플리케이션 서비스를 운영하는 것 보다는 하이퍼바이저 환경이나 컨테이너 환경을 이용하면 다양한 운영체제 서버와 다양한 애플리케이션 서비스를 이용할 수 있습니다. 이렇게 자원을 사용함으로써 좀 더 효율적으로 자원을 사용할 수 있습니다. 

이렇게 가상자원의 활용이 늘어나면서 서버 한대에서 운영했던 환경들은 여러대의 서버로 확장이 되었고, 여러대의 서버는 수십에서 수백대의 서버로 운영 환경이 늘어나기 시작했습니다. 그래서, 좀 더 많은 자원을  효율적으로 관리하고, 좀 더 많은 사람들이 사용할 수 있는 서비스를 제공하기 위한 플랫폼들이 등장하기 시작했습니다. 

 

그 중에서 컨테이너 환경을 관리하고, 서비스할 수 있도록 지원해 주는 오픈소스 플랫폼이 바로 쿠버네티스입니다. 오픈소스는 사용자가 직접 소스 개발에 참여할 수 있으며, 환경 배포, 운영 및 트러블슈팅 등을 직접 해야 합니다. 따라서, 매우 고난이도의 기술들을 필요로 하기 때문에, 기업의 비즈니스 서비스를 제공하고 운영하는 입장에서는 매우 부담스러울 수 밖에 없습니다. 하지만, 기업의 이런 부담을 덜어 주고, 컨테이너 환경 배포 및 트러블슈팅과 같은 기술 지원을 받을 수 있도록 제공하는 기업용 오픈소스 플랫폼이 바로 레드햇 오픈쉬프트입니다.  

컨테이너 이야기

컨테이너는 컨테이너 이미지에 의해 실행이 됩니다. 컨테이너 이미지는 Dockerfile이라는 컨테이너 명세서에 의해 빌드된 후 컨테이너 레지스트리에 업로드가 됩니다. 그리고, 우리는 컨테이너를 실행할 때 컨테이너 레지스트리에 있는 컨테이너 이미지를 다운로드 받아 해당 이미지를 이용하여 컨테이너를 실행합니다. 그런데, 이렇게 실행된 컨테이너는 수정을 할 수 없다는 특징이 있습니다.

이에 대한 예로 필자는 일전에 컨테이너 내의 환경설정을 수정하기 위해 컨테이너 내부에 접속하여 환경설정을 변경한 후 해당 설정을 적용하기 위해 컨테이너를 재시작했는데, 컨테이너에 적용했던 환경설정이 모두 원상복구가 되는 경험을 한적이 있습니다. 그때 운영체제에 패스워드 정책 및 접근권한 정책을 변경하기 위해, sshd 설정 파일과 authorization에 대한 설정을 변경하고 컨테이너가 재실행되었을때도 수정한 환경이 유지되는지 확인하기 위해 컨테이너를 재시작했는데, 수정한 환경설정들이 모두 초기화가 되었습니다. 이처럼 컨테이너 이미지는 베이스가 되는 운영체제 이미지에 필요로 하는 apache와 같은 어플리케이션을 추가 설치하여 아래 그림처럼 레이어 형태로 컨테이너 이미지를 만듭니다.

이렇게 만들어진 이미지가 컨테이너로 실행이 되면 더 이상 수정을 할 수 없게 됩니다. 수정 사항이 생기면 다시 컨테이너 이미지를 생성하고, 다시 컨테이너로 재배포를 해야 합니다. 이때, 이런 컨테이너 서비스를 좀 더 유연하게 관리하기 위해 오픈쉬프트에서는 컨테이너의 환경을 초기화하고, 실행중인 컨테이너에 필요한 작업 등을 도와주는 컨테이너를 함께 사용할 수 있도록 지원해 주는데, 이런 동일 환경을 사용하고 동일 라이프사이클을 갖는 컨테이너를 그룹핑하여 포드라는 작은 관리 요소를 제공합니다.  

포드(Pod) 이야기

포드(Pod)는 오픈쉬프트에서 제공하는 가장 작은 논리 단위로 컨테이너 그룹의 스케줄링과 배포, 격리된 런타임에 대한 최소 단위로, 포드 안의 모든 컨테이너는 항상 같은 호스트에 스케줄링되고, 호스트 이전이나 스케일을 목적으로 함께 배포되며, 파일시스템, 네트워킹, 프로세스 네임스페이스를 공유합니다. 

컨테이너는 한번 실행이 되면 환경을 수정할 수 없기 때문에 애플리케이션에서 수행해야할 환경 설정을 초기화 하는 컨테이너와 실제 애플리케이션을 실행되는 컨테이너, 실행중 로그 파일들을 작성하는 컨테이너를 하나의 포드로 구성할 수 있습니다. 그렇기 때문에 포드에는 포드 내의 컨테이너들이 함께 사용할 볼륨, 어플리케이션, 네트워크 IP와 Port, 컨테이너를 실행하는 방법들을 가지고 있습니다. 그리고, 이런 포드들은 Docker나 Podman과 같은 컨테이너 엔진이 실행되고 있는 워커 노드에 배포가 되고, 실행이 됩니다. 그리고, 이런 워커 노드에서 실행중인 포드들의 무중단 서비스를 위해 HA 서비스를 제공하는데, 이를 클러스터라고 합니다. 따라서, 오픈쉬프트에서 실행되는 모든 포드들은 클러스터 내에서 실행이 되고, 실행중인 포드에 문제가 발생을 하면 즉각 다른 워커노드에 포드를 실행함으로서 무중단 서비스를 할 수 있도록 지원합니다. 그리고, 워커 노드들은 다시 마스터 노드에 의해 관리가 되어 집니다. 

 

이번 포스팅에서는 어떻게 해서 컨테이너 기술이 나오기 시작했고, 사용되지 시작했는지를 알아보고, 컨테이너의 특성 및 오픈쉬프트의 가장 작은 논리 단위인 포드에 대해 알아보았습니다. 다음 포스팅에서는 포드 이야기에 이어 클러스터에 대한 이야기를 계속해서 이어나가 보도록 하겠습니다.

 

::: 참고자료 :::

쿠버네티스란 무엇인가?

https://kubernetes.io/ko/docs/concepts/overview/what-is-kubernetes/

쿠버네티스 포드

https://kubernetes.io/docs/tutorials/kubernetes-basics/explore/explore-intro/