yeonghoon.kim

  • 게시판
  • 갤러리

ARM Kubernetes 구축 4 - 외부 접근 환경 VPN MetalLB Ingress

김영훈 2026.02.18 12:44 조회 수 : 246

KVM 위 Kubernetes 클러스터 외부 접근 구성.

WiFi 환경이라 VM에 외부 IP를 직접 붙이기 어려움.

OpenVPN + MetalLB + Ingress 조합으로 처리.

구성.

호스트 서버
WiFi 192.168.200.100
virbr0 192.168.122.1/24

KVM VM.

k8s-master
192.168.122.10

k8s-worker1
192.168.122.11

k8s-worker2
192.168.122.12

OpenVPN.

VPN 대역:
192.168.255.0/24

K8s VM용 OpenVPN 클라이언트 발급.

bash scripts/create-client.sh k8s-master
bash scripts/create-client.sh k8s-worker1
bash scripts/create-client.sh k8s-worker2

CCD 고정 IP.

# /etc/openvpn/ccd/k8s-master
ifconfig-push 192.168.255.10 255.255.255.0

# /etc/openvpn/ccd/k8s-worker1
ifconfig-push 192.168.255.11 255.255.255.0

# /etc/openvpn/ccd/k8s-worker2
ifconfig-push 192.168.255.12 255.255.255.0

openvpn.conf 추가.

client-config-dir /etc/openvpn/ccd
topology subnet

VM에 OpenVPN 설치.

sudo apt-get install -y openvpn
sudo cp k8s-master.ovpn /etc/openvpn/client/k8s-master.conf
sudo systemctl enable openvpn-client@k8s-master
sudo systemctl start openvpn-client@k8s-master

노드 IP 확인.

kubectl get nodes -o wide

INTERNAL-IP.

k8s-master
192.168.255.10

k8s-worker1
192.168.255.11

k8s-worker2
192.168.255.12

MetalLB 설치.

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-native.yaml

MetalLB IP pool.

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: vpn-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.255.100-192.168.255.150
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: vpn-l2advert
  namespace: metallb-system
spec:
  ipAddressPools:
  - vpn-pool
  interfaces:
  - tun0

tun 인터페이스는 ARP가 안 돼서 MetalLB L2만으로는 안 됨.

OpenVPN iroute 추가.

# /etc/openvpn/ccd/k8s-master
ifconfig-push 192.168.255.10 255.255.255.0
iroute 192.168.255.96 255.255.255.224

openvpn.conf route 추가.

route 192.168.255.96 255.255.255.224

Ingress Controller Service를 LoadBalancer로 변경.

kubectl patch svc ingress-nginx-controller -n ingress-nginx \
  -p '{"spec":{"type":"LoadBalancer"}}'

서비스 배포.

apiVersion: v1
kind: Service
metadata:
  name: nginx-demo-svc
spec:
  selector:
    app: nginx-demo
  ports:
  - port: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: apache-demo
  template:
    metadata:
      labels:
        app: apache-demo
    spec:
      containers:
      - name: apache
        image: httpd:alpine
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: apache-demo-svc
spec:
  selector:
    app: apache-demo
  ports:
  - port: 80

nginx-demo Deployment.

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:alpine
        ports:
        - containerPort: 80

Ingress 규칙.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-demo-svc
            port:
              number: 80
      - path: /apache
        pathType: Prefix
        backend:
          service:
            name: apache-demo-svc
            port:
              number: 80

상태 확인.

kubectl get pods -A | grep -E "apache|nginx"

kubectl get ingress

테스트.

curl -v http://192.168.255.100/

curl -v http://192.168.255.100/apache

결과.

GET /
nginx-demo

GET /apache
apache-demo

최종 구조.

VPN 클라이언트
-> 192.168.255.100
-> Ingress Controller
-> / nginx-demo
-> /apache apache-demo

  • 추천 0

  • 비추천 0
이 게시물을
목록

댓글 0

번호 제목 글쓴이 날짜 조회 수
공지 2025 일본 여행 계획 김영훈 2024.10.10 4119
공지 현금, 저축, 투자, 지출, 예산, 보험 내역(2024-05-30) 김영훈 2024.03.10 3752
317 OpenClaw 복원과 GLM-5.1 전환 김영훈 2026.04.07 145
316 교토 4박 5일 여행 일정: Google Calendar로 관리하는 일정짜기 김영훈 2026.04.05 124
315 7일간의 일본 여행 일정 짜기: 신칸센 + JR 패스 + Google Calendar 활용 프로젝트 김영훈 2026.03.28 128
314 JSON-LD 학습 - 메일과 Calendar 자동 인식 김영훈 2026.03.28 151
313 WAF 운영 6주 분석 김영훈 2026.03.13 199
312 Tech Support 플랫폼 김영훈 2026.03.04 80
311 ChloeToken 테스트넷 배포 김영훈 2026.03.02 232
310 Redis 대기열 시스템 김영훈 2026.03.01 212
309 Apache RewriteRule 쿼리스트링 처리 김영훈 2026.02.28 258
308 비트코인 자동매매 봇 대시보드 김영훈 2026.02.21 144
307 ARM Kubernetes 구축 6 - 무중단 업그레이드 김영훈 2026.02.20 208
306 ARM Kubernetes 구축 8 - 실전 보안 RBAC 네트워크 정책 Pod 보안 김영훈 2026.02.20 194
305 ARM Kubernetes 구축 7 - 클러스터 무중단 업그레이드 v1.29→v1.35 김영훈 2026.02.20 252
» ARM Kubernetes 구축 4 - 외부 접근 환경 VPN MetalLB Ingress 김영훈 2026.02.18 246
303 ARM Kubernetes 구축 5 - 실전 업그레이드 경험기 v1.29→v1.35 김영훈 2026.02.18 238
302 ARM Kubernetes 구축 3 - 모니터링 스택 Prometheus Grafana 김영훈 2026.02.16 179
301 ARM Kubernetes 구축 1 - VNC & KVM 설치 김영훈 2026.02.14 70
300 ARM Kubernetes 구축 2 - VM 생성과 클러스터 설치 김영훈 2026.02.14 138
299 OpenClaw 모델 삭제 사고 김영훈 2026.02.13 114
298 LLM 모델 선정 김영훈 2026.02.12 141
쓰기 태그
 첫 페이지 1 2 3 4 5 6 7 8 9 10 끝 페이지