Kubernetes

[K3d] K3d 설치 및 인그레스, 멀티 노드, PV 테스트

sooondubu 2026. 3. 17. 16:26

 

K3d 설치 및 인그레스, 멀티 노드, PV 테스트 


목차 

  • 개념
  • K3d설치 
  • 테스트 1. NodePort 활용하여 외부 접속 
  • 테스트 2. Ingress 사용하여 외부 접속 
  • 테스트 3. 멀티 노드 클러스터 
  • 테스트 4. PV, PVC 활용하여 호스트 볼륨 마운트 

개념 

K3s 

  • 경량 쿠버네티스 배포판 (Lightweight Kubernetes) 
  • https://k3s.io/
  • 특징 
    • 초경량: 바이너리 파일 크기 100MB 미만, 적은 메모리 사용
    • 엣지 컴퓨팅: IoT, 라즈베리파이 등 소규모 서버에 최적화
    • ARM 최적화: ARM64, ARMv7 지원 등 다양한 환경에서 작동

K3d

  • K3s를 도커 컨테이너 안에서 실행할 수 있는 Wrapper 도구
  • https://k3d.io/
  • 특징
    • 로컬 최적화: k8s를 직접 설치하지 않고 도커만 사용하려 클러스터 생성 가능
    • 빠른 구축
    • 멀티 노드: 여러 개의 노드가 있는 환경을 손쉽게 구축 가능

테스트 환경

  • WSL2 Ubuntu 24.04
  • docker, kubectl 이 설치된 환경

K3d 설치

curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash


클러스터 생성

k3d cluster create mycluster

  • k3d 명령어로 클러스터 생성

클러스터 생성 확인

k get no
k get po -A
docker ps

  • 노드, 파드, 컨테이너 확인

포트를 열어주지 않아, localhost로 접근이 불가능 하다!


테스트 1. NodePort 활용하여 외부 접속

# 기존 클러스터 삭제
k3d cluster delete mycluster

# 30080 포트를 열어서 다시 생성 
k3d cluster create mycluster -p "30080:30080@server:0"

  • 기존 클러스터 삭제
  • 30080 포트 오픈하여 클러스터 생성

  • 30080 포트 오픈 확인

# 01_nodeport.yaml

# Deployment(Nginx)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-demo
  template:
    metadata:
      labels:
        app: nginx-demo
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
---
# Service(NodePort)
apiVersion: v1
kind: Service
metadata:
  name: nginx-demo
spec:
  type: NodePort
  selector:
    app: nginx-demo
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080 
k create -f 01_nodeport.yaml
k get po,svc  

  • 테스트를 위한 nginx deployment, service(nodeport) 배포


테스트 2. Ingress 사용하여 외부 접속

# 기존 클러스터 삭제
k3d cluster delete mycluster

# 30080 포트를 열어서 다시 생성 
k3d cluster create mycluster -p "8080:80@loadbalancer"

  • 기존 클러스터 삭제
  • 8080 포트 오픈하여 클러스터 생성

  • 8080 포트 오픈 확인

# 02_ingress.yaml

# Deployment(Nginx)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-app
  template:
    metadata:
      labels:
        app: nginx-app
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
---
# Service(ClusterIP)
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  type: ClusterIP
  selector:
    app: nginx-app
  ports:
    - port: 80
      targetPort: 80
---
# Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  ingressClassName: traefik  # k3d 기본 내장 인그레스 컨트롤러 사용
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-svc  
            port:
              number: 80
k create -f 02_ingress.yaml 
k get po,svc,ing

  • deployment, service, ingress 생성 및 확인


비교 항목 -p "30080:30080@server:0" (NodePort) -p "8080:80@loadbalancer" (Ingress)
연결 대상 클러스터 내의 특정 노드 (k3d-...-server-0 컨테이너) 클러스터 앞단의 프록시 로드밸런서 (k3d-proxy 컨테이너)
매핑 의미 호스의 30080 포트 → 0번 서버 노드의 30080 포트 호스트의 8080 포트 → k3d-proxy의 80 포트
필요한 K8s 리소스 Service (type: NodePort) Service (type: ClusterIP) + Ingress
실무 활용도 로컬 환경에서의 빠르고 단순한 단일 앱 테스트용 실제 서비스(Production) 환경에서 사용하는 표준 라우팅 방식

테스트 3. 멀티 노드 클러스터

# 기존 클러스터 삭제
k3d cluster delete mycluster

# 서버 노드 1개, 워커 노드 3개를 가진 클러스터 생성
k3d cluster create multi-node-cluster --servers 1 --agents 3 -p "8080:80@loadbalancer"

  • 마스터 노드 1, 워커 노드 3 클러스터 생성

k get no
docker ps

  • 노드 및 컨테이너 확인

# 03_multi_node.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-depl
  labels:
    app: nginx-depl
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx-depl
  template:
    metadata:
      labels:
        app: nginx-depl
    spec:
      containers:
      - name: nginx
        image: nginx
# deployment 생성
k create -f 03_multi_node.yaml

# 노드 분산 확인
k get po -o wide

  • 4개의 노드에 분산된 것을 확인

테스트 4. PV, PVC 활용하여 호스트 볼륨 마운트

# 마운트 된 클러스터 생성
# [호스트 경로]:[컨테이너 경로]
k3d cluster create vol-cluster \
  -p "8080:80@loadbalancer" \
  -v "/home/user/sre/pv-test:/var/lib/k3d/html@all"

ls # pv-test 폴더 생성 확인

  • 호스트의 /home/user/sre/pv-test 와 노드의 /var/lib/k3d/html 마운트

# 1. PV 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-html-pv
spec:
  storageClassName: manual  
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/var/lib/k3d/html" # k3d 노드의 경로
---
# 2. PVC 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: html-pvc
spec:
  storageClassName: manual  # manual인 PV와만 연결하겠다는 뜻
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
# 3. Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-vol
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-vol
  template:
    metadata:
      labels:
        app: nginx-vol
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - name: html-storage
          mountPath: /usr/share/nginx/html  # Nginx 기본 폴더
      volumes:
      - name: html-storage
        persistentVolumeClaim:
          claimName: html-pvc # PVC와 연결
---
# 4. Service 
apiVersion: v1
kind: Service
metadata:
  name: nginx-vol-svc
spec:
  type: ClusterIP
  selector:
    app: nginx-vol
  ports:
    - port: 80
      targetPort: 80
---
# 5. Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-vol-ingress
spec:
  ingressClassName: traefik
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-vol-svc
            port:
              number: 80
k create -f 04.pv.yaml

# pv, pvc 생성 확인
k get pv,pvc

  • PV, PVC 생성, STATUS Bound 확인


sudo chown -R $USER:$USER /home/user/sre/pv-test
chmod -R 755 /home/user/sre/pv-test             

echo "<h1>K3d Test Success</h1>" > /home/user/sre/pv-test/index.html

  • 폴더 소유자 변경 후 쓰기 권한 부여
  • 웰컴 페이지 생성


구분 1단계: k3d 마운트 (Host → Node) 2단계: K8s 마운트 (Node Pod)
주체 Docker / k3d Kubernetes (오케스트레이션 계층)
연결 경로 내 PC 폴더 → k3d 노드(컨테이너) 내부 k3d 노드 내부 → 파드(Nginx) 내부 폴더
역할 물리적인 데이터 통로를 뚫어주는 작업 뚫린 통로를 특정 서비스(앱)가 사용하게 연결