13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] LLM 클라우드

  • [Cloud] ArgoCD로 Kubernetes에 Ollama 배포: 6개월 운영 후기 및 최적화 전략

    [Cloud] ArgoCD로 Kubernetes에 Ollama 배포: 6개월 운영 후기 및 최적화 전략

    목차

    [Cloud] ArgoCD로 Kubernetes에 Ollama 배포: 6개월 운영 후기 및 최적화 전략

    ArgoCD Ollama 배포를 처음 붙일 때만 해도, 솔직히 저는 “로컬에서 잘 돌던 걸 굳이 Kubernetes(쿠버네티스, 컨테이너 오케스트레이션 플랫폼)까지 올려야 하나?” 싶었습니다. 그런데 팀이나 홈랩에서 여러 워크로드를 같이 운영하다 보면 얘기가 달라지더라고요. 모델 파일은 크고, 노드는 자꾸 바뀌고, 누가 어떤 설정을 바꿨는지 추적도 필요합니다. 결국 ArgoCD(아르고CD, GitOps 배포 도구)와 Ollama(올라마, 로컬/서버 환경에서 LLM을 실행하는 런타임) 조합으로 정리해 두니 운영 피로도가 확 줄었더라고요.

    이번 글은 제가 홈랩과 테스트 클러스터에서 6개월 정도 굴려보면서 정리한 ArgoCD Ollama 배포 운영 후기입니다. 단순 설치 가이드가 아니라, 어디서 삽질했는지, 어떤 최적화가 체감이 컸는지, 그리고 Kubernetes GitOps 관점에서 무엇을 꼭 잡아야 하는지 중심으로 풀어보겠습니다. 비슷하게 LLM 클라우드나 사내 추론 환경을 작게 시작해 보려는 분들께 꽤 현실적인 기준점이 될 겁니다.

    ArgoCD가 Git 저장소의 선언형 설정을 읽어 Kubernetes 클러스터에 Ollama를 배포하고, 내부 서비스와 스토리지를 연결하는 전체 구조 예시입니다.

    왜 ArgoCD Ollama 배포가 생각보다 중요했는지

    쉽게 말해, Ollama 하나만 띄우는 건 어렵지 않습니다. 문제는 운영이거든요. 처음엔 Docker 하나로 시작했었습니다. 그때는 편했습니다. 근데 모델을 추가하고, 스토리지를 옮기고, 노드를 교체하고, Ingress(인그레스, 외부 트래픽 진입점) 뒤에 붙이고, 다시 재현하려고 하니 슬슬 꼬이기 시작했습니다.

    제가 직접 해보니 진짜 차이는 설치가 아니라 재현성(reproducibility, 같은 상태를 다시 만드는 능력)에서 나왔습니다. Git에 원하는 상태를 남기고, ArgoCD가 그 상태를 계속 맞춰 주니까 “어제는 됐는데 오늘은 왜 안 되지” 같은 상황이 확 줄더라고요. 특히 LLM 워크로드는 모델 파일과 디스크 사용량이 크기 때문에, 사람 손으로 운영하면 금방 흔들립니다.

    • 변경 이력 추적: 누가 리소스 제한을 바꿨는지 Git commit으로 남습니다.
    • 복구 속도: 노드가 바뀌어도 선언형 매니페스트로 다시 맞추기 쉽습니다.
    • 운영 표준화: dev, lab, prod 비슷한 구조로 가져가기 좋습니다.
    • 드리프트 방지: kubectl로 급하게 만진 설정이 오래 남지 않습니다.

    핵심 개념 정리: Kubernetes GitOps와 Ollama를 같이 볼 때

    여기서 중요한 포인트가 있습니다. Ollama는 애플리케이션이고, ArgoCD는 상태 관리자입니다. 이 둘의 역할을 섞어서 생각하면 금방 헷갈립니다. 저도 처음엔 ArgoCD가 모델까지 알아서 관리해 주는 느낌으로 생각했었는데, 실제로는 그렇지 않더라고요.

    1. ArgoCD는 원하는 상태를 맞추는 도구입니다

    Git 저장소에 있는 YAML이 기준입니다. Deployment(디플로이먼트, 파드 배포 정의), Service(서비스, 네트워크 노출), PersistentVolumeClaim(PVC, 영구 스토리지 요청) 같은 리소스를 계속 감시하고 맞춰 줍니다.

    2. Ollama는 모델 실행 환경입니다

    모델 파일을 저장하고, 요청을 받아 추론을 수행합니다. 그래서 CPU/GPU보다도 처음엔 디스크와 네트워크가 더 자주 병목이 되기도 합니다. 특히 모델을 여러 번 다시 내려받는 구조가 되면 운영이 굉장히 피곤해집니다.

    3. 모델 관리와 애플리케이션 관리를 분리해야 덜 꼬입니다

    제가 6개월 운영하면서 얻은 결론은 이겁니다. 애플리케이션 배포와 모델 프리로드(preload, 미리 받아두기)를 같은 단계로 억지로 묶지 않는 게 좋습니다. 처음엔 한 번에 끝내고 싶어서 initContainer(초기화 컨테이너) 쪽으로 몰아넣었는데, 재배포 때마다 모델 다운로드가 걸려서 시간도 오래 걸리고 실패 지점도 늘었습니다.

    구분 역할 운영 팁
    ArgoCD Git 기준 상태 동기화 자동 동기화와 self-heal은 켜되, 삭제 정책은 팀 기준에 맞춰 보수적으로
    Kubernetes 파드 실행, 스토리지, 네트워크 관리 리소스 요청값과 스토리지 클래스부터 먼저 정리
    Ollama LLM 실행과 모델 저장 모델 캐시 경로와 영구 볼륨 전략이 핵심
    GitOps 운영 변경 이력과 재현성 확보 핫픽스 후에는 반드시 Git 원복 반영

    실전 구현: 제가 쓰는 ArgoCD Ollama 배포 기본 구조

    이제 본론입니다. 아래 구조는 제가 홈랩에서 가장 무난하게 굴렸던 방식입니다. 아주 화려하진 않지만, 유지보수는 편했습니다. 처음엔 이게 뭔가 싶었는데, 결국 오래 가는 건 단순한 구조더라고요.

    디렉터리 구조

    platform/
      argocd/
        applications/
          ollama.yaml
      apps/
        ollama/
          namespace.yaml
          pvc.yaml
          deployment.yaml
          service.yaml
          kustomization.yaml

    1. Namespace와 PVC부터 고정합니다

    Ollama는 모델 파일이 남아야 의미가 있습니다. 그래서 저는 거의 항상 PVC를 먼저 잡습니다. 여기서 대충 가면 나중에 재배포할 때 모델을 다시 받느라 시간 다 씁니다.

    apiVersion: v1
    kind: Namespace
    metadata:
      name: ollama
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: ollama-data
      namespace: ollama
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 100Gi

    2. Deployment는 최대한 단순하게 갑니다

    실제로 써보니까 처음부터 옵션을 너무 많이 넣는 것보다, 먼저 떠야 합니다. 그리고 그다음에 리소스 제한과 노드 스케줄링을 붙이는 쪽이 덜 위험했습니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ollama
      namespace: ollama
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ollama
      template:
        metadata:
          labels:
            app: ollama
        spec:
          containers:
            - name: ollama
              image: ollama/ollama:latest
              ports:
                - containerPort: 11434
              volumeMounts:
                - name: ollama-data
                  mountPath: /root/.ollama
              resources:
                requests:
                  cpu: "2"
                  memory: "8Gi"
                limits:
                  cpu: "4"
                  memory: "16Gi"
          volumes:
            - name: ollama-data
              persistentVolumeClaim:
                claimName: ollama-data
    apiVersion: v1
    kind: Service
    metadata:
      name: ollama
      namespace: ollama
    spec:
      selector:
        app: ollama
      ports:
        - name: http
          port: 11434
          targetPort: 11434

    3. Kustomize와 ArgoCD Application으로 묶습니다

    apiVersion: kustomize.config.k8s.io/v1beta1
    kind: Kustomization
    namespace: ollama
    resources:
      - namespace.yaml
      - pvc.yaml
      - deployment.yaml
      - service.yaml
    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
      name: ollama
      namespace: argocd
    spec:
      project: default
      source:
        repoURL: https://git.example.com/platform.git
        targetRevision: main
        path: apps/ollama
      destination:
        server: https://kubernetes.default.svc
        namespace: ollama
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
        syncOptions:
          - CreateNamespace=true
    1. Git 저장소에 Ollama 매니페스트를 커밋합니다.
    2. ArgoCD에 Application을 등록합니다.
    3. 첫 Sync 후 파드와 PVC가 정상 생성되는지 확인합니다.
    4. 그다음 모델 다운로드 전략을 별도로 붙입니다.
    ArgoCD Ollama 배포 설정과 동기화 구성을 표현한 이미지

    ArgoCD에서 애플리케이션이 Synced 상태로 보이고, Ollama Deployment와 PVC가 함께 연결된 구성을 확인하는 장면을 설명하는 이미지 자리입니다.

    4. 초기 검증 명령어

    kubectl get pods -n ollama
    kubectl get pvc -n ollama
    kubectl get svc -n ollama
    kubectl logs -n ollama deploy/ollama

    여기까지 오면 기본 배포는 끝입니다. 드디어 됐다! 싶죠. 근데 진짜 운영은 지금부터입니다 ㅎㅎ

    6개월 운영하면서 효과 컸던 최적화 전략

    이 섹션이 사실 핵심입니다. 단순 배포보다 중요한 건 계속 안정적으로 돌리는 법이거든요. 제가 직접 해보니 아래 네 가지가 체감이 제일 컸습니다.

    스토리지와 모델 캐시를 먼저 설계합니다

    Ollama는 모델 파일 크기 특성상 스토리지 전략이 중요합니다. 저는 초반에 스토리지를 임시 볼륨처럼 다뤘다가, 노드 교체 시 모델을 다시 받느라 시간을 꽤 날렸습니다. 그 뒤로는 모델 저장 경로를 PVC에 고정하고, 이미지 재배포와 모델 캐시를 분리했습니다.

    • PVC 고정: 파드가 재생성돼도 모델 캐시는 유지
    • 노드 디스크 여유 확인: 디스크 압박은 CPU 부족보다 더 먼저 터질 때가 많음
    • 백업 기준 마련: 모델 자체보다 설정과 프롬프트 자산 백업 기준 분리

    리소스 요청값은 보수적으로 시작합니다

    처음부터 크게 잡으면 클러스터 전체 밸런스가 깨집니다. 반대로 너무 작게 잡으면 파드가 뜨더라도 응답이 흔들립니다. 저는 초반에 메모리 요청값을 낮게 잡았다가, 다른 워크로드와 겹치는 시간대에 지연이 튀는 걸 봤습니다. 이후엔 실제 사용 패턴을 보고 천천히 올렸습니다.

    모델 프리로드는 배포 단계와 분리합니다

    이거 진짜 편하더라고요. 배포는 배포대로 끝내고, 모델 다운로드는 Job(잡, 일회성 실행 리소스)이나 운영 스크립트로 분리하니까 실패 지점이 줄었습니다. 특히 ArgoCD Ollama 배포를 여러 환경에 복제할 때 차이가 컸습니다.

    kubectl exec -n ollama deploy/ollama -- ollama pull llama3
    kubectl exec -n ollama deploy/ollama -- ollama list

    모델명은 실제 사용 환경에 맞게 바꾸시면 됩니다. 중요한 건 “어디에서 다운로드를 책임질지”를 명확히 하는 겁니다.

    Ingress와 프록시 타임아웃을 반드시 확인합니다

    LLM 요청은 일반 API보다 응답 시간이 길 수 있습니다. 그래서 Ingress나 리버스 프록시 설정이 보수적이면 중간에서 연결이 끊깁니다. 저는 처음에 앱이 느린 줄 알고 한참 봤는데, 실제 원인은 앞단 타임아웃이었습니다. 이런 건 로그를 함께 봐야 보입니다.

    ⚠️ 실제로 겪었던 문제와 해결법

    이 부분은 좀 현실적으로 적어보겠습니다. 문서만 보면 다 쉬워 보이는데, 운영에선 꼭 예상 밖 포인트가 나오더라고요.

    문제 1. 파드는 떴는데 모델이 매번 다시 내려받아졌습니다

    원인: 모델 저장 경로가 영구 볼륨에 제대로 붙지 않았거나, 다른 경로를 보고 있었습니다.

    해결: 컨테이너 내부 경로와 volumeMount를 다시 확인했습니다. 그리고 재배포 후에도 같은 PVC가 붙는지 꼭 확인했습니다.

    문제 2. ArgoCD는 Synced인데 실제 동작은 불안정했습니다

    원인: Git 기준 리소스 상태와 애플리케이션 런타임 상태는 다를 수 있습니다. Synced는 선언형 상태 일치이지, 성능 보장까지 해주진 않거든요.

    해결: readiness/liveness보다 먼저 실제 요청 테스트와 로그 수집을 붙였습니다. ArgoCD 상태만 보고 안심하면 안 됩니다.

    문제 3. 노드 이동 후 성능 체감이 달라졌습니다

    원인: 같은 Kubernetes라도 노드 디스크 성능, 메모리 여유, 다른 워크로드 간섭이 다릅니다.

    해결: nodeSelector(노드 셀렉터, 특정 노드 선택)나 taint/toleration(테인트/톨러레이션, 스케줄링 제어)을 검토했고, 최소한 LLM 워크로드가 너무 자주 이사 다니지 않게 잡았습니다.

    문제 4. 급한 핫픽스가 Git과 어긋났습니다

    원인: 운영 중 kubectl edit로 바로 고친 뒤 Git에 반영하지 않았습니다. 며칠 후 ArgoCD 재동기화에서 다시 원래 값으로 돌아가더라고요. 네, 이거 은근 자주 나옵니다.

    해결: 핫픽스 후 바로 Git PR로 반영하는 습관을 들였습니다. Kubernetes GitOps는 결국 Git이 진실 공급원(single source of truth)이니까요.

    ArgoCD Ollama 배포 트러블슈팅 흐름을 설명하는 이미지

    운영 중 자주 만나는 문제인 스토리지 마운트 오류, Git 드리프트, 프록시 타임아웃을 단계별로 추적하는 트러블슈팅 흐름을 설명하는 이미지 자리입니다.

    검증과 결과: 무엇을 기준으로 성공이라고 봤는가

    저는 “파드가 떴다”를 성공으로 보지 않았습니다. 진짜 중요한 건 재배포 후에도 동일하게 동작하는지, 그리고 운영자가 덜 불안한지였거든요.

    제가 보는 검증 체크리스트

    1. ArgoCD에서 애플리케이션이 지속적으로 Synced/Healthy로 유지되는가
    2. 파드 재생성 후에도 기존 모델 캐시가 유지되는가
    3. 간단한 추론 요청이 내부 네트워크에서 안정적으로 응답하는가
    4. 노드 변경이나 롤링 업데이트 후에도 서비스 재현성이 유지되는가
    5. 운영 변경 사항이 모두 Git commit으로 추적되는가
    kubectl rollout restart deploy/ollama -n ollama
    kubectl get pods -n ollama -w
    kubectl exec -n ollama deploy/ollama -- ollama list

    실제로 써보니까, 위 세 줄만으로도 꽤 많은 걸 확인할 수 있었습니다. 롤링 후 파드가 다시 뜨고, 기존 모델이 그대로 보이면 일단 큰 산은 넘은 겁니다. 여기에 사내 서비스나 실험용 앱에서 실제 API 호출까지 붙여보면 더 좋고요.

    ArgoCD Ollama 배포 운영 결과와 안정성을 보여주는 대시보드 이미지

    재배포 이후에도 Ollama 모델 캐시가 유지되고, ArgoCD와 Kubernetes 상태가 안정적으로 보이는 운영 결과 대시보드 이미지 자리입니다.

    운영 관점에서 느낀 장단점

    장점은 명확합니다. ArgoCD Ollama 배포 구조를 한 번 정리해 두면 환경 복제와 복구가 빨라집니다. 특히 여러 사람이 만지는 환경에서는 “누가 뭘 바꿨는지”가 보이는 것만으로도 가치가 큽니다.

    • 장점: 선언형 관리, 재현성, 운영 표준화, 장애 복구 속도
    • 단점: 스토리지와 네트워크를 모르면 초반 진입 장벽이 있음
    • 주의점: Synced 상태와 서비스 품질은 별개라서 모니터링이 반드시 필요

    반대로 단점도 있습니다. 작은 단일 서버 환경에서는 오히려 Kubernetes가 과할 수 있습니다. 그래서 저는 항상 “정말 GitOps가 필요한 규모인가”를 먼저 봅니다. 혼자 잠깐 실험하는 정도라면 Docker Compose로 시작하는 게 더 낫기도 합니다. 하지만 팀이 붙고, 재현성이 필요하고, LLM 클라우드 실험을 계속 이어갈 생각이라면 이야기가 달라집니다.

    정리와 다음 단계

    정리하자면, 6개월 운영 기준으로 가장 중요했던 건 세 가지였습니다. 스토리지 고정, Git 기준 운영, 배포와 모델 관리를 분리. 이 세 가지만 지켜도 안정감이 꽤 올라갑니다. 저도 처음엔 이것저것 한 번에 자동화하려다가 삽질 좀 했습니다 ㅎㅎ 근데 결국 오래 살아남는 구성은 단순하고, 역할이 분리된 구성이더라고요.

    혹시 지금 ArgoCD로 LLM 워크로드를 올리려는 중이신가요? 그렇다면 먼저 작은 범위로 시작해 보세요. Ollama 하나, PVC 하나, Service 하나부터요. 그리고 동작이 확인되면 그다음에 Ingress, 인증, 모니터링을 붙이시면 됩니다. 이전 글에서 다룬 Kubernetes 스토리지 운영 팁과도 연결되는 부분이고, 다음 글에서는 ArgoCD Ollama 배포 뒤에 인증 프록시와 관측성(observability, 관측 가능성) 붙이는 이야기도 정리해보겠습니다.

    배포 전후 운영 복잡도, 모델 캐시 유지 여부, GitOps 적용 효과를 한눈에 비교하는 요약 인포그래픽 이미지 자리입니다.

    자주 묻는 질문

    Q. Ollama를 Kubernetes에 꼭 올려야 하나요?

    아닙니다. 단일 사용자, 단일 서버라면 더 단순한 방법이 맞을 수 있습니다. 다만 재현성과 팀 협업이 중요해지면 Kubernetes와 GitOps가 힘을 발휘합니다.

    Q. GPU가 없으면 의미가 없나요?

    꼭 그렇진 않습니다. 다만 모델 크기와 응답 기대치에 따라 체감이 다릅니다. 저는 처음 검증은 CPU 환경부터 시작했고, 그 과정에서 오히려 스토리지와 운영 흐름을 먼저 정리할 수 있었습니다.

    Q. 운영 후기 기준으로 가장 먼저 볼 지표는 뭔가요?

    저는 순서가 이렇습니다. 파드 상태, PVC 유지 여부, 실제 요청 성공, 재배포 후 재현성. 화려한 대시보드보다 이 네 가지가 먼저입니다.

  • [Cloud] Ollama 클라우드 배포 성공 사례: AWS EC2에서 LLM 운영하기

    [Cloud] Ollama 클라우드 배포 성공 사례: AWS EC2에서 LLM 운영하기

    [클라우드] Ollama 클라우드 배포 성공 사례: AWS EC2에서 LLM 운영하기

    Ollama 클라우드 배포를 고민하시는 분들이 정말 많아졌습니다. 로컬에서는 잘 돌던 LLM(Large Language Model, 대규모 언어 모델)이 팀 단위로 쓰이기 시작하면, 그다음부터는 거의 무조건 운영 이슈가 따라오거든요. 저도 처음엔 홈랩에서만 굴리다가 “이걸 외부에서 안정적으로 붙여 써야 하는데?” 하는 순간이 왔습니다. 그때 선택지가 여러 개 있었는데, 가장 먼저 손에 익는 건 역시 AWS EC2(Elastic Compute Cloud, 가상 서버)였습니다.

    실제로 써보니까 Ollama는 로컬 테스트용으로만 보기엔 아까운 도구였습니다. 모델 pull, 실행, API 호출 흐름이 꽤 단순해서 진입장벽이 낮고, 작은 팀에서 내부 AI API처럼 다루기에도 괜찮더라고요. 다만 Ollama AWS 구성을 아무 생각 없이 열어두면 보안, 디스크, 프로세스 관리에서 바로 삽질하게 됩니다. 저도 초반에 포트만 열고 붙였다가 “되긴 되는데 이거 운영 맞나?” 싶은 상태를 한동안 겪었거든요.

    이번 글에서는 제가 정리한 LLM 클라우드 운영 관점의 최소 구성, 실제 배포 순서, 그리고 중간에 겪었던 문제를 중심으로 풀어보겠습니다. 화려한 MLOps(Machine Learning Operations, 머신러닝 운영 자동화)까지는 아니고요. 작게 시작해서 안정적으로 굴리는 방법에 초점을 맞춰볼게요.

    Ollama 클라우드 배포를 위한 AWS EC2 전체 아키텍처 다이어그램

    EC2 인스턴스, 보안 그룹, 리버스 프록시, Ollama API 흐름이 한눈에 보이는 전체 구조 이미지가 들어갈 자리입니다.

    1. 왜 Ollama 클라우드 배포가 필요했나

    쉽게 말해 로컬 LLM은 혼자 실험할 때는 편한데, 여러 환경에서 재사용하려고 하면 금방 한계가 보입니다. 노트북 전원을 꺼버리면 끝이고, 네트워크 경로도 들쑥날쑥하고, 로그를 남기기도 애매하죠. 특히 다음 같은 상황이면 클라우드 쪽으로 한 번은 넘어가게 됩니다.

    • 사내 도구나 개인 앱에서 공통 API 엔드포인트가 필요할 때
    • 로컬 PC 대신 항상 켜져 있는 서버가 필요할 때
    • 모델 파일과 런타임을 한곳에서 관리하고 싶을 때
    • 테스트 환경과 운영 환경을 분리하고 싶을 때

    여기서 중요한 포인트! Ollama 클라우드 배포는 거대한 분산 시스템을 만드는 작업이 아닙니다. 처음엔 EC2 한 대와 제대로 잠근 네트워크, 그리고 프로세스 자동 시작만 있어도 충분합니다. 저도 처음엔 Kubernetes(쿠버네티스)까지 갈 생각을 했었는데, 솔직히 그건 너무 빨랐습니다. 먼저 단일 노드 운영 감각부터 잡는 게 훨씬 낫더라고요.

    2. Ollama AWS 구성, 쉽게 말해 어떤 구조인가

    Ollama는 모델을 내려받아 로컬 API로 노출하는 실행 환경에 가깝습니다. 쉽게 말해 “서버에 모델 실행기 하나 올려두고 HTTP로 호출한다” 정도로 이해하면 편합니다. 그래서 AWS에 올릴 때도 구조는 생각보다 단순합니다.

    1. EC2 인스턴스를 만든다.
    2. 서버에 Ollama를 설치한다.
    3. 필요한 모델을 pull 한다.
    4. 외부 접근은 직접 열지 말고 reverse proxy(리버스 프록시)나 VPN으로 감싼다.
    5. systemd(시스템디)로 자동 시작되게 만든다.
    6. 로그와 디스크 사용량을 주기적으로 본다.

    제가 직접 해보니 핵심은 모델 그 자체보다 운영 경계를 어디에 두느냐였습니다. Ollama는 잘 떠도, 포트를 0.0.0.0으로 열어놓고 인증 없이 노출하면 그 순간부터는 운영이 아니라 사고 대기 상태가 되거든요.

    로컬 운영과 클라우드 운영 차이

    항목 로컬 환경 AWS EC2 환경
    접근성 개인 장비 중심 공용 엔드포인트 구성 가능
    지속성 장비 전원 상태에 영향 상시 실행 구조로 만들기 쉬움
    보안 사설망에 숨기기 쉬움 보안 그룹, 프록시, 인증 고려 필수
    운영 포인트 실험 위주 로그, 디스크, 재시작 정책 중요
    확장 방향 개인 사용 중심 팀 공유, API 연동에 유리

    이 표만 봐도 감이 오실 겁니다. LLM 클라우드는 모델 성능 자체보다 운영 습관이 더 중요합니다.

    3. AWS EC2 배포 전 설계: 인스턴스, 디스크, 네트워크

    처음엔 이게 뭔가 싶었는데, 실제 배포 전에 세 가지만 정하면 이후가 편해집니다. 바로 인스턴스 유형, 스토리지 크기, 접근 방식입니다.

    인스턴스 선택 기준

    • 가벼운 테스트: CPU 인스턴스로 시작해도 됩니다.
    • 응답 속도가 중요한 경우: GPU 인스턴스를 검토하는 편이 낫습니다.
    • 동시 요청이 많은 경우: 모델 크기보다 메모리와 큐잉 전략을 먼저 봐야 합니다.

    여기서 제가 한 번 삽질했던 게 디스크였습니다. 모델 파일이 생각보다 금방 쌓입니다. “일단 기본 용량으로 가자” 했다가, 모델 몇 개만 받아도 금방 답답해지더라고요. 그래서 저는 초기에 여유 있는 EBS(Elastic Block Store, 블록 스토리지)를 잡고, 나중에 모델 정리 정책을 따로 가져가는 쪽이 훨씬 낫다고 봅니다.

    네트워크 접근 방식

    • 가장 안전한 방식: VPN 또는 bastion host(배스천 호스트)를 통한 내부 접근
    • 현실적인 절충안: Nginx(엔진엑스) reverse proxy 뒤에 두고 IP 제한 또는 인증 적용
    • 비추천: Ollama 포트를 인터넷에 직접 공개

    혹시 이런 경험 있으신가요? 테스트한다고 열어둔 포트가 나중에 그대로 운영이 되는 경우요. 진짜 자주 나옵니다. 그래서 시작부터 접근 레이어를 분리하는 게 좋습니다.

    4. 실전 구현: AWS EC2에 Ollama 올리기

    이제 실제 구성입니다. 아래 예시는 Ubuntu 계열 서버를 기준으로 정리했지만, 핵심 흐름은 다른 배포판에서도 비슷합니다. 저는 EC2 생성 후 보안 그룹에서 SSH와 프록시에 필요한 포트만 열고 시작했습니다.

    1) 기본 패키지 설치

    sudo apt update
    sudo apt install -y curl nginx
    

    여기서는 복잡하게 가지 않았습니다. 먼저 네트워크 진입점으로 Nginx를 두고, 그 뒤에서 Ollama를 띄우는 구조로 갔습니다.

    2) Ollama 설치

    curl -fsSL https://ollama.com/install.sh | sh
    ollama --version
    

    설치 후에는 버전 확인 정도만 해도 충분합니다. 굳이 여기서 세부 옵션을 많이 건드리기보다, 먼저 정상 실행부터 보는 게 좋습니다.

    3) 모델 다운로드와 테스트

    ollama pull llama2
    ollama run llama2
    

    모델명은 실제 운영 목적에 따라 바꾸시면 됩니다. 중요한 건 먼저 한 개 모델만 올려서 엔드투엔드로 확인하는 겁니다. 저도 처음엔 이것저것 한꺼번에 올리려다가 디스크 사용량이 꼬여서 다시 정리했었습니다.

    Ollama AWS 설치와 Nginx 리버스 프록시 구성 장면

    터미널 설치 과정, 보안 그룹, 리버스 프록시 구성을 시각적으로 보여주는 이미지가 들어갈 자리입니다.

    4) 외부 바인딩과 서비스 실행

    환경에 따라 Ollama를 서비스로 띄우는 방식이 다를 수 있어서, 저는 systemd override로 환경 변수를 명시하는 쪽을 선호합니다.

    sudo mkdir -p /etc/systemd/system/ollama.service.d
    sudo tee /etc/systemd/system/ollama.service.d/override.conf > /dev/null <<'EOF'
    [Service]
    Environment="OLLAMA_HOST=0.0.0.0:11434"
    EOF
    
    sudo systemctl daemon-reload
    sudo systemctl restart ollama
    sudo systemctl enable ollama
    sudo systemctl status ollama
    

    OLLAMA_HOST를 열면 접근성이 좋아지는 대신 위험도 커집니다. 그래서 이 설정은 단독으로 쓰지 말고, 바로 앞단 프록시나 네트워크 제한과 같이 가져가야 합니다.

    5) Nginx reverse proxy 설정

    server {
        listen 80;
        server_name your-domain.example;
    
        location / {
            proxy_pass http://127.0.0.1:11434;
            proxy_http_version 1.1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    

    도메인을 쓰지 않는다면 내부망에서만 접근하게 해도 되고요. 외부 공개가 필요하다면 TLS(전송 계층 보안)까지 반드시 올리시는 걸 권장합니다.

    6) API 동작 확인

    curl http://127.0.0.1:11434/api/tags
    
    curl http://127.0.0.1:11434/api/generate \
      -H "Content-Type: application/json" \
      -d '{
        "model": "llama2",
        "prompt": "hello",
        "stream": false
      }'
    

    이 단계에서 응답이 오면 일단 절반은 끝난 겁니다. 드디어 됐다, 싶은 순간이 여기서 오더라고요.

    5. 운영 편의성 높이기: 로그, 상태 확인, 배포 습관

    Ollama AWS 구성이 한 번 붙고 나면, 그다음부터는 운영 습관이 중요합니다. 저는 최소한 아래 세 가지는 꼭 챙깁니다.

    1. 서비스 자동 시작 여부 확인
    2. 로그 확인 루틴 만들기
    3. 디스크 사용량 주기 점검
    sudo systemctl is-enabled ollama
    sudo journalctl -u ollama -n 100 --no-pager
    df -h
    ollama list
    

    실제로 써보니까 가장 자주 보는 건 로그와 디스크였습니다. 모델 pull이 반복되거나, 테스트 모델을 안 지우고 쌓아두면 생각보다 빨리 관리 포인트가 생깁니다.

    간단한 운영 체크리스트

    • 사용하지 않는 모델은 주기적으로 정리하기
    • 운영용과 테스트용 인스턴스 분리 고려하기
    • 공개 엔드포인트라면 인증 레이어 추가하기
    • CloudWatch(클라우드와치) 같은 모니터링 연동 검토하기

    6. ⚠️ 실제로 겪었던 문제와 해결법

    이 섹션이 아마 제일 실전적일 겁니다. 저도 처음엔 “설치 스크립트 돌리면 끝 아닌가?” 싶었는데, 운영은 늘 그 뒤가 문제더라고요.

    문제 1. 외부에서 접속이 안 됨

    원인 후보는 대부분 비슷합니다. 보안 그룹, 방화벽, Ollama 바인딩 주소, 프록시 설정. 저는 초반에 서비스는 떠 있는데 127.0.0.1에만 묶여 있어서 한참 헤맸습니다.

    • 해결: OLLAMA_HOST 설정 확인
    • 해결: EC2 보안 그룹 인바운드 규칙 재점검
    • 해결: 프록시가 올바른 백엔드 주소를 보는지 확인

    문제 2. 모델은 올라왔는데 응답이 너무 굼뜸

    이건 제품 탓이라기보다 자원 배분 문제인 경우가 많습니다. 모델 크기와 인스턴스 성격이 안 맞으면 바로 티가 납니다. 처음엔 모델만 바꾸면 해결될 줄 알았는데, 실제로는 메모리와 디스크 I/O 영향도 꽤 크더라고요.

    • 해결: 더 작은 모델로 먼저 검증
    • 해결: 동시 요청 수를 낮춰서 병목 위치 확인
    • 해결: 필요 시 GPU 인스턴스로 이동 검토

    문제 3. 재부팅 후 서비스가 안 살아남

    이거 진짜 자주 놓칩니다 ㅎㅎ 설치는 됐는데 enable을 안 했거나, override 파일 반영 전에 재시작이 꼬인 경우가 있었습니다.

    • 해결: systemctl enable ollama 확인
    • 해결: daemon-reload 후 재시작
    • 해결: journalctl로 시작 실패 로그 확인

    문제 4. 디스크가 금방 찬다

    모델 파일이 커지면 금방 체감됩니다. 저도 처음엔 “테스트 모델 몇 개쯤이야” 했는데, 나중엔 정리부터 하게 되더라고요.

    • 해결: 운영 모델만 남기고 정리
    • 해결: EBS 여유 용량 확보
    • 해결: 모델 추가 전 목적부터 정리

    주의할 점은, 문제를 만날 때마다 툴을 바꾸기보다 현재 병목이 네트워크인지, 자원인지, 프로세스 관리인지 먼저 분리해서 보는 겁니다. 이 습관 하나로 삽질 시간을 꽤 줄였습니다.

    7. 검증과 결과: Ollama 운영 후기

    구성이 끝나면 결국 확인해야 할 건 두 가지입니다. 정상 응답과 반복 가능한 운영입니다. 저는 아래 순서로 검증했습니다.

    1. 로컬에서 curl로 API 응답 확인
    2. 프록시 경유 응답 확인
    3. 재부팅 후 자동 시작 확인
    4. 모델 목록과 로그 확인
    5. 간단한 애플리케이션에서 실제 호출 테스트
    curl http://your-domain.example/api/tags
    sudo reboot
    sudo systemctl status ollama
    sudo journalctl -u ollama -n 50 --no-pager
    

    검증이 끝난 뒤 느낀 건 분명했습니다. Ollama 클라우드 배포는 생각보다 빨리 구축할 수 있고, 운영 난이도도 폭발적으로 높지는 않습니다. 다만 “그냥 설치”와 “운영 가능한 상태” 사이에는 꽤 큰 차이가 있습니다. 제가 직접 해보니 그 차이를 만드는 건 거창한 기술보다도 보안 경계, 서비스 자동화, 디스크 관리 같은 기본기였습니다.

    Ollama 클라우드 배포 결과를 검증하는 API 및 서비스 상태 대시보드

    API 응답 성공, systemd 상태, 로그 확인 결과를 보여주는 검증용 대시보드 이미지가 들어갈 자리입니다.

    이번 구성에서 얻은 체감상 장점

    • 로컬 장비를 계속 켜둘 필요가 없습니다.
    • 앱이나 스크립트에서 공통 엔드포인트로 붙이기 편합니다.
    • 모델과 런타임을 서버 기준으로 일관되게 관리할 수 있습니다.

    반대로 기억할 한계

    • 큰 모델일수록 자원 계획이 중요합니다.
    • 공개 운영은 반드시 보안 레이어가 필요합니다.
    • 장기적으로는 모니터링과 인증 체계가 추가되어야 합니다.

    8. 정리와 다음 단계

    정리해보면, Ollama AWS 운영의 핵심은 복잡한 오케스트레이션이 아니라 작게 시작해서 안전하게 굴리는 것입니다. 저도 처음엔 이걸 너무 크게 생각했는데, EC2 한 대에 Ollama와 프록시를 올리고, 서비스 자동 시작과 접근 제어만 제대로 걸어도 꽤 쓸 만한 기반이 만들어지더라고요.

    특히 LLM 클라우드를 처음 만지는 분이라면 아래 순서로 접근해보시면 좋겠습니다.

    1. 작은 모델 하나로 API 응답부터 확인하기
    2. 보안 그룹과 프록시로 외부 노출 경계 만들기
    3. systemd와 로그 확인 루틴 정리하기
    4. 그다음에야 GPU, 인증, 모니터링을 확장하기

    다음 글에서는 Nginx 앞단에 인증을 더하는 방법이나, 여러 모델을 나눠 운영할 때 어떤 기준으로 분리하면 좋은지 다뤄볼 예정입니다. 이전 글에서 홈랩 기반 LLM 구성 이야기를 보셨다면, 이번 글은 그 연장선으로 보셔도 좋습니다.

    Ollama 클라우드 배포 운영 체크리스트와 구성 요약 인포그래픽

    배포 흐름, 주의사항, 검증 포인트를 한 장으로 정리한 요약 인포그래픽 이미지가 들어갈 자리입니다.

    9. 자주 묻는 질문 FAQ

    Q1. Ollama를 EC2에 바로 공개해도 되나요?

    권장하지 않습니다. 가능은 해도, 운영 관점에서는 프록시나 내부망 제어 없이 바로 공개하는 방식은 위험합니다.

    Q2. 꼭 GPU가 있어야 하나요?

    아닙니다. 테스트나 가벼운 용도는 CPU 기반으로도 시작할 수 있습니다. 다만 응답 속도와 모델 크기에 따라 한계는 빨리 옵니다.

    Q3. Kubernetes까지 바로 가야 하나요?

    제 경험상 아닙니다. 단일 EC2에서 운영 감각을 먼저 잡는 게 훨씬 중요합니다. 저도 처음엔 큰 구조를 생각했는데, 결국 기본기가 먼저였어요.

    Q4. 운영하면서 가장 먼저 볼 지표는 뭔가요?

    로그, 메모리, 디스크 사용량입니다. 특히 디스크는 모델 파일 때문에 생각보다 빨리 체감됩니다.

    마지막으로 한 줄 정리해보겠습니다. Ollama 운영 후기를 한마디로 말하면, “설치는 쉽고 운영은 기본기가 전부”였습니다. 이 말이 꽤 정확하더라고요.