1. 개요
쿠버네티스 클러스터를 폐쇄망(오프라인) 환경에 설치하려면 사전에 필요한 파일을 모두 준비해야 했다. 온라인이면 필요할 때마다 다운로드하면 되지만, 오프라인에서는 그게 안 됐다. 설치에 필요한 구성 요소를 빠짐없이 수집하고 패키징하는 작업이 먼저 선행되어야 했다.
필요한 파일은 크게 세 종류였다.
- Kubespray 관련 파일: Ansible 플레이북 실행에 필요한 바이너리
- 컨테이너 이미지: Kubernetes 컴포넌트, CNI, CSI 등 모든 컨테이너 이미지
- 리눅스 패키지: 각 노드에 설치해야 할
rocky9및ubuntu24.04용 시스템 패키지
2. 자동화 도구 탐색 및 결정
이 파일들을 수동으로 하나씩 준비하기에는 손이 너무 많이 가고 실수도 잦을 것 같았다. 자동화 방안을 찾던 중, kubespray-offline이라는 오픈소스를 발견했다.
이 도구는 오프라인 설치에 필요한 대부분의 작업을 자동화해주어 매우 유용해 보였다. 프로젝트 일정이 촉박했기 때문에, 당장은 이 도구를 최대한 활용하고 추후에 직접 Ansible 플레이북으로 내재화하기로 결정했다.
하지만 기존 스크립트를 그대로 사용하기에는 몇 가지 수정이 필요했다.
- 컨테이너 이미지 추가: 사용하려는 CNI, CSI 및 기타 애드온 이미지가 기본 목록에 포함되어 있지 않았다.
- 패키지 목록 추가: NVIDIA 드라이버나 CUDA와 같이 GPU 노드에 필요한 패키지들이 누락되어 있었다.
- 버전 변수화: 특정 쿠버네티스 버전을 쉽게 지정할 수 있도록 변수 처리가 필요했다.
3. 파일 수집 절차
위의 요구사항을 반영하여 스크립트를 수정한 뒤, 다음과 같은 절차로 오프라인 설치 파일을 수집했다.
먼저, 패키지 다운로드 스크립트가 내부적으로 Docker 컨테이너를 사용했기 때문에 Docker를 설치해야 했다.
NOTE
스크립트가 패키지 다운로드에는
docker를 사용하고, 나중에 오프라인 레지스트리 서버를 실행할 때는containerd를 사용하는 등 일부 동작 방식에 의문이 들었지만, 일단은 기존 구조를 존중하며 작업을 진행했다.
파일 수집을 위한 전체 명령어 흐름은 다음과 같다.
# 1. 컨테이너 런타임 설치 (Ubuntu 패키지 수집에 필요)
./install-containerd.sh
# 2. 현재 계정에 도커 그룹 추가 (이후 쉘 재접속 필요)
sudo usermod -aG docker {계정명}
# 3. 바이너리, 컨테이너 이미지, Rocky9 패키지 다운로드
./download-all.sh
# 4. Ubuntu 24.04용 도커 이미지 빌드
cd docker
./build-image.sh ubuntu-24.04
# 5. Ubuntu 24.04 패키지 다운로드 (기존 스크립트에 없어 추가)
./prepare-pkgs.sh위 과정을 모두 마치면 outputs 폴더에 오프라인 설치에 필요한 모든 파일이 수집된다.
수집된 파일들로 오프라인 환경에 레지스트리, 패키지 리포지토리, 파일 서버를 구성하려면 다음 스크립트를 실행하면 된다.
# outputs 폴더에 생성된 설치 스크립트 실행
./outputs/setup-all.sh
# nerdctl로 컨테이너 실행 상태 확인
sudo /usr/local/bin/nerdctl ps실행 결과, Nginx는 80 포트, Docker 레지스트리는 35000 포트로 정상적으로 서비스되는 것을 확인했다.
4. 추가 확인 및 남은 과제
모든 준비가 끝났다고 생각했지만, Kubespray의 역할을 다시 살펴보니 몇 가지 구성 요소가 누락된 것을 발견했다.
metrics-server바이너리가 포함되어 있지 않았다.gateway-api관련 애드온 설치 부분이 빠져 있었다.
이 부분들은 추후 Kubespray 플레이북을 직접 수정하여 보완해야 할 과제로 남았다.