클러스터

GPU 쿠버네티스 클러스터 on legacy infra (금융, 전금법 도메인)

쿠버네티스는 이제 IT 인프라에서는 많이 적용되고 관심도도 많은 도구이다. 자원을 효율적으로 사용할 수도 있고 장애 발생시 대처도 비교적 쉬워진다. 하지만 많은 곳에서는 여전히 기존 방식의 인프라를 활용하고 있는데, 대부분의 금융권 기업들이 그렇다. 기존 방식의 인프라에서는 서버 한대에 어플리케이션이 직접 띄워지는 방식으로 돌아간다. 그래서 서버에서 돌아갈 어플리케이션이 어느정도의 cpu, ram, storage를 사용할지 예상해야 서버 스펙을 산정하고 구매에 들어간다. 이 과정에서 기능이 변경/추가되거나 예상치 못한 스토리지 사용이 있다면 스펙을 다시 산정하고 적용에 들어가야 한다. 물론 배포, 백업 과정도 번거롭다. 개발자나 인프라를 관리하는 입장에서는 부가적인 일이 상당히 많아지는 것이다.

그래서 최근 legacy한 인프라를 운영중인 곳에서도 쿠버네티스를 도입하기 시작하고 있다. 나도 실험적으로 금융권 기업에 쿠버네티스 클러스터를 구성하면서 이들이 쿠버네티스를 준비하고 있는 것들을 좀 보았다. 나는 기존의 인프라 운영방식 위에 gpu 클러스터를 구성한 것이라 꽤 많은 애로사항이 있었고 그 과정을 여기에 정리하려 한다.

패키지

클러스터가 구성되기 위해서는 클러스터를 구성하는 기본적인 패키지들이 설치되어야 한다. 대부분의 금융권에서는 레드햇 계열의 OS를 사용하는데 대부분 os 패키지를 설치되어있는 버전 그대로 사용한다. (OS 패키지조차 업그레이드 할 수 있는 환경이 아닌 곳이 많다.) 여기서 초반에 많은 삽질을 하게 된다. 

레드햇에서 제공하는 podman을 쓴다면 crio, containerd 와 같은 cri 구현체를 따로 설치해야하고 podman 삭제 후 docker를 설치해도 된다. 여기서 주의해야할 부분은 cri 구현체는 대부분 runc를 사용하는데 runc 버전과 cri 구현체의 호환성이 맞아야하고 그러면 또 커널버전까지 맞춰야할 수도 있다는 점. 그리고 podman과 docker는 한 서버에 공존할 수 없다는 것이다. 이 패키지 버전을 맞추는 과정에서 수많은 하위 패키지들이 필요하고 디펜던시 맞추는 것이 고생스럽다. 이게 모두 yum install 이 안되기 때문에 벌어진다.

gpu 드라이버

gpu 클러스터를 사용하기 위해 gpu 드라이버를 설치하는데 온라인에선 쉽지만 오프라인에선 몇번의 삽질이 필요하다. OS 개발용 패키지들이 필요하고 gpu에 맞는 드라이버 버전을 선별해야 한다.

네트워크

나에겐 가장 어려웠던 부분이다. HA를 위해 L4를 세팅하고 kubeadm 에 설정해서 클러스터를 구성한다. 문제는 cni인데 cni 설정은 인프라 네트워크 환경에 많이 달려있다. 다른 서비스와 충돌하지 않는 ip 대역 설정이 있고 OS 에 따른 iptable 문제가 있다. (rhel8부터는 iptables을 사용하지 않고 nfttables라는 것을 사용한다.) 그리고 네트워크 인프라에서 ip-in-ip 프로토콜을 지원하지 않는다면 cni의 세팅도 역시 바뀌어야 한다. 이 부분이 특히 해결하는데 어려웠다. 네트워크 인프라 쪽에서는 쿠버네티스에 대해 모르다보니 도움 받을 수 있는 건 없었고 블랙박스 환경에서 문제가 뭔지 찾아야 했다.

레지스트리

오프라인 환경에서 가장 큰 문제는 컨테이너 이미지를 받을 수 없다는 것이다. 내가 구성했던 클러스터들에서는 usb로 컨테이너 이미지를 다 옮기고 이미지를 로드해서 쿠버네티스 구성과 서비스를 띄운다. 이런 사용방식에서 과연 쿠버네티스가 맞는 솔루션인지는 모르겠지만 말이다. 노드에 이미지가 로드되어 있지 않다면 애초에 그냥 파드를 띄울 수가 없다.

레지스트리의 필요성은 이것말고도 더 있다. 쿠버네티스를 관리하는 kubelet은 노드에 대해서 많은 역할을 하고 있는데 스토리지를 비우는 것도 한다. 만약 노드에 스토리지가 특정 퍼센트 이상 사용되면 kubelet은 바로 지워도 되는 것들을 삭제한다. 그 중 가장 첫번째는 사용하지 않는 컨테이너 이미지다. 일반적으로 컨테이너 이미지는 다시 당겨오면 되기 때문에 사용되지 않고 있다면 삭제해도 아무런 문제가 되지 않는다. 하지만 이 레거시 인프라에서는 다시 당겨올 수 있는 레지스트리가 없다. 이미지가 한번 삭제되면 다시 usb로 이미지를 옮겨서 직접 로드해야 한다. 그래서 서비스 운영시에 kubelet이 노드 스토리지를 확보하기 위해 이미지를 삭제하면 상당히 큰 장애가 발생하는 것이다.

마무리

그래서 레거시 인프라에서 클러스터를 구성하기 위해 필요한 것을 정리해보면 아래 것들이다.

  1. 호환성이 맞는 os, cri,  driver 패키지 리스트

  2. 드라이버 설치를 위해 필요한 패키지, 드라이버 설치 파일

  3. OS 버전과 네트워크 환경 체크

  4. 레지스트리 서비스 확보

물론 이것들을 확보했다고 해서 레거시 인프라에서 클러스터를 원활하게 운영할 수 있는 것은 아니다. 단지 최소한의 세팅이 된 것이다. 나머지는 클러스터를 더 운영해보고 서비스를 올려보며 경험해보고 추가할 예정이다.