
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

- https://k3d.io/stable/#installation 에서 확인 가능
클러스터 생성
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) 배포

- localhost:30080 접속하여 nginx 페이지 확인
테스트 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 생성 및 확인

- localhost:8080 접속하여 nginx 페이지 확인
| 비교 항목 | -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 확인

- localhost:8080 접속하여 nginx 기본 페이지 확인
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

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

- localhost:8080 새로고침하여 웰컴페이지 수정 확인
| 구분 | 1단계: k3d 마운트 (Host → Node) | 2단계: K8s 마운트 (Node Pod) |
|---|---|---|
| 주체 | Docker / k3d | Kubernetes (오케스트레이션 계층) |
| 연결 경로 | 내 PC 폴더 → k3d 노드(컨테이너) 내부 | k3d 노드 내부 → 파드(Nginx) 내부 폴더 |
| 역할 | 물리적인 데이터 통로를 뚫어주는 작업 | 뚫린 통로를 특정 서비스(앱)가 사용하게 연결 |
'Kubernetes' 카테고리의 다른 글
| CKA 합격 후기 - 2025년 유형 변경 이후 (0) | 2025.10.23 |
|---|---|
| [Kubernetes] CKA Udemy Lightning Lab - 1 풀이 (1) | 2025.10.01 |
| [Kubernetes] Kustomize Patch로 리소스 커스터마이징 하기 (0) | 2025.09.30 |
| [Kubernetes] Kustomize Transformer로 리소스 커스터마이징 하기 (0) | 2025.09.29 |
| [Kubernetes] Helm Repository 추가 및 차트 배포하기 (0) | 2025.09.26 |