Kubernetes As an Alternative to Docker

container
Docker의 대안으로 K8s를 써보자!
Author

JS HUHH

Published

April 26, 2022

Note
  • 이 포스팅은
    • 쿠버네티스에 관한 일반적인 해설, 설정 소개 등이 아닙니다.
    • 개발환경 일반을 다루지 않습니다.
  • 이 포스팅은
    • 도커-컴포즈 대신 Rancher Desktop을 활용해 쿠버네티스를 컨테이터 관리 툴로 사용한 경험을 소개합니다.
    • 데이터 관련 프로그램만 제한적으로 다룰 예정입니다.

Alternatives

도커의 대안을 좀 검토해보기로 하겠다.

Why

도커가 여러 문제점이 있지만 개인 툴로써 쓰기에는 큰 불편함이 없다. 하지만 도커 데스크탑 앱이 유료화된 후로 왠지 쓰기에 찜찜해진 것이 사실이다. 유료화 그리고 오픈소스 기반 쿠버네티스 진영의 컨테이너 기본 툴 변경 등을 무시하기도 힘들다. 컨테이너 도구로서 도커를 버린다고 해도, 버리기 힘든 도구가 도커-콤포즈다. 부팅이 잦은 데스크 탑에서 필요한 툴을 불러와서 각종 설정을 매번 도커로 해줄 수는 없다. 이떄 도커-콤포즈로 설정을 맞춰두고 한방에 필요한 모든 것을 띄우면 편리하다. 도커-콤포즈를 꼭 도커와 써야하는 것은 아니다. 앞서 소개한 내용처럼 podman과 함께 쓸 수도 있다. 그래도 궁금했다. 도커-콤포즈 없이 컨테이너를 관리할 수는 없을까?

Across Os

다른 문제 하나는 운영 체제간 호환성이다. 윈도에서 WSL를 통해 리눅스를 쓰게 되면서 운영 체제를 가리지 않는 개발 도구(분석 도구) 운영이 가능해졌다. 다만 여기에도 문제는 있다. WSL은 서비스 매니저로 systemd를 쓰지 않기 때문에 systemd에 의존하는 도커-콤포즈를 쓰기 위해서는 별도의 설정이 필요하다. 이런 종류의 번거로움 없이 윈도우, mac os, 리눅스를 두루 걸쳐서 쓸 수 없을까?

nerdctl

우선 도커를 대체하기 위해서는 도커의 컨테이너 엔진 자체의 대안을 찾아야 한다. 다행스럽게 Cotainerd 표준 기반의 nerdctl이라는 녀석이 있다. 이 서비스는 도커의 명령어와 거의 완벽하게 호환되면서도 도커-컴포즈의 기능까지 구현한다. 여기에서 확인하듯이 도커 및 도커-콤포즈의 거의 모든 명령어가 호환되며 모든 OS를 가리지 않고 쓸 수 있다.

nerdctl로 거의 모든 것이 해결될 것 같았으나 아쉽게도 그렇지는 않다. 도커 이미지를 쌓아둔 저장소(도커 레지스트리) 도커 허브에 있는 이미지 중 일부는 nerdctl과 제대로 작동하지 않는 녀석들이 있다. 원래 이미지 자체가 도커에 특화된 것이 아닐까 추측해보지만, 이런 내용을 다 따져가며 사용하는 것도 까다로운 일이다. 그래도 도커의 거의 모든 기능을 nerdctl로 대체할 수 있다는 점에서 nerdctl은 유용한 도구이다.

Kuberntes

다음으로 컨테이너 오케스트레이션 도구인 쿠버네티스에 눈을 돌렸다. 사실 쿠버네티스를 이 용도로 쓰는 것은 닭 잡는데 소 잡는 칼을 쓰는 격이다. 쿠버네티스를 배운다는 개인적인 동기 부여를 제외한다면, 이 번거로운 것을 꼭 써야 하나? 윈도에서는 설치도 간단치 않았다.

그때 Rancher Desktop을 알게 되었다. 리눅스 배포판을 만드는 회사인 SUSE에서 내 놓은 경량화된 쿠버네티스(K3s) 앱인데, 이 녀석이 아주 쓸만 했다. 원래는 nerdctl을 좀 편하게 써볼까 하는 용도로 설치했는데 사용성이 좋았다.

