13년차의 서버실

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

[태그:] 삽질

  • [k8s] Cluster Autoscaler에서 Karpenter로 마이그레이션 결정 기준 및 전환 전략

    [k8s] Cluster Autoscaler에서 Karpenter로 마이그레이션 결정 기준 및 전환 전략

    [Kubernetes] Cluster Autoscaler에서 Karpenter로 마이그레이션: 언제, 어떻게 전환할까요?

    안녕하세요, 13년차 서버실 지킴이입니다. 오늘은 Kubernetes(쿠버네티스) 환경에서 노드 오토스케일링(Auto Scaling)을 고민하는 분들을 위한 이야기를 해볼까 합니다. 특히 EKS (Amazon Elastic Kubernetes Service)를 운영하면서 Cluster Autoscaler (CA)의 한계를 느끼고 Karpenter로의 마이그레이션을 고민하는 분들이라면, 제가 직접 겪었던 경험과 삽질 끝에 얻은 노하우가 도움이 될 거예요.

    클라우드 환경에서 Kubernetes 클러스터를 운영하다 보면, 워크로드(Workload)의 변화에 따라 노드를 유연하게 늘리고 줄이는 것이 정말 중요합니다. 비용 최적화는 물론이고, 서비스 안정성에도 직결되거든요. 처음에는 Cluster Autoscaler(클러스터 오토스케일러)가 만능인 줄 알았는데, 막상 써보니 아쉬운 점들이 꽤 있더라고요. 특히 급작스러운 트래픽 증가나 스팟 인스턴스(Spot Instance) 활용 시 Karpenter가 보여주는 퍼포먼스는 저를 깜짝 놀라게 했습니다.

    오늘은 Cluster Autoscaler에서 Karpenter로의 전환을 언제 고려해야 하는지, 그리고 실제 전환은 어떻게 진행해야 하는지에 대한 저만의 결정 기준과 전략을 솔직하게 공유해 드릴게요. 삽질 과정도 가감 없이 보여드릴 테니, 함께 살펴보시죠!

    Karpenter가 도입된 Kubernetes 클러스터의 노드 오토스케일링 아키텍처 개요도

    Cluster Autoscaler와 Karpenter: 핵심 개념 차이

    본격적인 마이그레이션 이야기를 하기 전에, 두 오토스케일링 도구가 어떻게 다른지 간단히 짚고 넘어갈게요. 쉽게 말해 접근 방식 자체가 다릅니다.

    Cluster Autoscaler (CA): 그룹 기반 오토스케일링

    • 작동 방식: Cluster Autoscaler는 AWS Auto Scaling Group (ASG)을 기반으로 작동합니다. 즉, 미리 정의된 ASG의 최소/최대 인스턴스 개수 범위 내에서 노드를 추가하거나 줄이죠.
    • 장점: 비교적 설정이 간단하고, 오랫동안 사용되어 안정성이 검증되었습니다. 기존 EC2 인스턴스 관리 방식에 익숙하다면 접근하기 쉽습니다.
    • 단점:
      • 느린 스케일 아웃(Scale Out) 속도: ASG가 새 인스턴스를 프로비저닝(Provisioning)하는 데 시간이 걸립니다. 워크로드 요청이 급증할 때 노드 부족 현상이 생길 수 있어요.
      • 비효율적인 리소스 활용: 특정 파드(Pod)에 필요한 리소스 타입을 정확히 맞추기 어렵습니다. ASG는 특정 인스턴스 타입이나 몇 가지 인스턴스 타입 묶음으로 구성되니까요. 이 때문에 kube-scheduler (쿠베 스케줄러)가 파드를 노드에 배치하지 못하는 ‘스케줄링 불가(unschedulable)’ 상태가 발생할 수 있습니다.
      • 스팟 인스턴스 활용 제약: 스팟 인스턴스를 활용하더라도, ASG의 인스턴스 풀(Pool)이 제한적이라 유연성이 떨어집니다.

    Karpenter: 파드 기반 오토스케일링

    • 작동 방식: Karpenter는 스케줄링되지 않은 파드를 직접 감지하고, 해당 파드에 가장 적합한 EC2 인스턴스를 직접 프로비저닝합니다. ASG를 거치지 않고 EC2 RunInstances API를 직접 호출해서 노드를 띄우는 거죠.
    • 장점:
      • 압도적인 스케일 아웃 속도: 필요한 노드를 거의 실시간으로 생성하기 때문에 워크로드 변화에 매우 빠르게 대응합니다. 제가 직접 써보니 CA보다 훨씬 빨랐습니다.
      • 최적의 리소스 활용: 파드가 요구하는 CPU, 메모리, GPU 등 리소스에 맞춰 가장 효율적인 EC2 인스턴스 타입을 선택합니다. 스팟 인스턴스 활용도 극대화해서 비용 절감 효과가 커요.
      • 단순한 관리: ASG를 직접 관리할 필요 없이, Karpenter의 Provisioner (프로비저너) 설정 하나로 노드 프로비저닝 정책을 관리할 수 있습니다.
    • 단점:
      • 초기 학습 곡선: 새로운 개념과 설정이 필요해서 처음에는 좀 낯설 수 있습니다.
      • 클라우드 종속성: 현재는 AWS EKS에 특화되어 있습니다 (다른 클라우드 지원도 개발 중이지만, 현재로선 AWS가 주력입니다).

    Karpenter로의 마이그레이션 결정 기준: 언제 전환해야 할까요?

    제가 13년차 인프라 엔지니어로서 여러 환경을 경험해보니, 마이그레이션은 항상 신중해야 하더라고요. 무조건 좋다고 따라가는 것보다, 우리 서비스에 어떤 이점이 있을지 명확히 파악하는 게 중요합니다. 다음 질문들에 해당한다면 Karpenter로의 전환을 적극적으로 고려해볼 때입니다.

    • 잦은 스케일링 이벤트와 느린 노드 확장 속도에 불만이 있다:

      특히 이벤트 기반(Event-driven) 서비스나 예측 불가능한 트래픽 패턴을 가진 서비스라면 CA의 스케일 아웃 속도가 병목이 될 수 있습니다. "파드가 Pending(대기) 상태인데 노드가 왜 이렇게 늦게 뜨지?" 라는 질문을 자주 하셨다면 Karpenter가 답이 될 수 있습니다.

    • 클라우드 비용 최적화가 시급하다:

      CA는 ASG가 정해준 인스턴스 타입 내에서만 노드를 띄우다 보니, 파드의 리소스 요구사항과 정확히 일치하는 인스턴스를 찾기 어렵습니다. Karpenter는 파드에 딱 맞는 최적의 인스턴스를 찾아 스팟 인스턴스까지 적극적으로 활용하기 때문에, 불필요한 리소스 낭비를 줄여줍니다. 저희 홈랩에서도 스팟 인스턴스 활용률이 훨씬 높아지면서 비용이 꽤 절감됐습니다.

    • 노드 타입 관리가 복잡하다고 느낀다:

      CA를 사용하면 다양한 워크로드를 위해 여러 ASG를 만들고 관리해야 할 때가 많습니다. Karpenter는 Provisioner (프로비저너) 하나로 다양한 인스턴스 타입을 유연하게 관리할 수 있어 운영 부담이 줄어듭니다.

    • 특정 리소스(GPU, 고성능 CPU 등) 요구사항이 있는 파드가 많다:

      머신러닝(Machine Learning) 워크로드처럼 특정 GPU나 고성능 CPU를 요구하는 파드들이 있다면, Karpenter가 해당 파드에 맞는 노드를 즉시 프로비저닝해서 스케줄링 효율을 극대화할 수 있습니다.

    Karpenter로의 전환 전략: 실전 구현

    이제 Karpenter로 마이그레이션하는 실제 과정을 단계별로 살펴보겠습니다. 저는 EKS 환경을 기준으로 설명드릴게요.

    단계 1: Karpenter 설치 및 IAM 권한 설정

    Karpenter는 AWS API를 직접 호출해서 EC2 인스턴스를 생성하고 관리해야 하므로, 적절한 IAM(Identity and Access Management) 권한이 필수입니다. 공식 문서에 따라 IAM Role과 Service Account를 생성하고, Karpenter 컨트롤러를 설치합니다. 이 부분은 공식 문서가 워낙 잘 되어 있어서 그대로 따라가시면 됩니다. 핵심은 Karpenter가 EC2, IAM, SSM 등의 리소스에 접근할 수 있는 권한을 부여하는 것입니다.

    설치 후에는 Karpenter Controller Pod가 잘 뜨는지 확인해야 합니다.

    kubectl get pods -n karpenter
    # 예시 출력:
    # NAME                         READY   STATUS    RESTARTS   AGE
    # karpenter-controller-xxxxx   1/1     Running   0          5m
    

    단계 2: Provisioner 설정

    Karpenter의 핵심은 바로 Provisioner 리소스입니다. 어떤 종류의 노드를, 어떤 조건으로 생성할지 여기에 정의합니다. 처음에는 너무 복잡하게 생각하지 마시고, 가장 기본적인 설정으로 시작하는 것을 추천합니다.

    Karpenter Provisioner YAML 설정 예시와 주요 파라미터 설명

    Karpenter Provisioner YAML 설정 예시와 주요 파라미터 설명

    apiVersion: karpenter.sh/v1beta1
    kind: Provisioner
    metadata:
      name: default
    spec:
      # Karpenter가 사용할 AMI Family를 정의합니다. EKS 최신 Optimized AMI를 사용하세요.
      # (예: AL2, AL2023, Bottlerocket, Ubuntu)
      # Karpenter는 여기에 지정된 AMI Family의 최신 EKS Optimized AMI를 자동으로 선택합니다.
      # official EKS AMIs: https://docs.aws.amazon.com/eks/latest/userguide/retrieve-ami-id.html
      amiFamily: AL2 # Amazon Linux 2 (EKS Optimized AMI) 또는 AL2023
    
      # 인스턴스 프로비저닝에 대한 요구사항을 정의합니다.
      # 여기서는 amd64 아키텍처의 온디맨드 또는 스팟 인스턴스를 사용하도록 설정했습니다.
      requirements:
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["on-demand", "spot"] # 스팟 인스턴스 활용을 적극 권장합니다!
        - key: kubernetes.io/arch
          operator: In
          values: ["amd64"]
        - key: karpenter.k8s.aws/instance-category
          operator: In
          values: ["c", "m", "r"] # 컴퓨팅, 메모리, 범용 인스턴스 카테고리
        - key: karpenter.k8s.aws/instance-family
          operator: In
          values: ["c5", "c6i", "m5", "m6i", "r5", "r6i"] # 자주 사용하는 인스턴스 패밀리
        - key: karpenter.k8s.aws/instance-size
          operator: NotIn
          values: ["nano", "micro"] # 너무 작은 인스턴스는 제외
    
      # 노드가 어떤 서브넷(Subnet)에 생성될지 태그(Tag)로 정의합니다.
      # EKS 클러스터가 사용하는 서브넷 태그와 일치해야 합니다.
      subnetSelector:
        karpenter.sh/discovery: "your-eks-cluster-name" # EKS 클러스터 이름으로 교체
    
      # 노드가 어떤 보안 그룹(Security Group)을 사용할지 태그로 정의합니다.
      securityGroupSelector:
        karpenter.sh/discovery: "your-eks-cluster-name" # EKS 클러스터 이름으로 교체
    
      # 노드에 적용될 테인츠(Taints)를 정의합니다.
      # 여기에 테인트가 있으면, 해당 테인트를 허용하는 파드만 스케줄링됩니다.
      # - key: my-app
      #   effect: NoSchedule
    
      # 노드 템플릿입니다. SSH 키페어, IAM 인스턴스 프로파일 등을 지정할 수 있습니다.
      providerRef:
        name: default
    
      # 노드 삭제 정책 (consolidation).
      # 기본적으로 파드가 없거나, 더 효율적인 노드로 대체될 수 있으면 노드를 삭제합니다.
      consolidation:
        enabled: true
        # consolidateAfter: 5m # 노드 생성 후 최소 5분은 유지 (선택 사항)
    
      # 노드 TTL(Time To Live) 설정. 노드가 일정 시간 동안 유휴 상태이거나
      # 최대 수명을 넘으면 삭제됩니다.
      ttlSecondsAfterEmpty: 300 # 노드에 파드가 없으면 300초(5분) 후 삭제
      ttlSecondsUntilExpired: 604800 # 노드는 최대 7일(604800초)까지만 유지 (수명 관리)
    
    ---
    apiVersion: karpenter.k8s.aws/v1beta1
    kind: AWSNodeTemplate
    metadata:
      name: default
    spec:
      # Karpenter가 사용할 IAM 인스턴스 프로파일을 지정합니다.
      # EKS 노드에 필요한 권한이 포함된 프로파일이어야 합니다.
      # 보통 `eksctl create iamserviceaccount` 등으로 생성됩니다.
      instanceProfile: "KarpenterNodeInstanceProfile-your-cluster-name" # 실제 프로파일 이름으로 교체
    
      # SSH 키페어를 지정하여 노드에 SSH 접속이 가능하도록 합니다. (선택 사항)
      # sshName: your-ssh-key-name
    
      # 노드에 추가적인 태그를 붙일 수 있습니다.
      tags:
        environment: production
        managed-by: karpenter
        karpenter.sh/cluster-name: "your-eks-cluster-name" # 클러스터 이름으로 교체
    

    위 YAML을 적용하면 Karpenter가 이제 파드를 감지하고 노드를 프로비저닝할 준비가 됩니다. 여기서 중요한 포인트는 requirements 섹션입니다. 어떤 인스턴스 타입을 사용할지, 스팟(Spot)을 쓸지 온디맨드(On-Demand)를 쓸지 등 Karpenter의 동작 방식을 결정하는 핵심 설정입니다. 저는 스팟 인스턴스를 적극적으로 활용해서 비용을 절감하는 방향으로 설정했습니다.

    단계 3: Cluster Autoscaler (CA) 노드 그룹 점진적 비활성화

    Karpenter가 잘 작동하는지 확인하면서, 기존 CA가 관리하던 노드 그룹(ASG)을 점진적으로 스케일 다운(Scale Down)해야 합니다. 한 번에 모든 노드 그룹을 비활성화하면 서비스 중단 위험이 있으니, 워밍업(Warm-up) 기간을 두는 것이 좋습니다.

    1. 새로운 파드를 배포하거나 기존 파드를 재시작하여 Karpenter가 새 노드를 잘 띄우는지 관찰합니다.
    2. Karpenter가 프로비저닝한 노드가 충분히 확보되었다고 판단되면, CA가 관리하는 ASG의 desired capacity를 0으로 설정합니다.
    3. ASG의 최소/최대 인스턴스 수도 0으로 설정하여 CA가 더 이상 노드를 관리하지 않도록 합니다.
    # EKS 노드 그룹 목록 확인 (eksctl 사용 예시)
    eksctl get nodegroup --cluster your-eks-cluster-name
    
    # 특정 노드 그룹의 desired capacity를 0으로 설정
    # (eksctl 명령은 ASG도 함께 조정합니다)
    eksctl scale nodegroup --cluster your-eks-cluster-name --name your-nodegroup-name --nodes 0 --nodes-min 0 --nodes-max 0
    
    # 또는 AWS CLI로 ASG 직접 수정 (ASG 이름 확인 필요)
    # aws autoscaling update-auto-scaling-group --auto-scaling-group-name your-asg-name --desired-capacity 0 --min-size 0 --max-size 0
    

    이렇게 하면 CA가 관리하던 노드들은 서서히 드레인(Drain)되고 종료되며, Karpenter가 그 역할을 완전히 넘겨받게 됩니다. 이 과정에서 파드들이 새로운 Karpenter 노드로 잘 재스케줄링되는지 꼼꼼히 확인해야 합니다.

    주의사항 및 트러블슈팅: 삽질 경험

    제가 Karpenter를 도입하면서 겪었던 몇 가지 삽질 경험과 주의사항을 공유합니다. 이걸 미리 아셨다면 여러분은 저보다 훨씬 적게 고생하실 거예요. 😅

    • ⚠️ IAM 권한은 정말 중요합니다!

      Karpenter가 EC2 인스턴스를 직접 다루기 때문에 IAM 권한이 조금만 잘못되어도 노드가 뜨지 않습니다. 특히 ec2:RunInstances, ec2:TerminateInstances, iam:PassRole 등의 권한이 제대로 부여되었는지 반드시 확인하세요. 저는 iam:PassRole을 빼먹어서 한참 헤맸습니다. Karpenter Controller 로그를 확인하면 어떤 권한이 부족한지 명확하게 나옵니다.

      # Karpenter Controller 로그 확인
      kubectl logs -f -n karpenter $(kubectl get pods -n karpenter -l app.kubernetes.io/name=karpenter -o name)
      
    • Pod Disruption Budget (PDB) 고려:

      Karpenter는 노드 통합(Consolidation) 기능을 통해 불필요한 노드를 효율적으로 제거합니다. 이때 PDB (Pod Disruption Budget)가 설정된 파드들은 Karpenter의 노드 종료 작업을 방해할 수 있습니다. PDB가 너무 엄격하면 Karpenter가 노드를 줄이지 못하고 비용이 낭비될 수 있으니, 워크로드의 특성에 맞춰 PDB를 적절히 설정해야 합니다.

    • Initial Scale-up Delay (초기 스케일업 지연) 착시:

      Karpenter는 ASG를 사용하지 않고 바로 EC2 인스턴스를 띄우기 때문에, 처음 노드가 올라올 때까지의 시간이 CA보다 오히려 길게 느껴질 수 있습니다. 하지만 이는 인스턴스 부팅 및 EKS 클러스터 조인(Join) 과정이 포함되기 때문이고, 실제 “스케줄링되지 않은 파드”를 “노드에 할당”하는 과정은 훨씬 빠릅니다. 이 차이를 이해하고 인내심을 가져야 합니다. 🙂

    • Spot Instance Interruptions (스팟 인스턴스 중단) 대비:

      Karpenter는 스팟 인스턴스를 적극 활용하여 비용을 절감하지만, 스팟 인스턴스는 언제든지 AWS에 의해 중단될 수 있습니다. 중요한 스테이트풀(Stateful) 워크로드에는 스팟 인스턴스를 사용하지 않거나, 중단에 강한 아키텍처(예: 분산 시스템, 재시작 가능한 작업)를 구성하는 것이 중요합니다.

    검증 및 결과 확인

    Karpenter 마이그레이션이 성공적으로 이루어졌는지 확인하는 방법은 다음과 같습니다.

    1. 노드 상태 확인: kubectl get nodes 명령으로 노드가 잘 뜨고 준비(Ready) 상태인지 확인합니다. Karpenter가 띄운 노드에는 특정 레이블(Label)이나 태그가 붙어있으니 쉽게 구분할 수 있습니다.
      kubectl get nodes -l karpenter.sh/provisioner-name=default
      # 예시 출력:
      # NAME                                           STATUS   ROLES    AGE   VERSION
      # ip-10-0-x-x.ap-northeast-2.compute.internal    Ready    <none>   5m    v1.28.x
      
    2. 파드 스케줄링 확인: 새로운 파드를 배포하거나, 기존 파드의 리소스 요청을 늘려서 Karpenter가 노드를 빠르게 프로비저닝하고 파드를 스케줄링하는지 확인합니다.
    3. Karpenter Provisioner 상태 확인:
      kubectl describe provisioner default
      # 이 명령을 통해 Karpenter가 어떤 노드를 프로비저닝하고 있는지,
      # 그리고 어떤 이벤트가 발생했는지 상세히 볼 수 있습니다.
      
    4. AWS EC2 콘솔 확인: EC2 콘솔에서 인스턴스가 Karpenter에 의해 생성되고 종료되는 것을 직접 관찰합니다. 태그를 통해 Karpenter가 관리하는 인스턴스인지 쉽게 알 수 있습니다.
    5. 비용 모니터링: AWS Cost Explorer를 통해 마이그레이션 전후의 비용 변화를 모니터링합니다. 특히 스팟 인스턴스 활용률이 높아지면서 비용이 얼마나 절감되었는지 확인하는 것이 중요합니다.
    Karpenter 도입 후 EKS 클러스터의 노드 및 파드 스케일링 성능 대시보드

    Karpenter 도입 후 EKS 클러스터의 노드 및 파드 스케일링 성능 대시보드

    Cluster Autoscaler vs. Karpenter: 비교 및 선택 기준

    제가 경험한 바를 바탕으로 두 오토스케일러의 핵심 차이점을 표로 정리해봤습니다. 어떤 상황에서 어떤 도구가 더 유리한지 판단하는 데 도움이 될 거예요.

    구분 Cluster Autoscaler (CA) Karpenter
    작동 방식 Auto Scaling Group (ASG) 기반 스케줄링되지 않은 파드 직접 감지, EC2 API 호출
    노드 프로비저닝 속도 상대적으로 느림 (ASG의 인스턴스 생성 시간) 매우 빠름 (파드 요구사항에 맞춰 즉시 생성)
    리소스 효율성 ASG 인스턴스 타입 내에서 선택, 비효율 가능성 파드 요구사항에 가장 적합한 인스턴스 선택, 높은 효율성
    비용 최적화 ASG 설정에 의존, 스팟 활용 제한적 스팟 인스턴스 적극 활용, 비용 절감 효과 큼
    관리 복잡성 여러 ASG 관리 필요 Provisioner 리소스 하나로 관리, 단순함
    주요 사용 사례 워크로드 변동이 적고 안정적인 환경, 온디맨드 위주 잦은 스케일링, 비용 최적화, 스팟 인스턴스 적극 활용 환경
    트러블슈팅 난이도 ASG 문제, CA 로그 Karpenter Controller 로그, IAM 권한, Provisioner 설정
    Kubernetes Cluster Autoscaler와 Karpenter의 주요 특징 및 마이그레이션 결정 기준 비교

    Kubernetes Cluster Autoscaler와 Karpenter의 주요 특징 및 마이그레이션 결정 기준 비교

    마무리하며: 더 나은 클러스터 운영을 위한 선택

    Cluster Autoscaler에서 Karpenter로의 마이그레이션은 단순히 도구를 바꾸는 것을 넘어, Kubernetes 클러스터의 리소스 관리 효율성과 비용 최적화를 한 단계 끌어올리는 중요한 결정입니다. 제가 직접 경험해보니, 특히 워크로드 변동성이 크고 스팟 인스턴스 활용을 통해 비용을 절감하고자 하는 환경이라면 Karpenter가 단연코 훌륭한 선택지였습니다.

    물론 새로운 도구를 도입하는 데는 초기 설정과 학습 비용이 따릅니다. 하지만 Karpenter가 제공하는 유연성과 효율성을 고려하면 충분히 투자할 가치가 있다고 생각합니다. 이 글이 여러분의 Karpenter 마이그레이션 여정에 작은 등불이 되었기를 바랍니다. 혹시 더 궁금한 점이나 제가 겪지 못했던 다른 삽질 경험이 있다면 댓글로 공유해주세요. 함께 배우고 성장하는 것이 인프라 엔지니어의 숙명이 아니겠습니까! 다음번에는 Karpenter의 고급 기능이나 다른 클라우드 환경에서의 활용 방안에 대해서도 이야기해볼 수 있으면 좋겠네요. 🎉

  • [CI/CD] Kubernetes 환경 Jenkins: 1년 운영하며 겪은 성능 최적화와 안정화 사례

    [CI/CD] Kubernetes 환경 Jenkins: 1년 운영하며 겪은 성능 최적화와 안정화 사례

    [CI/CD] Kubernetes 환경 Jenkins: 1년 운영하며 겪은 성능 최적화와 안정화 사례

    안녕하세요, 13년차 서버실 지킴이입니다. 오늘은 Kubernetes(쿠버네티스) 환경에서 Jenkins(젠킨스)를 1년 넘게 운영하며 겪었던 삽질과 그 과정에서 얻은 성능 최적화, 안정화 노하우를 풀어볼까 합니다. 많은 분들이 CI/CD(지속적 통합/지속적 배포) 파이프라인 구축에 Jenkins를 사용하고 계실 텐데, 특히 Kubernetes 위에서 Jenkins를 돌리면서 “이게 맞나?” 싶었던 경험들 있으실 거예요. 제가 딱 그랬거든요. 😅

    처음엔 마냥 좋다고 생각했던 Jenkins on Kubernetes가 생각보다 많은 운영 난이도를 요구했습니다. 툭하면 죽는 빌드 에이전트, 느려터진 빌드 시간, 예상치 못한 마스터 다운까지… 정말이지 밤낮없이 씨름했던 기억이 생생합니다. 이 글에서는 제가 직접 부딪히며 해결했던 문제들과 그 과정을 여러분들께 멘토처럼 상세히 알려드릴게요. 혹시 비슷한 고민을 하고 계셨다면, 제 경험이 조금이나마 도움이 되기를 바랍니다! 🙏

    Kubernetes 환경 Jenkins 아키텍처 개요: 마스터와 동적 에이전트 파드들의 상호작용

    Jenkins on Kubernetes, 왜 선택했을까요? (개념 설명)

    Jenkins는 워낙 유명한 CI/CD 자동화 도구죠. 프로젝트 빌드, 테스트, 배포 등 개발 프로세스의 여러 단계를 자동화해주는 역할을 합니다. 그런데 이걸 왜 굳이 Kubernetes 위에서 돌리냐고요? 간단히 말해서, 유연성과 확장성 때문입니다.

    • 동적 에이전트 프로비저닝 (Dynamic Agent Provisioning): Kubernetes의 가장 큰 장점 중 하나인데요, 빌드가 필요할 때만 Jenkins Agent(젠킨스 에이전트) Pod(파드)를 생성하고, 빌드가 끝나면 자동으로 제거할 수 있습니다. 덕분에 리소스를 효율적으로 사용할 수 있고, 동시에 여러 빌드를 처리할 때도 필요한 만큼 에이전트를 늘릴 수 있죠.
    • 높은 가용성 (High Availability): Kubernetes는 컨테이너화된 애플리케이션의 고가용성을 보장합니다. Jenkins Master(젠킨스 마스터) Pod가 문제가 생겨도 Kubernetes가 자동으로 다른 노드에 재시작해주니, 서비스 중단 시간을 최소화할 수 있습니다.
    • 환경 일관성 (Environment Consistency): 모든 빌드가 컨테이너 안에서 이뤄지므로, 개발 환경과 동일한 환경에서 빌드 및 테스트를 진행할 수 있어서 “내 로컬에서는 되는데 서버에서는 안 돼요!” 하는 문제를 줄일 수 있습니다.

    이런 장점들 덕분에 저도 Kubernetes 환경으로 Jenkins를 옮기기로 결정했었죠. 하지만 현실은 녹록지 않았습니다. 😅

    실전 구현: Jenkins Kubernetes 플러그인과 Pod Template

    Kubernetes에서 Jenkins를 운영하려면 Jenkins Kubernetes Plugin(젠킨스 쿠버네티스 플러그인)이 필수인데요. 이 플러그인이 Jenkins Master와 Kubernetes 클러스터 간의 통신을 담당하면서 동적으로 에이전트 Pod를 생성하고 관리하는 핵심 역할을 수행합니다. 플러그인 설치 후, 가장 중요한 설정은 Pod Template(파드 템플릿)입니다.

    Pod Template은 Jenkins Agent Pod가 어떤 이미지로, 어떤 리소스를 가지고 생성될지 정의하는 YAML 설정이거든요. 처음에는 기본 설정으로 시작했지만, 곧바로 성능 병목에 부딪혔습니다. 다음은 제가 주로 사용했던 Pod Template의 핵심 부분입니다.

    apiVersion: v1
    kind: Pod
    spec:
      containers:
      - name: jnlp
        image: jenkins/inbound-agent:4.11.2-1-jdk11
        resources:
          requests:
            cpu: "500m"
            memory: "1Gi"
          limits:
            cpu: "1"
            memory: "2Gi"
        # ... (생략) ...
      - name: build-tools
        image: my-private-registry/custom-build-image:latest
        command: ["cat"]
        tty: true
        resources:
          requests:
            cpu: "1"
            memory: "2Gi"
          limits:
            cpu: "2"
            memory: "4Gi"
        # ... (생략) ...
      volumes:
      - name: jenkins-workspace
        emptyDir: {}
      # ... (생략) ...
    

    여기서 `jnlp` 컨테이너는 Jenkins와 통신하는 기본 에이전트고, `build-tools`는 실제 빌드 도구들이 들어간 커스텀 이미지더라고요. 여기서 중요한 부분은 바로 resources 섹션입니다. 처음에는 이 부분을 대충 설정했다가 빌드 에이전트들이 자꾸 죽는 현상을 겪었어요. ⚠️

    Jenkins UI Kubernetes 플러그인 설정 화면: Pod Template 구성 예시

    Jenkins UI 내 Kubernetes 플러그인 설정 화면: Pod Template 구성 예시

    ⚠️ 1년 운영하며 겪은 삽질과 성능 최적화/안정화 사례

    자, 이제 본론입니다. 1년 동안 겪었던 문제들과 그 해결책들을 공유해 드릴게요.

    1. 빌드 에이전트 OOMKilled (메모리 부족) 현상

    가장 흔하게 겪었던 문제입니다. 빌드 도중에 에이전트 Pod가 갑자기 OOMKilled(Out Of Memory Killed, 메모리 부족으로 종료됨) 상태가 되면서 빌드가 실패하는 거죠. 처음엔 원인을 몰라 헤맸는데, 알고 보니 Pod Template의 resources.limits.memory 설정이 너무 낮았던 것이었습니다.

    • 문제점: 빌드 프로세스가 예상보다 많은 메모리를 사용하면서 Kubernetes가 Pod를 강제로 종료시킴.
    • 해결책: resources.requests와 resources.limits를 현실적으로 설정하는 것이 중요합니다. requests는 Pod가 스케줄링될 때 필요한 최소한의 리소스, limits는 Pod가 최대로 사용할 수 있는 리소스예요. 처음에 빌드를 여러 번 돌려보면서 실제로 필요한 메모리 양을 측정했습니다. 빌드 과정에서 peak 메모리 사용량을 모니터링해서 넉넉하게 잡아주는 게 중요하더라고요.
        resources:
          requests:
            cpu: "1"
            memory: "2Gi" # 최소 2GB 요청
          limits:
            cpu: "2"
            memory: "4Gi" # 최대 4GB까지 사용 허용
    

    💡 팁: requests는 Kubernetes 스케줄러가 노드를 선택하는 기준이 되고, limits는 CGroup(컨트롤 그룹)에 의해 Pod의 최대 리소스 사용량을 제한합니다. 너무 타이트하면 OOMKilled 되고, 너무 넉넉하면 리소스 낭비가 될 수 있으니 적절한 튜닝이 필요합니다.

    2. 느린 이미지 풀링 (Image Pull) 시간

    동적 에이전트의 가장 큰 장점 중 하나지만, 매번 빌드 에이전트 Pod가 생성될 때마다 필요한 Docker Image(도커 이미지)를 다운로드(Pull)해야 한다는 단점도 있습니다. 특히 빌드 에이전트 이미지가 크거나, 여러 개의 이미지를 사용하는 경우 빌드 시작 시간이 너무 길어지는 문제가 발생했습니다.

    • 문제점: 빌드 시작 시 Docker Image Pull 시간 때문에 전체 빌드 시간이 길어짐.
    • 해결책:
      1. 로컬 Docker Registry(도커 레지스트리) 사용: 사설 Docker Registry를 클러스터 내부에 구축하고, 이미지를 미리 이곳에 캐싱해두면 Pull 속도가 훨씬 빨라집니다.
      2. Node에 Image Pre-pulling: Kubernetes Worker Node(워커 노드)에 DaemonSet(데몬셋)을 이용해서 자주 사용하는 에이전트 이미지를 미리 Pull 해두는 방법도 효과적이었습니다. 이렇게 하면 Pod가 스케줄링될 때 이미지가 이미 로컬에 있어 바로 실행될 수 있죠.
      3. Jenkins Agent 이미지 최적화: 빌드에 필요한 최소한의 도구만 포함된 경량 이미지를 만들었습니다. 불필요한 레이어를 줄이고, 베이스 이미지를 최신으로 유지하는 것도 중요하더라고요.

    3. Jenkins Master의 안정성 확보

    아무리 에이전트가 잘 돌아가도 Master가 불안정하면 모든 CI/CD 파이프라인이 멈춥니다. Master Pod의 잦은 재시작이나 데이터 손실은 정말 끔찍하죠.

    • 문제점: Master Pod의 리소스 부족, 데이터 손실 위험.
    • 해결책:
      1. Persistent Volume Claim (PVC) 사용: Jenkins Master의 /var/jenkins_home 디렉터리는 빌드 설정, 플러그인, 빌드 이력 등 중요한 데이터가 저장되는 곳이거든요. 반드시 Persistent Volume Claim(PVC, 영구 볼륨 클레임)을 사용하여 데이터를 영구적으로 저장해야 합니다. 저는 NFS(네트워크 파일 시스템) 기반의 PV(영구 볼륨)를 사용했는데, 클라우드 환경에서는 EBS, Azure Disk, GCE Persistent Disk 등을 활용할 수 있습니다.
      2. Master Pod 리소스 충분히 할당: Master Pod도 적절한 CPU와 Memory를 할당해야 합니다. 너무 적으면 UI가 느려지거나, 플러그인 로딩 중 OOMKilled 될 수 있습니다.
      3. Configuration as Code (CasC) 도입: Jenkins 설정을 YAML 파일로 관리하는 CasC(Configuration as Code)는 Master의 안정성을 높이는 데 크게 기여했습니다. 설정을 Git에 버전 관리하고, Jenkins 재시작 시 자동으로 적용되도록 하여 휴먼 에러를 줄이고 재현 가능한 환경을 구축할 수 있었습니다.
    최적화 전후 Jenkins 빌드 시간 및 Kubernetes 리소스 사용량 비교 Grafana 대시보드

    최적화 후 빌드 시간 단축 및 리소스 사용량 안정화 결과

    4. 네트워크 성능 문제 (대용량 아티팩트 전송)

    빌드 결과물(Artifacts, 아티팩트)이 크거나, 빌드 과정에서 외부 리소스(Maven Repository 등)를 자주 다운로드받는 경우 네트워크 병목이 발생할 수 있습니다.

    • 문제점: 대용량 아티팩트 전송 및 외부 리소스 다운로드로 인한 빌드 지연.
    • 해결책:
      1. 클러스터 내부 캐싱 프록시: Maven, npm 등의 패키지 매니저를 위한 캐싱 프록시(예: Sonatype Nexus, Artifactory)를 클러스터 내부에 구축하여 외부 네트워크 트래픽을 줄였습니다.
      2. 빠른 스토리지 사용: PVC에 사용하는 스토리지가 느리면 빌드 과정에서 파일 I/O(입출력) 성능 저하가 발생합니다. 가능한 한 SSD 기반의 고성능 스토리지를 사용하는 것이 좋습니다.
      3. 불필요한 아티팩트 최소화: 빌드 후 Jenkins에 저장하거나 전송하는 아티팩트의 크기를 최소화하도록 파이프라인을 최적화했습니다.

    검증 및 결과: 드디어 안정화! 🎉

    위에 언급된 최적화들을 적용하고 나니, 거짓말처럼 Jenkins 환경이 안정화되기 시작했습니다. 빌드 실패율은 현저히 줄었고, 빌드 시간도 평균 30% 이상 단축되는 성과를 얻을 수 있었습니다. 특히 동적 에이전트의 효율적인 리소스 사용 덕분에 클러스터 비용도 절감할 수 있었죠.

    • 빌드 성공률: 60% → 95% 이상으로 향상
    • 평균 빌드 시간: 5분 → 3분 내외로 단축 (프로젝트별 상이)
    • 리소스 사용 효율: 유휴 에이전트 감소로 클러스터 리소스 활용률 증가

    이러한 개선 사항들은 Prometheus(프로메테우스)와 Grafana(그라파나)를 통해 모니터링하면서 실시간으로 확인했습니다. 특히 빌드 성공/실패율, 큐(Queue)에 대기 중인 빌드 수, 에이전트 Pod의 리소스 사용량 등을 꾸준히 트래킹하면서 추가적인 개선점을 찾아나갔습니다. 📈

    Kubernetes Jenkins 운영 최적화 주요 포인트 요약 인포그래픽

    Kubernetes Jenkins 운영 최적화 주요 포인트 요약 인포그래픽

    마무리: 멘토로서의 조언과 다음 단계

    Kubernetes 환경에서 Jenkins를 운영하는 것은 분명 도전적인 일입니다. 처음에는 “이거 왜 이렇게 어렵지?” 싶다가도, 하나하나 문제를 해결해나가면서 시스템이 안정화되는 모습을 보면 정말 뿌듯하더라고요. 제가 13년 동안 인프라 엔지니어로 일하면서 느낀 건, 삽질은 결국 성장의 밑거름이 된다는 겁니다.

    이 글에서 다룬 내용들이 여러분의 Kubernetes Jenkins 운영에 조금이나마 도움이 되었으면 좋겠습니다. 혹시 더 깊은 질문이나 다른 경험담이 있다면 언제든지 댓글로 남겨주세요! 저도 처음엔 헷갈렸던 부분이 많았거든요.

    다음 단계로는 GitOps(깃옵스) 철학을 기반으로 Argo CD(아르고 CD) 같은 도구를 Jenkins와 연동하여 배포 파이프라인을 더욱 자동화하고 고도화하는 방안을 고민하고 있습니다. CI/CD 여정은 끝이 없는 것 같아요. 계속해서 배우고 실험하며 더 나은 방법을 찾아나가야겠죠? 😊

  • [3D Printer] Bambu Lab AMS 활용 멀티 컬러 3D 프린팅: 실제 프로젝트 성공 사례와 노하우

    [3D Printer] Bambu Lab AMS 활용 멀티 컬러 3D 프린팅: 실제 프로젝트 성공 사례와 노하우

    Bambu Lab AMS 활용 멀티 컬러 3D 프린팅: 실제 프로젝트 성공 사례와 노하우

    안녕하세요, 13년차 서버실 지킴이 ’13년차의 서버실’입니다. 오늘은 제가 요즘 푹 빠져 있는 3D 프린팅, 그중에서도 Bambu Lab AMS(Automatic Material System)를 활용한 멀티 컬러 프린팅 경험담을 풀어볼까 합니다. 예전에는 멀티 컬러 3D 프린팅이라고 하면 정말 ‘삽질의 연속’이었거든요. 필라멘트가 꼬이고, 색상 전환하다가 프린터가 멈추고, 겨우 출력해도 색깔이 섞여서 지저분해지기 일쑤였죠. 그런데 Bambu Lab AMS를 만나고 나서 이런 고민들이 싹 사라졌습니다. 마치 서버실에 새로운 자동화 솔루션을 도입한 것 같은 혁신적인 경험이었달까요?

    저처럼 홈랩을 운영하면서 다양한 장비들을 직접 만져보고 실험하는 걸 즐기는 분들이라면, 아마 멀티 컬러 3D 프린팅에 대한 로망이 한 번쯤 있었을 겁니다. 이번 글에서는 제가 Bambu Lab AMS를 이용해 실제 프로젝트를 성공적으로 진행했던 사례와 함께, 이 과정에서 얻은 소중한 노하우와 AMS 팁들을 아낌없이 공유해 드릴게요. 혹시 멀티 컬러 3D 프린팅에 도전해보고 싶었지만 여러 어려움 때문에 망설였던 분들이라면, 오늘 제 이야기가 큰 도움이 될 겁니다!

    Bambu Lab AMS와 3D 프린터가 연결된 멀티 컬러 3D 프린팅 시스템 개요도

    Bambu Lab AMS와 3D 프린터가 유기적으로 연결되어 필라멘트를 자동으로 공급하는 시스템 개요도

    Bambu Lab AMS, 그게 뭔가요? MMU 프린터와 뭐가 다른가요?

    Bambu Lab AMS는 Bambu Lab 3D 프린터에 장착되어 최대 4개의 필라멘트를 동시에 관리하고 자동으로 전환해주는 장치입니다. 쉽게 말해, 3D 프린터가 여러 가지 색상이나 재질의 필라멘트를 알아서 바꿔가며 출력할 수 있도록 도와주는 시스템인 거죠. 기존에도 MMU(Multi-Material Unit) 3D 프린터라는 개념이 있었지만, Bambu Lab AMS는 차원이 다른 사용자 경험을 제공합니다.

    제가 처음 AMS를 써보고 느낀 건 ‘이거 진짜 물건이구나!’였습니다. 기존 MMU들은 설정도 복잡하고 필라멘트 걸림 같은 트러블이 잦아서 인내심의 한계를 시험하곤 했거든요. 그런데 AMS는 플러그 앤 플레이에 가깝게 작동하더라고요. RFID 태그를 통해 필라멘트 종류와 색상을 자동으로 인식하고, 심지어 내부 습기까지 제어해줘서 필라멘트 보관까지 한 번에 해결해줍니다. 기존 MMU와 AMS를 비교해 보면 그 차이가 명확해집니다.

    구분 Bambu Lab AMS 일반적인 MMU(Multi-Material Unit)
    필라멘트 로딩 자동화 (RFID 인식, 습기 제어) 수동 또는 반자동 (별도 설정 필요)
    필라멘트 종류 호환성 다양한 필라멘트 (PLA, PETG, ABS, ASA 등) 제한적 (경성 필라멘트 위주, 유연성 필라멘트 어려움)
    사용 편의성 매우 높음 (플러그 앤 플레이에 가까움) 높은 학습 곡선, 잦은 트러블슈팅 필요
    색상 전환 속도 빠름 상대적으로 느림
    주요 특징 습기 제어, 필라멘트 자동 감지, 통합 솔루션 다양한 DIY 키트 존재, 커스터마이징 가능

    실전 구현: Bambu Studio와 함께하는 멀티 컬러 프린팅

    이제 제가 실제로 진행했던 프로젝트를 예로 들어, Bambu Studio를 활용하여 멀티 컬러 프린팅을 하는 과정을 자세히 설명해 드릴게요. 제가 진행했던 프로젝트는 회사 로고가 새겨진 멀티 컬러 명함 케이스였습니다. 로고는 두 가지 색상, 케이스 본체는 한 가지 색상으로 총 세 가지 필라멘트가 필요했죠.

    1. 모델 준비 및 Bambu Studio 불러오기

    1. 먼저, 원하는 3D 모델(STL, 3MF 등)을 준비합니다. 저는 Fusion 360으로 명함 케이스와 로고를 모델링했습니다.
    2. Bambu Studio를 실행하고, 준비된 3D 모델 파일을 불러옵니다. 만약 여러 파트로 구성된 모델이라면, ‘Merge models’ 기능을 사용하여 하나의 개체로 합쳐주는 것이 좋습니다.

    2. AMS 필라멘트 할당 및 색상 지정

    1. AMS에 사용할 필라멘트를 장착합니다. 저는 PLA 화이트, PLA 블랙, PLA 레드를 사용했어요. AMS는 필라멘트를 자동으로 인식하고 각 슬롯에 할당합니다.
    2. Bambu Studio 좌측 상단의 ‘Objects’ 탭에서 모델을 선택합니다.
    3. 이제 모델의 각 파트 또는 특정 영역에 색상을 지정할 차례입니다.
      • ‘Color painting’ 도구를 선택하여 브러시 크기를 조절하고 원하는 부분에 직접 색을 칠할 수 있습니다. 저는 로고 부분에 블랙과 레드를, 케이스 본체에 화이트를 칠했습니다.
      • 만약 모델이 여러 개의 개별 파트로 구성되어 있다면, 각 파트를 선택하고 우측 상단의 ‘Filament’ 드롭다운 메뉴에서 AMS에 할당된 필라멘트 색상을 직접 지정해 줄 수도 있습니다.
    Bambu Studio에서 멀티 컬러 3D 모델에 Bambu Lab AMS 필라멘트를 할당하는 화면

    Bambu Studio에서 3D 모델을 불러와 각 파트에 AMS의 필라멘트 색상을 할당하는 과정

    3. 슬라이싱 및 프린트

    1. 모든 색상 할당이 완료되면, ‘Slice Plate’ 버튼을 눌러 모델을 슬라이싱합니다. 이 과정에서 Bambu Studio는 각 색상 전환에 필요한 G-code를 자동으로 생성합니다.
    2. 슬라이싱이 끝나면 미리보기 화면에서 색상 전환이 제대로 반영되었는지 확인합니다. 특히 Prime Tower(프라임 타워)가 생성되어 있는지, 그리고 Purge Volumes(퍼지 볼륨) 설정이 적절한지 확인하는 것이 중요합니다.
    3. 모든 설정이 만족스럽다면, ‘Print’ 버튼을 눌러 프린팅을 시작합니다. Bambu Lab 프린터와 AMS가 알아서 필라멘트를 전환하며 멀티 컬러 출력을 진행할 겁니다.

    ⚠️ 삽질 경험담: 저도 처음엔 헤맸습니다!

    Bambu Lab AMS가 정말 편리하긴 하지만, 저도 처음부터 완벽하게 사용했던 건 아닙니다. 몇 번의 시행착오를 통해 얻은 뼈아픈 교훈과 해결 노하우를 공유합니다.

    1. 필라멘트 걸림 문제와 해결

    처음에는 AMS가 필라멘트를 제대로 로딩하지 못해서 “Failed to pull filament” 에러를 자주 만났어요. 이게 뭔가 싶었죠. 알고 보니 몇 가지 원인이 있었습니다.

    • 노즐 막힘 (Clogging): 가장 흔한 원인 중 하나입니다. 특히 색상 전환 시 잔여 필라멘트가 노즐에 남아서 문제가 생기더라고요.
    • Hotend (핫엔드) 문제: 핫엔드 내부 PTFE 튜브나 히트싱크에 문제가 생기면 필라멘트가 제대로 통과하지 못합니다.
    • AMS 내부 문제: AMS 유닛 자체의 필라멘트 경로에 이물질이 있거나, 스풀이 잘 안 돌아가는 경우도 있었어요.

    해결 방법은 다음과 같았습니다.

    1. Hotend 분해 청소 또는 교체: Bambu Lab X1C나 P1S 같은 프린터들은 핫엔드 교체가 비교적 쉬운 편입니다. 저는 예비 핫엔드를 가지고 있어서 문제가 생길 때마다 교체하고, 나중에 여유 있을 때 막힌 핫엔드를 분해해서 청소하곤 했어요. 콜드 풀 (Cold Pull)도 효과적인 방법입니다.
    2. AMS 내부 점검: AMS 유닛을 열어 필라멘트 경로에 이물질이 없는지 확인하고, 필라멘트 버퍼나 튜브가 꼬이지 않았는지 체크했습니다.
    3. 필라멘트 끝 정리: 필라멘트를 AMS에 넣을 때 끝부분을 뾰족하게 잘라주면 로딩이 훨씬 부드러워집니다.

    이런 시행착오를 거치면서 3D 프린터의 구조와 필라멘트 흐름에 대해 더 깊이 이해하게 되더라고요. 역시 직접 뜯어보고 고쳐봐야 배우는 게 많습니다. ㅎㅎ

    2. 색상 전환 시 불필요한 필라멘트 낭비 줄이기

    멀티 컬러 프린팅의 가장 큰 단점 중 하나가 바로 필라멘트 낭비 (Filament Waste)입니다. 색상이 바뀔 때마다 노즐 안에 남아있는 이전 색상을 purging(퍼징, 제거)하고 새 색상으로 채워야 하거든요. 이걸 안 하면 색상이 섞여서 지저분해집니다. Bambu Studio에서 이 부분을 최적화하는 팁을 알려드릴게요.

    • Purge Volume (퍼지 볼륨) 조절: Bambu Studio의 Process 설정에 들어가면 ‘Others’ 탭에 ‘Prime tower’와 ‘Purge volumes’ 설정이 있습니다. 여기서 각 색상 전환 시 버릴 필라멘트 양을 조절할 수 있습니다. 너무 적으면 색상이 섞이고, 너무 많으면 낭비가 심해지죠. 저는 여러 번 테스트를 거쳐 최적의 값을 찾았어요.
    • Prime Tower (프라임 타워) 활용: 모델 옆에 작은 기둥을 만들어서 여기에 퍼징을 하는 방식입니다. 모델에 직접 퍼징하는 것보다 훨씬 깔끔하고, 모델 손상을 방지할 수 있습니다.
    • Infill (내부 채움)에 퍼징: 모델의 내부 채움 부분에 이전 색상 필라멘트를 일부 퍼징하도록 설정할 수 있습니다. 눈에 보이지 않는 부분이라 필라멘트 낭비를 줄이는 데 효과적입니다.

    이런 설정들을 잘 활용하면 생각보다 필라멘트 낭비를 많이 줄일 수 있습니다. 처음엔 무작정 기본값으로 출력했는데, 나중에 알고 보니 엄청난 양의 필라멘트가 버려지고 있더라고요. 💡

    3. Bambu Studio 설정 최적화

    Bambu Studio는 정말 강력한 슬라이서(Slicer) 프로그램입니다. AMS와 연동되어 멀티 컬러 프린팅을 아주 쉽게 만들어주죠. 몇 가지 팁을 드릴게요.

    • 필라멘트 프로파일 관리: 사용하는 필라멘트 종류(PLA, PETG 등)와 색상별로 프로파일을 만들어두면 편리합니다. 특히 타사 필라멘트를 사용할 때는 온도, 리트랙션(Retraction) 거리 등을 세밀하게 조절해야 합니다.
    • 색상 할당: 모델을 불러온 후, 좌측 상단의 ‘Objects’ 탭에서 각 파트(Part)에 원하는 색상을 지정할 수 있습니다. 저는 주로 ‘Paint’ 도구를 사용해서 특정 면이나 영역에 색을 칠하는 방식으로 작업했습니다.
    • 서포트 재질 설정: AMS에 PVA 같은 수용성 서포트 필라멘트를 연결해두면, 복잡한 형상의 모델도 쉽게 출력하고 나중에 서포트 제거 스트레스 없이 완성할 수 있습니다.

    실제로 저는 아래처럼 필라멘트 설정과 AMS 슬롯 할당을 정리해두고 프로젝트마다 참고했어요. 특히 여러 필라멘트를 섞어 쓸 때 이렇게 문서화해두면 다음번 프로젝트할 때 시간을 정말 많이 절약할 수 있습니다.

    
    {
      "filament_settings": {
        "PLA_Generic": {
          "nozzle_temp": 220,
          "bed_temp": 60,
          "retraction_distance": 0.8,
          "retraction_speed": 40,
          "flow_ratio": 0.98
        },
        "PETG_Generic": {
          "nozzle_temp": 245,
          "bed_temp": 70,
          "retraction_distance": 1.0,
          "retraction_speed": 50,
          "flow_ratio": 1.0
        }
      },
      "ams_slot_assignment": {
        "slot_1": "PLA_White",
        "slot_2": "PLA_Black",
        "slot_3": "PETG_Red",
        "slot_4": "PVA_Support"
      }
    }
    

    Bambu Studio 필라멘트 및 AMS 슬롯 설정 예시 (JSON 포맷)

    🎉 검증 및 결과: 드디어 성공!

    위에서 설명드린 여러 AMS 팁과 시행착오를 바탕으로 설정을 최적화한 결과, 드디어 완벽한 멀티 컬러 명함 케이스를 출력할 수 있었습니다! 로고의 섬세한 색상 분리가 정말 깔끔하게 나와서 깜짝 놀랐어요. 예전 같으면 상상도 못할 퀄리티였죠. 특히 제가 원하는 색상 조합으로 프린팅이 가능해지니, 3D 프린팅 활용 범위가 훨씬 넓어졌다는 걸 실감했습니다.

    이번 프로젝트 성공을 통해 Bambu Lab AMS가 단순한 액세서리가 아니라, 멀티 컬러 3D 프린팅의 진입 장벽을 혁신적으로 낮춰주는 핵심 솔루션이라는 것을 다시 한번 깨달았습니다. 덕분에 제 홈랩의 3D 프린터는 이제 단순한 장비가 아니라, 아이디어를 현실로 만들어주는 강력한 도구가 되었습니다.

    Bambu Lab AMS로 성공적으로 출력된 선명한 멀티 컬러 3D 프린팅 결과물

    Bambu Lab AMS를 활용하여 성공적으로 출력된 멀티 컬러 명함 케이스의 상세 모습

    💡 AMS 팁: 효율적인 사용을 위한 추가 노하우

    Bambu Lab AMS를 더욱 효율적으로 사용하기 위한 몇 가지 팁을 추가로 알려드릴게요.

    • 필라멘트 보관: AMS는 습기 제어 기능이 있지만, 장기간 사용하지 않을 필라멘트는 별도의 밀폐 용기나 건조기에 보관하는 것이 좋습니다. 특히 수분을 잘 흡수하는 나일론(Nylon)이나 PVA 같은 필라멘트는 더욱 신경 써야 합니다.
    • 스풀 어댑터 활용: Bambu Lab 정품 필라멘트 스풀이 아닌 경우, AMS 내부에서 필라멘트가 걸릴 수 있습니다. 이럴 때는 3D 프린팅으로 출력할 수 있는 스풀 어댑터(Spool Adapter)를 사용하면 문제를 해결할 수 있습니다.
    • 펌웨어 업데이트: Bambu Lab은 꾸준히 펌웨어 업데이트를 통해 AMS와 프린터의 성능을 개선하고 있습니다. 항상 최신 펌웨어를 유지하여 최상의 성능을 경험하세요.
    • 예비 부품 준비: 프린팅량이 많다면, PTFE 튜브나 핫엔드 같은 소모품들을 예비로 가지고 있는 것이 좋습니다. 문제가 발생했을 때 빠르게 교체하고 다시 프린팅을 시작할 수 있죠.

    마무리하며: 멀티 컬러 3D 프린팅의 새로운 지평

    Bambu Lab AMS는 저에게 멀티 컬러 프린팅의 새로운 지평을 열어주었습니다. 과거의 MMU 방식이 가진 번거로움과 높은 실패율 때문에 엄두를 내지 못했던 다양한 아이디어들을 이제는 쉽게 현실로 만들 수 있게 되었죠. 13년차 인프라 엔지니어로서 늘 효율과 자동화를 추구해왔는데, AMS는 바로 그런 제 가치관에 딱 맞는 장비였습니다.

    이번 글에서 제가 공유해 드린 Bambu Lab AMS 활용법과 AMS 팁들이 여러분의 3D 프린팅 라이프에 작은 도움이 되었기를 바랍니다. 혹시 더 궁금한 점이나 여러분만의 노하우가 있다면 댓글로 공유해 주세요. 다음번에는 홈랩에서 진행하고 있는 또 다른 재미있는 프로젝트에 대해 이야기해 드릴게요. 그때까지 즐거운 프린팅 생활 되시길 바랍니다! 🎉

    Bambu Lab AMS의 주요 장점과 효율적인 사용 팁을 정리한 인포그래픽

    Bambu Lab AMS의 핵심 장점과 활용 팁을 한눈에 볼 수 있는 요약 인포그래픽

  • [HomeLabs] Home Assistant Matter 연동 실전 사례: 스마트홈 기기 통합 성공과 실패

    [HomeLabs] Home Assistant Matter 연동 실전 사례: 스마트홈 기기 통합 성공과 실패

    드디어 스마트홈 기기 통합의 꿈이? Matter 연동 도전기

    안녕하세요, 13년차의 서버실 주인장입니다. 여러분, 스마트홈 구축하시면서 이런 경험 없으신가요? “어떤 기기는 구글 홈에, 어떤 기기는 애플 홈킷에, 또 다른 기기는 제조사 앱에…” 이 모든 걸 하나로 묶어보고 싶다는 갈증, 저만 느낀 건 아닐 겁니다. 저도 홈랩을 운영하면서 수많은 스마트 기기들을 들여놨는데, 이 파편화된 생태계 때문에 스트레스가 이만저만이 아니었거든요.

    그러던 와중에 Home Assistant와 Matter라는 스마트홈 통합 솔루션이 등장했을 때, 저는 ‘드디어 올 것이 왔다!’ 하고 무릎을 탁 쳤습니다. 제조사에 상관없이 모든 기기가 하나의 프로토콜로 연동된다니, 얼마나 꿈같은 이야기입니까? 그래서 제가 직접 Home Assistant에 Matter를 연동해보는 실전 삽질(?)을 감행했습니다. 과연 제 스마트홈은 이 Matter 덕분에 진정한 통합을 이뤘을까요? 아니면 또 다른 좌절을 맛봤을까요? 제 경험을 솔직하게 공유해 드릴게요. 💡

    Home Assistant와 Matter 프로토콜로 통합된 스마트홈 기기 개념도

    Home Assistant와 다양한 스마트홈 기기들이 Matter 프로토콜로 연결되어 통합되는 개념도입니다.

    Matter, 과연 무엇이길래 이렇게 기대를 받을까요?

    Matter(매터)는 CSA(Connectivity Standards Alliance)에서 개발한 오픈소스 스마트홈 표준입니다. 쉽게 말해, 삼성, 애플, 구글, 아마존 등 쟁쟁한 IT 기업들이 “야, 우리 이제 스마트홈 기기 만들 때 서로 호환되게 만들자!” 하고 약속한 공통 언어 같은 거라고 보시면 됩니다. 이전에는 각 제조사마다 독자적인 프로토콜과 앱을 써야 해서 기기를 살 때마다 ‘이게 내 허브랑 연동될까?’ 걱정해야 했잖아요? Matter는 이런 벽을 허물어 버리겠다는 거죠.

    Matter의 가장 큰 장점은 다음과 같습니다.

    • 상호 운용성(Interoperability): 어떤 제조사의 기기든 Matter를 지원하면 다른 Matter 컨트롤러(Controller)나 앱과 연동됩니다.
    • 로컬 제어(Local Control): 대부분의 통신이 인터넷을 거치지 않고 로컬 네트워크(Local Network) 내에서 이뤄져서 응답 속도가 빠르고, 인터넷이 끊겨도 기본적인 제어가 가능합니다.
    • 보안성(Security): 최신 암호화 기술을 적용해서 보안에 신경 썼다고 합니다.
    • 설치 용이성(Ease of Setup): QR 코드 스캔 한 번으로 쉽게 기기를 추가할 수 있도록 설계되었습니다.

    Matter는 Wi-Fi, Ethernet(이더넷), 그리고 Thread(스레드)라는 저전력 메시 네트워크(Mesh Network)를 기반으로 작동합니다. 특히 Thread는 저전력 기기들이 서로 연결되어 망을 구성하고, Thread Border Router(스레드 보더 라우터)를 통해 Wi-Fi/Ethernet 네트워크와 연결되는 방식이라 안정성과 효율성이 뛰어나다고 평가받고 있어요.

    Home Assistant에 Matter 컨트롤러 설정하고 기기 붙이기

    자, 이제 이론은 충분히 알았으니 실전에 돌입해야죠. 저는 Home Assistant OS가 설치된 Raspberry Pi에 Home Assistant SkyConnect(스카이커넥트) 동글을 물려서 Matter 컨트롤러를 구성했습니다. SkyConnect는 Zigbee(지그비)와 Thread를 동시에 지원하는 아주 유용한 녀석이거든요. 💡

    1. Home Assistant Matter Add-on 설치: Home Assistant UI에서 ‘설정 > 애드온 > 애드온 스토어’로 이동해서 ‘Matter Server’ 애드온을 검색하고 설치했습니다. 설치 후에는 시작(Start) 버튼을 눌러야 해요.
    2. Matter Controller 통합 구성: ‘설정 > 기기 및 서비스 > 통합’으로 가서 우측 하단의 ‘통합 추가’ 버튼을 누르고 ‘Matter’를 검색했습니다. ‘Matter Controller’를 선택하면, 방금 설치한 Matter Server 애드온을 컨트롤러로 사용할지 물어봅니다. 당연히 ‘예’를 선택했죠.
    3. Thread Border Router 설정 확인: SkyConnect를 사용한다면 자동으로 Thread Border Router 역할을 수행합니다. 하지만 다른 기기(예: Apple HomePod mini, Google Nest Hub)가 이미 Thread Border Router 역할을 하고 있다면, Home Assistant의 Thread 네트워크와 충돌하지 않도록 설정이 필요할 수 있습니다. 저는 SkyConnect가 유일한 Border Router였기 때문에 이 부분은 크게 신경 쓰지 않았어요. 혹시 여러 Border Router를 사용하신다면 OTBR(OpenThread Border Router) 설정에 대한 문서를 찾아보시는 게 좋습니다.
    4. Matter 기기 페어링: 이제 Matter를 지원하는 기기(저는 Philips Hue의 일부 전구와 Aqara의 센서들을 시도했습니다)를 준비하고, 전원을 켜서 페어링 모드로 진입시킵니다. 보통 기기 리셋 버튼을 길게 누르거나, 전원을 껐다 켜는 방식으로 페어링 모드에 들어갑니다. Home Assistant UI에서 ‘통합 > Matter > 기기 추가’를 선택한 후, 기기 하단의 QR 코드를 스캔하거나 수동으로 페어링 코드를 입력하면 됩니다.

    이 과정에서 간혹 Home Assistant CLI(명령줄 인터페이스)에서 시스템 상태를 확인해야 할 때가 있습니다. 예를 들어, Matter 애드온이 제대로 실행되고 있는지 확인하거나, 스레드 네트워크 인터페이스를 확인하는 거죠.

    ha supervisor info
    ha addons info core_matter_server
    
    Home Assistant Matter 애드온 설정 및 기기 페어링 화면

    Home Assistant Matter 애드온 설정 화면과 Matter 기기 페어링 과정 스크린샷입니다.

    ⚠️ 삽질의 연속: Matter 연동, 생각보다 쉽지 않았습니다

    자, 여기까지 들으면 ‘어? 생각보다 쉬운데?’ 하실 수도 있습니다. 하지만 13년차 인프라 엔지니어인 제가 ‘삽질 좀 했습니다 ㅎㅎ’라고 표현하는 데는 다 이유가 있습니다. 처음 Matter를 연동할 때는 정말이지 험난한 과정이었어요.

    1. Thread 네트워크 문제

    가장 큰 문제는 Thread 네트워크 구성이었습니다. 저는 SkyConnect를 사용했는데, 처음에는 Thread 네트워크가 제대로 활성화되지 않거나, 기기들이 자꾸 연결이 끊기는 현상이 발생하더라고요. Home Assistant에 내장된 OTBR(OpenThread Border Router) 기능이 제대로 작동하는지 확인하는 데 꽤 시간을 썼습니다. 결국, SkyConnect 펌웨어를 최신 버전으로 업데이트하고, Home Assistant를 재부팅하고 나서야 안정적인 Thread 네트워크가 구축되더라고요. “펌웨어는 무조건 최신으로!” 이 진리는 스마트홈에서도 통했습니다.

    2. 기기 펌웨어 및 호환성

    Matter는 표준이라고 하지만, 초기에는 기기별 펌웨어 버전에 따라 연동 성공 여부가 갈렸습니다. 어떤 전구는 Matter 업데이트가 안 되어 있었고, 어떤 센서는 Matter를 지원한다고는 하는데 Home Assistant와는 찰떡궁합이 아니었죠. 결국 제조사 앱을 통해 기기 펌웨어를 최신으로 업데이트하고, 일부 기기는 아예 포기해야 하는 상황도 있었습니다. 특히 Matter 초기 기기들은 안정성이 떨어지는 경우가 많았어요.

    3. 페어링 실패 및 재연결

    QR 코드 스캔 한 번으로 쉽게 된다고 했지만, 페어링 자체가 실패하는 경우도 잦았습니다. 한 번 실패하면 기기를 공장 초기화(Factory Reset)하고 다시 시도해야 하는데, 이게 또 여간 귀찮은 일이 아니더라고요. 처음에는 이게 뭔가 싶었는데, 몇 번의 반복 끝에 ‘아, 그냥 한 번에 안 되면 초기화하고 다시 하는 게 빠르겠구나’ 하는 깨달음을 얻었습니다. 😅

    드디어 성공! 통합된 스마트홈 대시보드 확인

    수많은 삽질 끝에, 드디어 제 스마트홈에 Matter 기기들이 하나둘씩 Home Assistant에 나타나기 시작했습니다! 🥳 처음에는 불안정했던 연결도, 펌웨어 업데이트와 몇 번의 재시도 끝에 꽤 안정적으로 동작하더라고요. Home Assistant 대시보드에서 Matter로 연동된 조명, 센서들을 한눈에 보고 제어할 수 있게 되었을 때의 그 쾌감이란!

    특히 좋았던 점은 로컬 제어가 가능하다는 점이었습니다. 인터넷이 잠시 끊겨도 조명을 켜고 끄거나, 센서 값을 확인하는 데 전혀 문제가 없었어요. 응답 속도도 빨라서 거의 실시간으로 기기를 제어하는 느낌을 받았습니다. 이게 바로 제가 꿈꾸던 스마트홈의 모습이었거든요.

    Home Assistant 대시보드에 통합된 Matter 연동 스마트 기기들

    Home Assistant 대시보드에 Matter로 연동된 여러 기기들이 통합되어 표시되는 모습입니다.

    아직은 갈 길이 먼 Matter, 하지만 가능성은 충분합니다

    Matter는 분명 스마트홈의 미래를 바꿀 강력한 표준임에는 틀림없습니다. 하지만 제가 직접 경험해본 바로는, 아직 완벽하다고 말하기는 어려운 단계입니다. 초기 제품들은 호환성이나 안정성 면에서 아쉬운 점이 많았고, 모든 기능을 Matter만으로 제어하기에는 제조사 고유의 앱이나 통합이 더 나은 경우도 있었습니다. 예를 들어, 스마트 조명의 특정 색상 모드나 애니메이션 효과는 Matter 표준에서는 지원하지 않고 제조사 앱에서만 가능한 경우가 있더라고요.

    그럼에도 불구하고, 하나의 표준으로 여러 제조사의 기기를 통합할 수 있다는 점은 엄청난 강점입니다. 특히 Home Assistant처럼 개방형 플랫폼을 선호하는 저에게는 Matter가 주는 자유로움이 너무나 매력적이었어요. 앞으로 더 많은 제조사가 Matter를 지원하고, 표준 기능이 확장된다면 진정한 스마트홈 통합의 시대가 열릴 거라고 확신합니다.

    13년차 인프라 엔지니어의 Matter 연동 경험 요약

    Home Assistant와 Matter 연동은 기대 반, 삽질 반의 경험이었습니다. 처음에는 여러 난관에 부딪혔지만, 결국에는 성공적으로 스마트 기기들을 통합할 수 있었죠. 제가 이번 도전을 통해 얻은 교훈은 다음과 같습니다.

    • 최신 펌웨어는 필수: 기기와 컨트롤러 모두 최신 펌웨어 유지는 기본입니다.
    • Thread 네트워크 이해: 안정적인 Thread 네트워크 구성은 Matter 연동의 핵심입니다.
    • 인내심과 재시도: 한 번에 안 된다고 포기하지 말고, 초기화 후 다시 시도하는 용기가 필요합니다.
    • 로컬 제어의 장점: Matter의 로컬 제어는 스마트홈의 안정성과 속도를 크게 향상시킵니다.

    아직 Matter 생태계가 완벽하게 무르익지는 않았지만, 저는 충분히 투자할 가치가 있다고 생각합니다. 여러분도 파편화된 스마트홈 환경에 지치셨다면, Home Assistant와 Matter 연동에 도전해보시는 건 어떨까요? 분명 새로운 스마트홈 경험을 하실 수 있을 겁니다. 다음 글에서는 Matter의 보안적인 측면이나, 특정 기기 연동에 대한 더 자세한 내용을 다뤄볼 예정이니 기대해주세요! 😊

    Matter와 Home Assistant 로고가 함께 그려진 미래 스마트홈 비전 인포그래픽

    Matter 로고와 Home Assistant 로고가 함께 그려진 미래 스마트홈 비전 인포그래픽입니다.

  • [Proxmox] Proxmox LXC 컨테이너 vs VM: 홈랩 환경 최적화 비교 분석

    [Proxmox] Proxmox LXC 컨테이너 vs VM: 홈랩 환경 최적화 비교 분석

    [Proxmox] Proxmox LXC 컨테이너 vs VM: 홈랩 환경 최적화 비교 분석

    안녕하세요, 13년차의 서버실 주인장입니다. 홈랩을 운영하면서 가장 많이 고민하는 부분 중 하나가 바로 가상화 환경 최적화일 겁니다. 특히 Proxmox VE를 사용하시는 분들이라면, LXC 컨테이너 (Linux Container)를 써야 할지, 아니면 전통적인 가상머신 (VM, Virtual Machine)을 써야 할지 많이들 헷갈리실 텐데요. 저도 처음엔 Proxmox LXC 컨테이너가 뭔지 제대로 몰라서 이것저것 다 깔아보고 삽질 좀 했습니다. 😅

    이번 글에서는 제가 직접 써보고 경험했던 Proxmox LXC 컨테이너와 VM의 차이점, 장단점, 그리고 어떤 상황에서 무엇을 선택해야 할지 자세히 비교 분석해 드릴게요. 홈랩 자원을 효율적으로 사용하고 싶은 분들에게 멘토처럼 길잡이가 되어드리겠습니다!

    Proxmox VE 환경에서 LXC 컨테이너와 VM이 동작하는 방식을 시각적으로 나타낸 다이어그램입니다.

    Proxmox VE, VM, LXC 컨테이너: 기본 개념 잡기

    본격적인 비교에 앞서, 핵심 개념들을 간단하게 짚고 넘어갈게요. 이미 잘 아시는 분들도 있겠지만, 혹시나 헷갈리실 분들을 위해 쉽게 설명해 드리겠습니다.

    • Proxmox VE (Virtual Environment): 쉽게 말해 서버 한 대를 마치 여러 대의 컴퓨터처럼 쪼개서 쓸 수 있게 해주는 운영체제입니다. KVM(Kernel-based Virtual Machine)과 LXC(Linux Containers) 기술을 기반으로 Proxmox LXC 컨테이너와 가상화 환경을 통합 관리할 수 있게 도와주죠. 웹 인터페이스가 정말 편하더라고요!

    • 가상머신 (VM, Virtual Machine): 물리적인 컴퓨터 위에 완전히 독립적인 또 다른 가상 컴퓨터를 만드는 방식입니다. 운영체제(OS)부터 커널(Kernel)까지 모두 독립적으로 가집니다. 마치 서버 안에 또 다른 서버를 통째로 심는다고 생각하시면 됩니다. 오버헤드 (Overhead)가 좀 있지만, 완벽한 격리(Isolation)와 유연성을 제공합니다.

    • LXC 컨테이너 (Linux Container): VM과 달리 호스트 운영체제의 커널을 공유합니다. 운영체제를 통째로 가상화하는 것이 아니라, 애플리케이션 실행에 필요한 환경만 격리하여 제공하는 방식이죠. Proxmox LXC 컨테이너는 VM보다 훨씬 가볍고 빠르게 시작하며, 리소스 사용 효율이 뛰어나다는 장점이 있습니다. Docker 컨테이너와 비슷하지만, LXC는 좀 더 시스템 레벨의 가상화에 가깝습니다.

    LXC 컨테이너 vs VM: 핵심 차이점 비교

    이제 두 가상화 기술의 핵심 차이점을 표로 정리해서 한눈에 비교해볼까요? 제가 홈랩에서 Proxmox LXC 컨테이너와 VM을 직접 써보면서 느꼈던 점들을 바탕으로 정리해봤습니다.

    특징 LXC 컨테이너 (Linux Container) 가상머신 (VM, Virtual Machine)
    커널 공유 여부 호스트 OS 커널 공유 독립적인 커널 사용
    자원 오버헤드 매우 낮음 (경량) 상대적으로 높음 (무겁고 완전한 가상화)
    부팅 속도 매우 빠름 (초 단위) 느림 (OS 부팅 시간 필요)
    격리 수준 낮음 (호스트 커널 공유로 인한 잠재적 보안 이슈) 높음 (완전한 격리, 보안성 우수)
    운영체제 유연성 Linux 기반 OS만 가능 (호스트와 동일한 커널) Windows, macOS, Linux 등 모든 OS 가능
    스냅샷/백업 빠르고 가벼움 상대적으로 느리고 무거움
    하드웨어 패스스루 제한적 (GPU 등) 우수 (GPU, USB 등 다양한 장치)
    사용 사례 Docker 호스팅, 웹 서버, DB, 특정 서비스 (자원 효율 중시) Windows 게스트, 복잡한 네트워크, 보안 중요 서비스, GPU 활용

    실전 구현: Proxmox에서 LXC 컨테이너 만들기

    이제 실제로 Proxmox에서 LXC 컨테이너를 한번 만들어볼까요? 웹 UI에서도 쉽게 할 수 있지만, CLI (Command Line Interface)로 하는 것도 알아두면 좋습니다. 저는 개인적으로 CLI로 Proxmox LXC 컨테이너를 익숙해지는 걸 추천합니다. 자동화할 때 훨씬 편하거든요. 💡

    1. 템플릿 다운로드: LXC는 미리 만들어진 템플릿(Template)을 사용합니다. Ubuntu 22.04 LTS 템플릿을 받아볼게요.

      pveam update
      pveam available --section system
      pveam download local ubuntu-22.04-standard_22.04-1_amd64.tar.zst

      local은 저장소 이름입니다. 여러분의 Proxmox 저장소 이름에 맞게 변경해주세요.

    2. 컨테이너 생성: 이제 다운로드한 템플릿으로 Proxmox LXC 컨테이너를 생성합니다. CT ID는 고유한 번호입니다. 저는 101번으로 지정했어요.

      pct create 101 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \
        --hostname my-lxc-server \
        --rootfs local-lvm:8 \
        --memory 1024 --swap 512 \
        --cores 2 \
        --net0 name=eth0,bridge=vmbr0,ip=192.168.1.101/24,gw=192.168.1.1 \
        --unprivileged 1 --onboot 1 \
        --password your_secure_password
      • local-lvm:8: local-lvm 저장소에 8GB 디스크 할당
      • vmbr0: Proxmox 기본 브릿지 네트워크
      • --unprivileged 1: 비특권 컨테이너로 생성 (보안에 유리, 강력 추천!)
    3. 컨테이너 시작: 생성 후 바로 시작합니다.

      pct start 101
    4. 컨테이너 접속: SSH나 Proxmox 콘솔로 접속해서 설정하면 됩니다.

      ssh [email protected]

    Proxmox 웹 인터페이스에서 LXC 컨테이너가 성공적으로 생성되고 실행 중인 모습을 보여주는 화면입니다.

    실전 구현: Proxmox에서 가상머신 (VM) 만들기

    이번에는 VM을 만들어볼까요? VM은 OS 이미지 (ISO 파일)를 직접 설치해야 해서 LXC 컨테이너보다 손이 좀 더 갑니다. 그래도 그만큼 유연하죠.

    1. ISO 이미지 업로드: Ubuntu Server 22.04 LTS ISO 파일을 Proxmox ISO 저장소에 업로드합니다. 웹 UI의 데이터센터 > 저장소 > local > ISO 이미지에서 할 수 있습니다.

    2. VM 생성: CLI로도 가능하지만, VM은 웹 UI에서 생성하는 게 훨씬 직관적입니다. 생성 (Create VM) 버튼을 클릭해서 아래와 같이 설정해줍니다.

      • 일반 (General): 노드, VM ID (예: 201), 이름 (예: my-vm-server)
      • OS: 아까 업로드한 Ubuntu Server 22.04 LTS ISO 선택
      • 시스템 (System): 그래픽 카드 (기본값), SCSI 컨트롤러 (VirtIO SCSI 추천)
      • 하드 디스크 (Hard Disk): 저장소, 디스크 크기 (예: 32GB), 캐시 (Write-back 추천)
      • CPU: 코어 수 (예: 4), 소켓 수 (예: 1), 타입 (host 추천)
      • 메모리 (Memory): RAM (예: 4096MB)
      • 네트워크 (Network): 브릿지 (vmbr0), 모델 (VirtIO 추천)
    3. OS 설치: 생성된 VM을 시작하고, Proxmox 콘솔에 접속해서 일반적인 OS 설치 과정처럼 Ubuntu Server를 설치합니다. 이 과정은 일반적인 물리 서버에 OS를 설치하는 것과 동일합니다.

    ⚠️ 주의사항/트러블슈팅: 삽질 기록! (네트워크 설정, 자원 관리)

    제가 홈랩에서 가장 많이 겪었던 삽질 중 하나가 바로 네트워크 설정과 자원 관리였습니다. 특히 Proxmox LXC 컨테이너에서요.

    • LXC 컨테이너 내부 Docker 문제: 처음엔 Proxmox LXC 컨테이너 안에 Docker를 설치해서 사용하려고 했어요. 근데 이게 웬걸, systemctl start docker를 하면 자꾸 에러가 나는 겁니다. 찾아보니 비특권 컨테이너 (Unprivileged Container)에서 Docker를 제대로 사용하려면 nesting 옵션을 활성화해야 하더라고요. 아니면 cgroup v2 관련 문제일 수도 있고요. 이 부분에서 꽤 많은 시간을 보냈습니다. 해결책은 컨테이너 설정 파일(/etc/pve/lxc/101.conf)에 lxc.apparmor.profile: unconfined와 lxc.cgroup.devices.allow: a *:* rwm, 그리고 features: nesting=1을 추가하는 방법이 있었습니다. 물론 보안상 권장되는 방법은 아니니 신중하게 접근해야 합니다. ✅

      # /etc/pve/lxc/101.conf 예시
      arch: amd64
      cores: 2
      hostname: my-lxc-server
      memory: 1024
      net0: name=eth0,bridge=vmbr0,ip=192.168.1.101/24,gw=192.168.1.1,type=veth
      rootfs: local-lvm:8
      swap: 512
      mp0: /dev/sdb,mp=/mnt/data,size=10G # 추가적인 마운트 포인트 예시
      # Docker in LXC를 위한 설정 (주의해서 사용)
      features: nesting=1
      # lxc.apparmor.profile: unconfined # 비특권 컨테이너에는 보통 필요 없음. 특권 컨테이너에서 사용
      # lxc.cgroup.devices.allow: a *:* rwm # 특정 시나리오에서 필요
    • 네트워크 브릿지 오설정: Proxmox의 vmbr0 같은 네트워크 브릿지를 잘못 설정하면 외부 통신이 안 되거나, LXC 컨테이너나 VM끼리 통신이 안 되는 경우가 많습니다. 특히 홈랩에서 여러 VLAN을 사용하거나, 특정 네트워크 인터페이스를 VM에 직통으로 연결(패스스루)할 때 헷갈리곤 합니다. 항상 /etc/network/interfaces 파일을 꼼꼼히 확인하고, 변경 후에는 systemctl restart networking 또는 Proxmox 호스트 재부팅을 해줘야 합니다.

    • 자원 오버커밋 (Overcommit): Proxmox LXC 컨테이너는 자원을 유연하게 쓸 수 있어서 오버커밋하기 쉽습니다. 예를 들어, 물리 RAM이 16GB인데 LXC 컨테이너들에 총 20GB를 할당하는 식이죠. 짧게는 문제가 없지만, 모든 컨테이너가 동시에 많은 자원을 사용하면 Proxmox 호스트 전체가 느려지거나 멈출 수도 있습니다. 항상 실제 사용량을 모니터링하면서 적절히 할당하는 것이 중요합니다.

    성능 및 리소스 사용량 검증

    컨테이너와 VM을 만들었다면, 실제로 얼마나 리소스를 사용하는지 확인해봐야겠죠? 저는 주로 Proxmox 웹 UI의 그래프나 SSH로 접속해서 htop, free -h, df -h 같은 명령어로 확인합니다.

    제 경험상, 동일한 워크로드(예: 웹 서버 하나)를 Proxmox LXC 컨테이너와 VM에 올려보면, LXC 컨테이너가 훨씬 적은 RAM과 CPU를 사용하더라고요. 부팅 시간은 비교할 수 없을 정도로 LXC가 압도적이고요. 이 덕분에 저는 홈랩에서 대부분의 서비스를 LXC 컨테이너로 돌리고 있습니다. 자원 효율성 정말 최고예요! 🎉

    Proxmox VE 대시보드에서 LXC 컨테이너와 VM의 CPU 및 RAM 사용량을 비교하는 시각화된 그래프입니다.

    어떤 것을 선택해야 할까? (결론 및 제언)

    자, 그럼 이제 여러분의 홈랩 환경에 어떤 가상화 기술이 더 적합할지 정리해볼 시간입니다. 제가 13년 동안 삽질하며 내린 결론은 이렇습니다.

    • Proxmox LXC 컨테이너 (추천):

      • 자원 효율성이 최우선일 때: RAM, CPU가 제한적인 홈랩 환경에서 많은 서비스를 돌리고 싶다면 LXC 컨테이너가 정답입니다.
      • 리눅스 기반 서비스 위주: 웹 서버(Nginx, Apache), 데이터베이스(MySQL, PostgreSQL), Docker 호스팅, 파이썬 스크립트 실행 등 리눅스 기반의 애플리케이션을 돌릴 때 Proxmox LXC 컨테이너는 매우 효과적입니다.
      • 빠른 배포 및 테스트 환경: 새로운 서비스를 빠르게 띄우고 테스트하고 싶을 때 LXC 컨테이너만큼 좋은 게 없더라고요.
    • 가상머신 (VM) (추천):

      • 운영체제 유연성 필요: Windows나 다른 리눅스 배포판 (Proxmox 호스트와 다른 커널 버전)이 필요한 경우.
      • 높은 보안/격리 수준 요구: 중요 서비스나 외부와 직접 통신해야 하는 서비스처럼 완벽한 격리가 필요할 때 VM이 더 안전합니다.
      • 하드웨어 패스스루: GPU, USB 컨트롤러 등 특정 물리 하드웨어를 VM에 직접 연결해야 할 때 (예: 미디어 서버, 게임 서버).
      • 레거시 시스템: 오래된 OS나 특정 하드웨어에 의존하는 시스템을 돌려야 할 때 VM이 유일한 선택일 수 있습니다.

    제 홈랩에서는 대부분의 서비스는 Proxmox LXC 컨테이너로 돌리고, Windows나 특별한 하드웨어 패스스루가 필요한 경우에만 VM을 사용합니다. 예를 들어, 저는 Plex 미디어 서버는 VM으로 돌려서 GPU 트랜스코딩을 패스스루하고, Pi-hole이나 Home Assistant 같은 서비스는 LXC 컨테이너로 돌려서 자원을 아끼고 있습니다. 이렇게 섞어서 쓰는 게 가장 효율적이더라고요! 💡

    Proxmox 환경에서 LXC와 VM을 어떤 시나리오에서 선택하는 것이 좋은지 시각적으로 요약한 인포그래픽입니다.

    마무리: 배운 점 정리 및 다음 단계 제안

    오늘은 Proxmox VE 환경에서 LXC 컨테이너와 가상머신 (VM)을 비교 분석하고, 각각의 실전 구현 방법과 제가 겪었던 삽질 경험까지 솔직하게 공유해드렸습니다. 핵심은 각 기술의 장단점을 이해하고, 여러분의 홈랩 목적과 자원 상황에 맞춰 Proxmox LXC 컨테이너와 VM을 적절히 선택하는 것입니다.

    Proxmox LXC 컨테이너는 가볍고 빠르며 자원 효율성이 뛰어나 홈랩에 최적화된 선택지가 될 수 있습니다. 반면 VM은 높은 격리 수준과 운영체제 유연성을 제공하여 특정 목적에 더욱 강력한 대안이 됩니다. 여러분의 홈랩이 더욱 강력하고 효율적으로 운영되기를 바랍니다!

    다음 글에서는 Proxmox에서 ZFS 파일 시스템을 활용하여 스냅샷과 데이터 무결성을 어떻게 관리하는지 자세히 다뤄볼 예정입니다. 기대해주세요! 😄

    Proxmox VE 로고와 함께 LXC 컨테이너 및 VM 아이콘이 조화롭게 배치된 마무리 이미지입니다.