docker hub의 kubernetis에 사용할 GPU 설치
https://chatgpt.com/c/6889c210-fd98-800b-87c5-895bfef9d342 이것으로 해볼래
결론 두가지 방법 모두 GPU 인식에는 실패
docker.desktop에서는 아래 부분이 모두 실패해서 작업 방식을 변경하기 했다. wsl 의 Ubu\tu에서 쿠버네티스를 설치하는 방법으로
-
Ubuntu install wsl --install -d Ubuntu
-
WSL systemd 활성화 준비
%USERPROFILE%.wslconfig 파일 생성 또는 수정
[boot]
systemd=true
WSL 재시작
wsl --shutdown
Ubuntu WSL2 접속 후 ''' wsl # wsl -d Ubuntu ''' Docker 설치 및 서비스 시작
NVIDIA Container Toolkit 설치
Kubernetes 설치 (kind 또는 minikube)
Step 1. WSL Ubuntu에서 Docker 설치 및 서비스 수동 실행 1-1. Docker 저장소 등록 및 설치
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
<!-- echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list -->
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
1-2. Docker 서비스 직접 실행 (systemd 없이) WSL2에서는 systemd가 없으므로, Docker 데몬을 직접 실행해야 합니다.
docker 데몬 수동 시작
아래 3개다 백그라운드 실행
sudo dockerd & # &를 붙여 백그라운드 실행
nohup sudo dockerd > /tmp/dockerd.log 2>&1 & # nobub 사용시
tmux 사용법
이 터미널은 닫지 말고 별도 터미널을 하나 더 열어 Docker 명령어를 사용하세요.
1-3. Docker 동작 확인
docker version
docker run hello-world
Step 2. NVIDIA Container Toolkit 설치 및 GPU 사용
2-1. NVIDIA Docker 저장소 등록 및 설치
# distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
#curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | sed 's#deb https://#deb [signed-by=/etc/apt/keyrings/nvidia-container-toolkit.gpg] https://#' | sudo tee /etc/apt/#sources.list.d/nvidia-container-toolkit.list
# distribution=$(. /etc/os-release; echo $ID$VERSION_ID) # Ubuntu 24는 지원하지 않으므로
distribution="ubuntu22.04"
curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | sed 's#deb https://#deb [signed-by=/etc/apt/keyrings/nvidia-container-toolkit.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /etc/apt/keyrings/nvidia-container-toolkit.gpg
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
2-2. Docker NVIDIA 런타임 수동 설정
sudo nvidia-ctk runtime configure --runtime=docker
2-3. Docker 재시작 (dockerd 다시 실행)
sudo pkill dockerd
sudo dockerd &
2-4. GPU 컨테이너 테스트
docker run --rm --gpus all nvidia/cuda:12.2.0-base nvidia-smi
GPU 정보가 정상 출력되면 성공입니다.
Step 3. Kubernetes 클러스터 구축(k8s) // (kind도 추천)
- 클러스터 설치 선택지
-
kubeadm 으로 직접 클러스터 구성 (직접 설치, 가장 기본적이며 유연)
-
k3s: Rancher에서 만든 경량 쿠버네티스 (설치 쉽고 자원 적게 사용, GPU 지원 가능)
-
MicroK8s: Canonical 제공하는 경량 쿠버네티스 (간편 설치, GPU 지원도 가능)
k3s 설치 (WSL Ubuntu)
curl -sfL https://get.k3s.io | sh -
클러스터 상태 확인
sudo k3s kubectl get nodes
NVIDIA GPU 지원 추가
- NVIDIA Device Plugin 배포:
sudo k3s kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.13.0/nvidia-device-plugin.yml
아래 명령을 통해 드라이버와 GPU가 정상 인식되는지 먼저 확인하세요.
nvidia-smi
docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi
GPU 리소스 확인
sudo k3s kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"
Step 4. Kubernetes에서 GPU 활용 설정 kind는 기본적으로 GPU를 지원하지 않으므로,
GPU가 필요한 경우 minikube를 대안으로 추천하거나,
GPU 지원이 되는 클러스터 구축 방법(예: k3s + nvidia device plugin) 을 추가 안내해 드릴 수 있습니다.
1. wsl 설치
window 환경하의 docker.desktopo을 운영한다면 이 부분이 매우 중요하다.
wsl --update
wsl -l -v # 현재 상태 확인 (docker-desktop 앞에 *가 있어야 함)
wsl --set-default docker-desktop # 만약 다르다면 아래 명령어로 설정
wsl --install -d Ubuntu ## nvidia-smi는 Ubuntu로 처리해야 문제가 없음
wsl -d Ubuntu nvidia-smi # nvidia-smi는 Ubuntu로 사용
// ubuntu 는 버전 확인하고 24일경우 22 로 다운그래이드
// wsl -d Ubuntu
// $ lsb_release -a
// wsl --unregister Ubuntu
wsl --install -d Ubuntu-22.04
wsl -d Ubuntu
sudo nvidia-ctk runtime configure --runtime=docker
## 만약 sudo: nvidia-ctk: command not found 에러가 뜨면
기존의 잘못된 설정 파일 삭제
sudo rm /etc/apt/sources.list.d/nvidia-container-toolkit.list
패키지 목록 업데이트
sudo apt-get update
NVIDIA Container Toolkit 설치
sudo apt-get install -y ca-certificates curl gnupg sudo apt-get install -y nvidia-container-toolkit
3. 배포 버전에 맞는 repository 설정
distribution=$(. /etc/os-release; echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | sed 's#deb https://#deb [signed-by=/etc/apt/keyrings/nvidia-container-toolkit.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
GPG 키 가져오기 및 등록
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /etc/apt/keyrings/nvidia-container-toolkit.gpg
4. 패키지 목록 갱신
sudo apt-get update
5. nvidia-container-toolkit 설치
sudo apt-get install -y nvidia-container-toolkit
6. Docker에 NVIDIA 런타임 적용
sudo nvidia-ctk runtime configure --runtime=docker
7. Docker 재시작
sudo systemctl restart docker
## Docker가 Ubuntu의 GPU를 사용하도록 설정
## 이것이 가장 중요한 부분입니다. Docker Desktop이 컨테이너를 실행할 때 `Ubuntu`에 설치된 GPU 드라이버를 가져다 쓰도록 설정해야 합니다.
1. **Docker Desktop 설정(Settings) > Resources > WSL Integration**으로 이동합니다.
2. **"Enable integration with additional distros"** 목록에서 **`Ubuntu`가 반드시 켜져(On) 있어야 합니다.**
3. 설정이 바뀌었다면 **"Apply & Restart"**를 누릅니다. (이미 켜져 있다면 아무것도 할 필요 없습니다.)
GPU를 사용하는 컨테이너 실행하기
이제 모든 준비가 끝났습니다. Kubernetes는 docker-desktop 덕분에 안정적으로 시작되고, Docker는 Ubuntu의 GPU를 사용할 준비가 되었습니다.
Ubuntu 터미널을 열고 (PowerShell이 아닙니다!) 아래 테스트 명령어를 실행하여 GPU가 컨테이너에 잘 할당되는지 확인합니다.
docker run --rm --gpus all nvidia/cuda:12.1.1-base-ubuntu22.04 nvidia-smi
2. nvidia 에서 드라이버 설치
2.1 NVIDIA 드라이버 다운로드:
NVIDIA 공식 홈페이지(https://www.nvidia.co.kr/Download/index.aspx)로 이동합니다.
사용하시는 GPU 모델(GeForce GTX 1660 Ti)을 선택하고, 최신 버전의 Game Ready 드라이버 또는 Studio 드라이버를 검색하여 다운로드합니다.
NVIDIA 드라이버 설치:
다운로드한 설치 파일을 실행합니다.
설치 옵션에서 '사용자 정의(고급)' 설치를 선택합니다.
다음 단계에서 "전체 설치 수행" 또는 "모든 NVIDIA 구성 요소 설치" 와 유사한 옵션의 체크박스를 반드시 선택합니다. 이렇게 해야 WSL에 필요한 구성 요소까지 모두 설치됩니다.
설치를 진행합니다.
컴퓨터 재부팅 (필수):
드라이버 설치가 완료되면, 반드시 컴퓨터를 재부팅합니다.
최종 확인:
재부팅 후, PowerShell 또는 명령 프롬프트를 엽니다.
다시 한번 아래 명령어를 실행합니다.
wsl nvidia-smi ## 실제 GPU 관련 데이타가 리스트 되면 OK
nvidia-smi
wsl
DESKTOP-DP0AU40:/mnt/host/c/Users/Pondol#
DESKTOP-DP0AU40:/mnt/host/c/Users/Pondol# ls /usr/lib/wsl/lib/nvidia-smi
/usr/lib/wsl/lib/nvidia-smi
DESKTOP-DP0AU40:/mnt/host/c/Users/Pondol#
echo 'export PATH=$PATH:/usr/lib/wsl/lib' >> ~/.bashrc
source ~/.bashrc
최종방법 wsl --install -d Ubuntu wsl --list --verbose wsl --set-default Ubuntu
wsl --shutdown // 참조
nvidia-device-plugin
1.1. 공식 YAML 파일로 설치
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.1/nvidia-device-plugin.yml
1.2. 설치 확인
kubectl get pods -n kube-system
nvidia-device-plugin-daemonset-dc5hg 1/1 Running 0 51s # 이런것이 나오면 정상
docker.desktop 기어 > docker Engine
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
- NVIDIA RuntimeClass 생성 (가장 먼저!)
가장 먼저 Kubernetes 클러스터에 NVIDIA 컨테이너 런타임을 사용하도록 알려주는 RuntimeClass를 생성해야 합니다. 이 RuntimeClass는 GPU가 필요한 파드(Pod)가 어떤 런타임을 사용해야 하는지 지정하는 역할을 합니다.
1-nvidia-runtime-class.yaml
kubectl apply -f 1-nvidia-runtime-class.yaml
정상확인
kubectl get runtimeclass nvidia
- NVIDIA Kubernetes 디바이스 플러그인 배포
kubectl apply -f 2-nvidia-device-plugin.yaml
디바이스 플러그인 파드가 kube-system 네임스페이스에서 정상적으로 실행되고 있는지 확인합니다.
kubectl get pods -n kube-system -l name=nvidia-device-plugin-ds
2-
- ollama-deployment.yaml
kubectl apply -f D:\docker\sample\11_ollama\1-nvidia-runtime-class.yaml
kubectl apply -f D:\docker\sample\11_ollama\nvidia-device-plugin-FIXED.yaml
kubectl get pods -A -w
kubectl describe node docker-desktop | findstr "nvidia.com/gpu"
docker 에 디바이스 넣기
kubectl edit daemonset nvidia-device-plugin-daemonset -n kube-system
runtimeClassName: nvidia <!-- 추가
tolerations:
- effect: NoSchedule
key: nvidia.com/gpu
operator: Exists
RuntimeClass 생성 및 적용 Pod 설정 수정 (kubectl edit) Docker Engine 설정 (daemon.json) 수정 및 재시작 Kubernetes 클러스터 리셋 (Reset Kubernetes Cluster)