Rancher Desktop을 설치하면 플랫폼에 관계 없이 nerdctl이 설치된다.

  • 사용자 경험이 Docker Desktop과 비슷하다. 사용자는 OS별로 설치하면 OS별 커맨드라인 툴에 명령어들을 잘 사용할 수 있다. Windows(파워셀), WSL2, M1 기반의 macos에서 거의 동일한 경험을 제공한다.

  • 경량화된 쿠버네티스가 들어 있어서 minikube를 별도로 설치하지 않고 데스크탑에서 쉽게 쿠버네티스를 활용할 수 있다. 부팅 후에도 원래 올려 놓은 쿠버네티스 설정을 유지하고 있어서 개인용 PC에서 쓰기에도 적합하다.

  • 간력하지만 필요한 GUI를 갖추고 있다.

Using Kubernetes

Installation

우선 Rancher Desktop을 깔자.

  • Windows라면 WSL과 같이 써야 하고 도커 데스크탑처럼 손쉬운 연동이 가능하다. 동작 방식은 Docker Desktop과 비슷하다. Rancher가 자신을 위한 VM을 띄우고 Windows 혹은 WSL이 이와 연동된다.
  • Macos 역시 비슷하게 작동하는데, M1 기반 머신에서도 잘 돌아간다. 내부에서 qemu 기반의 lima를 활용한다고 한다.

랜처 데스크탑을 깔면 윈도우의 경우 파워셸이나 터미널에서 그리고 macos의 경우 터미널에서 kubectl을 쓸 수 있다. 쿠버네티스의 경량 버전인 k3s가 설정되어 있으므로 기본적인 세팅은 완료된 상태다.

Image build

이미지를 빌드해보자. 도커-컴포즈가 좋은 이유는 도커 허브의 이미지를 끌어다가 필요에 맞춰 세팅을 한 후 이를 도커에 올려 사용할 수 있는 데 있다. 컨테이너를 빌드하는 단계와 컨테이너를 쿠버네티스에 올리는 단계로 나눠보자.

이미지 빌드는 여러가지 방식으로 해도 된다. nerdctl를 통해 docker와 동일한 방식으로 빌드한 후 도커 리포지토리(도커 허브)로 올려서 쓰면 된다. 조금 더 쿠버네티스 친화적인 방식, 즉 nerdctl을 활용하지 않는 방식으로 이미지를 빌드할 수도 있다. Kaniko는 도커의 의존성 제거를 위해서 구글이 오픈소스로 내놓은 프로젝트다. 카니코는 쿠버네티스 컨테이너로 카니코 서비스를 끌어온 후 이 녀석이 컨테이너 내부에서 containerd 기반으로 이미지를 빌드한 후에 도커 레지스트리로 보내는 것까지 모두 알아서 한다. 쿠버네티스 안에서 작업할 수 밖에 없을 때 유용한 녀석이다. 다만 설정이 다소 복잡하다. 자세한 것은 여기를 참고하기 바란다.

개인적으로 활용한 용례는 여기에 정리해두었다. 참고하시라.

K8s에 서비스를 올려보자.

이제 필요한 이미지를 빌드해서 도커 리포지토리(도커 허브)에 올렸다고 가정하자. 이 녀석을 쿠버네티스로 당겨오면 된다. 정확하지는 않지만 개인 사용자 수준에서 쉽게 말하면, docker-compose를 대체하는 것이 쿠버네티스라고 생각하면 되겠다. 다만 k8s이 원래 개인 용도로 개발된 녀석이 아니라서 다소 복잡하다.

  1. 먼저 pod를 띄운다.
  2. service를 개시한다.

도커-콤포즈에서 파일 하나에 있던 내용을 k8s에서는 다수의 yaml로 분리할 수 있다. 먼저 pod를 띄우는 yaml을 올려야 한다. 그리고 이 pod와 접속할 수 있는 네트워크 정보 등을 담고 있는 service 관련 yaml을 실행한다. 1의 pod 관련 사항을 변경했더라더 2는 그대로 두면 된다. 반대도 마찬가지다.

개인적인 용례는 여기를 참고하라. 본격적인 사용이라기보다는 내가 쓰는 데이터사이언스 툴을 띄우는 소박한 정도다.

공식 가이드가 잘 되어 있으니 이쪽을 참고하면 되겠다.