[Kubernetes] Kubernetes 미니홈서버 구축해 보기 - 8 - HAPROXY 외부 네트워크 사설망에 연결 그리고 DDNS 설정
```
[k8s] Kubernetes 미니홈서버 구축해보기 - 8 - HAPROXY 외부 네트워크 사설망에 연결 그리고 DDNS 설정
```
이번 글을 통해 배워갈 내용
- 개요
- Haproxy 란
- Cloud flare 인증서 생성
- Haproxy 설치
1. 개요
마스터 노드 1개
워커노드 5개
그리고 proxmox host가 모두
private network 안에 생성이 되었습니다.
이제 deploy를 만들고 해당되는 샘플 deploy를 외부에 public ip로 붙이기 위해서
inernal network 와 external network 모두에 붙인 vm을 만들고
DNS를 맵핑해서
외부 IP를 kubernetes cluster에 NodePort에 맵핑시켜보겠습니다.
선택지는 MetalLB, kube-vip, HAProxy 등이 있었으나
비용절감상 고정아이피가 지원이 안되서 주기적으로 아이피주소를 업데이트해야 하는 상황이고
보안상 쉽게 VM 하나를 내려서 차단하고 쉽게 주소를 바꿔서 올리는 상황이라면
HAPROXY도 괜찮은 선택입니다.

2. HAPROXY란
HAProxy(High Availability Proxy)는 부하 분산(Load Balancing)과 프록시 기능을 제공하는 오픈소스 소프트웨어로, 웹 서버나 API 트래픽을 효율적으로 분산시켜 성능과 안정성을 높여줍니다.
TCP/HTTP 기반의 요청을 여러 서버로 분산하여 과부하를 방지하고, SSL 종료, 접속 제한, 건강 상태 체크(Health Check) 등의 기능을 지원합니다.
속도가 빠르고 설정이 유연하여 Kubernetes Ingress Controller, API Gateway, 웹 서버 앞단의 로드 밸런서 등 다양한 환경에서 널리 사용됩니다.
3. HAPROXY 세팅
먼저 HAPROXY 세팅을 해줍니다
PROXMOX에서 VM을 생성합니다.
CPU: 2 vCPUs
RAM: 2GB
Disk: 10GB
Network: 2 interfaces (1 for umbr0, 1 for umbr1)
Ubuntu24 minimized
필요시
openssh-server 설치
https://codemasterkimc.tistory.com/568
우분투22.04 SSH 설정하고 Putty로 접속하기
SSH(Secure Shell) 말 그대로 보안 쉘, 원격 접속을 위해서 사용되는 프로토콜 기본적으로 CLI로 원격 접속할 때 사용합니다 사전작업으로 고정아이피를 설정합니다https://codemasterkimc.tisto
codemasterkimc.tistory.com
기초 ufw 세팅
sudo ufw enable
sudo ufw allow from $MY_IP to any port 5252
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw status verbose
기초 fail2ban 설치
sudo apt update && sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
기초 패키지 설치를 해주고
sudo apt install net-tools iproute2 nano -y
Netplan 세팅 (유동입니다)
sudo apt install nano
nano /etc/netplan/01-netcfg.yam
network:
version: 2
ethernets:
enp값1:
dhcp4: true # Public IP via DHCP
enp값2:
addresses:
- 192.168.10.100/24 # Private IP for internal cluster use
nameservers:
addresses:
- 8.8.8.8
- 1.1.1.1
적용
sudo netplan apply --debug
4. Cloudflare 인증서 생성
Cloud flare 로그인
Origin Certificate 생성

생성 후 나온 값을 복붙
sudo mkdir -p /etc/haproxy/certs
# 인증서 저장
sudo nano /etc/haproxy/certs/cloudflare-cert.pem
# 복붙 (이런 글로 시작 -----BEGIN CERTIFICATE-----), 저장
sudo nano /etc/haproxy/certs/cloudflare-key.key
# 복붙 (이런 글로 시작 -----BEGIN RSA PRIVATE KEY-----), 저장
haproxy에 적용
cat /etc/haproxy/certs/cloudflare-cert.pem /etc/haproxy/certs/cloudflare-key.key | sudo tee /etc/haproxy/certs/cloudflare-combined.pem > /dev/null
sudo chmod 600 /etc/haproxy/certs/cloudflare-combined.pem
sudo chown haproxy:haproxy /etc/haproxy/certs/cloudflare-combined.pem
5. Haproxy 설치
sudo apt update && sudo apt install haproxy -y
버전확인
haproxy -v
HAProxy config 파일 수정
sudo nano /etc/haproxy/haproxy.cfg
# 글로벌 설정
global
log /dev/log local0 # 기본 로그 설정
log /dev/log local1 notice # 추가적인 로그 설정
chroot /var/lib/haproxy # 보안 강화를 위한 chroot 설정
stats socket /run/haproxy/admin.sock mode 660 level admin # 관리용 소켓 설정
stats timeout 30s # 통계 소켓 타임아웃 설정
user haproxy # 실행 사용자 설정
group haproxy # 실행 그룹 설정
daemon # 데몬 모드로 실행
# Cloudflare SSL 호환성을 위한 기본 설정
ca-base /etc/ssl/certs # CA 인증서 기본 경로
crt-base /etc/ssl/private # 인증서 기본 경로
ssl-default-bind-ciphers 값 # SSL 암호화 설정 (Cloudflare 호환)
ssl-default-bind-ciphersuites TLS_AES_128_값 # TLS 1.3 암호화 설정
# 기본 설정 (HTTP 트래픽 처리)
defaults
log global # 글로벌 로그 사용
mode http # HTTP 모드 사용
option httplog # HTTP 요청 로그 활성화
option dontlognull # 빈 요청 로그 제외
timeout connect 5000 # 서버 연결 타임아웃 (5초)
timeout client 50000 # 클라이언트 응답 타임아웃 (50초)
timeout server 50000 # 서버 응답 타임아웃 (50초)
# HTTP 트래픽 처리
frontend http_front
bind *:80 # 80번 포트에서 요청 수신
default_backend k8s_ingress # 백엔드로 트래픽 전달
# HTTPS 트래픽 처리 (Cloudflare SSL 인증서 사용)
frontend https_front
bind *:443 ssl crt /etc/haproxy/certs/cloudflare-combined.pem # SSL 적용
default_backend k8s_ingress # HTTPS 트래픽을 백엔드로 전달
# 백엔드 설정 (Kubernetes Ingress와 연동)
backend k8s_ingress
balance roundrobin # 라운드 로빈 방식 부하 분산
server node1 내부망주소:포트 check # 내부 Kubernetes 노드로 트래픽 전달 및 상태 체크
확인
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl restart haproxy
sudo systemctl enable haproxy
sudo systemctl status haproxy
6. DDNS
Cloudflare에 DNS 세팅을 해주고
API 토큰 세팅도 해줍니다.

ddns 세팅
sudo apt install -y ddclient
sudo nano /etc/ddclient.conf
# Cloudflare 동적 DNS 설정
daemon=300 # 300초(5분)마다 실행 (주기적인 업데이트)
syslog=yes # 시스템 로그 활성화 (로그 기록을 남김)
protocol=cloudflare # Cloudflare API를 사용하여 DNS 업데이트 수행
use=web # 외부 웹 서비스를 사용하여 현재 IP 확인
web=https://api.ipify.org # 현재 공인 IP를 가져오는 서비스 (ipify API 사용)
ttl=1 # TTL(Time-To-Live) 설정 (1초, 즉시 업데이트 반영)
# Cloudflare 로그인 정보 (보안상 환경 변수나 별도 설정 파일에서 관리하는 것이 좋음)
login=이메일주소 # Cloudflare 계정 이메일
password=비밀번호 # Cloudflare API 키 또는 비밀번호 (보안 주의!)
# 도메인 설정
zone=sample.com # Cloudflare에서 관리하는 도메인(zone)
k8s.sample.com # 업데이트할 서브도메인 (예: Kubernetes 클러스터용)
sudo systemctl restart ddclient
sudo systemctl enable ddclient
7. 쿠버네티스 세팅
인그레스를 만들고
트래픽을 받아서
서비스를 통해 nginx 포드를 보여줍니다.
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-controller --create-namespace \
--set controller.service.type=NodePort \
--set controller.service.nodePorts.http=40080 \
--set controller.service.nodePorts.https=40443
kubectl get svc -n ingress-controller
kubectl run nginx-sample --image=nginx:latest --port=80
kubectl expose pod nginx-sample --port=80 --target-port=80 --name=nginx-sample-service
ingress 설정 예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: sample-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: sample1.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-sample-service
port:
number: 80
- host: sample2.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-sample-service
port:
number: 80
8. 끝

이제 정상적으로 사설망에 k8s 클러스터 구축 후
외부에서 proxy를 걸고 유동망으로 접근하고 유동망을 업데이트하는 부분이 완료되었습니다~
이제 정상적으로 사설망에 Kubernetes 클러스터를 구축한 후,
외부에서 프록시를 설정하여 유동 IP를 통한 접근을 가능하게 하고,
유동 IP 자동 업데이트까지 완료되었습니다~
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
'DevOps > Kubernetes' 카테고리의 다른 글
쿠버네티스 미니홈서버 구축해보기 - 9 - 기존 HAProxy 와 NodePort로 연결된 NGINX Ingress를MetalLB로 교체 (0) | 2025.03.09 |
---|---|
쿠버네티스 미니홈서버 구축해보기 - 7 - Proxmox에서 프라이빗 네트워크 만들고 VM 연결하기 (1) | 2025.03.03 |
쿠버네티스 미니홈서버 구축해보기 - 6 - Proxmox 방화벽 점검해보기 (0) | 2025.03.02 |
쿠버네티스 미니홈서버 구축해보기 - 5 - Master Node Control Plane설정해보기 (0) | 2025.03.01 |
쿠버네티스 미니홈서버 구축해보기 - 4 - PROXMOX Ubuntu VM 세팅하기 (2) | 2025.02.26 |
[Kubernetes] Kubernetes 미니홈서버 구축해 보기 - 8 - HAPROXY 외부 네트워크 사설망에 연결 그리고 DDNS 설정
```
[k8s] Kubernetes 미니홈서버 구축해보기 - 8 - HAPROXY 외부 네트워크 사설망에 연결 그리고 DDNS 설정
```

이번 글을 통해 배워갈 내용
- 개요
- Haproxy 란
- Cloud flare 인증서 생성
- Haproxy 설치
1. 개요
마스터 노드 1개
워커노드 5개
그리고 proxmox host가 모두
private network 안에 생성이 되었습니다.
이제 deploy를 만들고 해당되는 샘플 deploy를 외부에 public ip로 붙이기 위해서
inernal network 와 external network 모두에 붙인 vm을 만들고
DNS를 맵핑해서
외부 IP를 kubernetes cluster에 NodePort에 맵핑시켜보겠습니다.
선택지는 MetalLB, kube-vip, HAProxy 등이 있었으나
비용절감상 고정아이피가 지원이 안되서 주기적으로 아이피주소를 업데이트해야 하는 상황이고
보안상 쉽게 VM 하나를 내려서 차단하고 쉽게 주소를 바꿔서 올리는 상황이라면
HAPROXY도 괜찮은 선택입니다.

2. HAPROXY란
HAProxy(High Availability Proxy)는 부하 분산(Load Balancing)과 프록시 기능을 제공하는 오픈소스 소프트웨어로, 웹 서버나 API 트래픽을 효율적으로 분산시켜 성능과 안정성을 높여줍니다.
TCP/HTTP 기반의 요청을 여러 서버로 분산하여 과부하를 방지하고, SSL 종료, 접속 제한, 건강 상태 체크(Health Check) 등의 기능을 지원합니다.
속도가 빠르고 설정이 유연하여 Kubernetes Ingress Controller, API Gateway, 웹 서버 앞단의 로드 밸런서 등 다양한 환경에서 널리 사용됩니다.
3. HAPROXY 세팅
먼저 HAPROXY 세팅을 해줍니다
PROXMOX에서 VM을 생성합니다.
CPU: 2 vCPUs
RAM: 2GB
Disk: 10GB
Network: 2 interfaces (1 for umbr0, 1 for umbr1)
Ubuntu24 minimized
필요시
openssh-server 설치
https://codemasterkimc.tistory.com/568
우분투22.04 SSH 설정하고 Putty로 접속하기
SSH(Secure Shell) 말 그대로 보안 쉘, 원격 접속을 위해서 사용되는 프로토콜 기본적으로 CLI로 원격 접속할 때 사용합니다 사전작업으로 고정아이피를 설정합니다https://codemasterkimc.tisto
codemasterkimc.tistory.com
기초 ufw 세팅
sudo ufw enable
sudo ufw allow from $MY_IP to any port 5252
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw status verbose
기초 fail2ban 설치
sudo apt update && sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
기초 패키지 설치를 해주고
sudo apt install net-tools iproute2 nano -y
Netplan 세팅 (유동입니다)
sudo apt install nano
nano /etc/netplan/01-netcfg.yam
network:
version: 2
ethernets:
enp값1:
dhcp4: true # Public IP via DHCP
enp값2:
addresses:
- 192.168.10.100/24 # Private IP for internal cluster use
nameservers:
addresses:
- 8.8.8.8
- 1.1.1.1
적용
sudo netplan apply --debug
4. Cloudflare 인증서 생성
Cloud flare 로그인
Origin Certificate 생성

생성 후 나온 값을 복붙
sudo mkdir -p /etc/haproxy/certs
# 인증서 저장
sudo nano /etc/haproxy/certs/cloudflare-cert.pem
# 복붙 (이런 글로 시작 -----BEGIN CERTIFICATE-----), 저장
sudo nano /etc/haproxy/certs/cloudflare-key.key
# 복붙 (이런 글로 시작 -----BEGIN RSA PRIVATE KEY-----), 저장
haproxy에 적용
cat /etc/haproxy/certs/cloudflare-cert.pem /etc/haproxy/certs/cloudflare-key.key | sudo tee /etc/haproxy/certs/cloudflare-combined.pem > /dev/null
sudo chmod 600 /etc/haproxy/certs/cloudflare-combined.pem
sudo chown haproxy:haproxy /etc/haproxy/certs/cloudflare-combined.pem
5. Haproxy 설치
sudo apt update && sudo apt install haproxy -y
버전확인
haproxy -v
HAProxy config 파일 수정
sudo nano /etc/haproxy/haproxy.cfg
# 글로벌 설정
global
log /dev/log local0 # 기본 로그 설정
log /dev/log local1 notice # 추가적인 로그 설정
chroot /var/lib/haproxy # 보안 강화를 위한 chroot 설정
stats socket /run/haproxy/admin.sock mode 660 level admin # 관리용 소켓 설정
stats timeout 30s # 통계 소켓 타임아웃 설정
user haproxy # 실행 사용자 설정
group haproxy # 실행 그룹 설정
daemon # 데몬 모드로 실행
# Cloudflare SSL 호환성을 위한 기본 설정
ca-base /etc/ssl/certs # CA 인증서 기본 경로
crt-base /etc/ssl/private # 인증서 기본 경로
ssl-default-bind-ciphers 값 # SSL 암호화 설정 (Cloudflare 호환)
ssl-default-bind-ciphersuites TLS_AES_128_값 # TLS 1.3 암호화 설정
# 기본 설정 (HTTP 트래픽 처리)
defaults
log global # 글로벌 로그 사용
mode http # HTTP 모드 사용
option httplog # HTTP 요청 로그 활성화
option dontlognull # 빈 요청 로그 제외
timeout connect 5000 # 서버 연결 타임아웃 (5초)
timeout client 50000 # 클라이언트 응답 타임아웃 (50초)
timeout server 50000 # 서버 응답 타임아웃 (50초)
# HTTP 트래픽 처리
frontend http_front
bind *:80 # 80번 포트에서 요청 수신
default_backend k8s_ingress # 백엔드로 트래픽 전달
# HTTPS 트래픽 처리 (Cloudflare SSL 인증서 사용)
frontend https_front
bind *:443 ssl crt /etc/haproxy/certs/cloudflare-combined.pem # SSL 적용
default_backend k8s_ingress # HTTPS 트래픽을 백엔드로 전달
# 백엔드 설정 (Kubernetes Ingress와 연동)
backend k8s_ingress
balance roundrobin # 라운드 로빈 방식 부하 분산
server node1 내부망주소:포트 check # 내부 Kubernetes 노드로 트래픽 전달 및 상태 체크
확인
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl restart haproxy
sudo systemctl enable haproxy
sudo systemctl status haproxy
6. DDNS
Cloudflare에 DNS 세팅을 해주고
API 토큰 세팅도 해줍니다.

ddns 세팅
sudo apt install -y ddclient
sudo nano /etc/ddclient.conf
# Cloudflare 동적 DNS 설정
daemon=300 # 300초(5분)마다 실행 (주기적인 업데이트)
syslog=yes # 시스템 로그 활성화 (로그 기록을 남김)
protocol=cloudflare # Cloudflare API를 사용하여 DNS 업데이트 수행
use=web # 외부 웹 서비스를 사용하여 현재 IP 확인
web=https://api.ipify.org # 현재 공인 IP를 가져오는 서비스 (ipify API 사용)
ttl=1 # TTL(Time-To-Live) 설정 (1초, 즉시 업데이트 반영)
# Cloudflare 로그인 정보 (보안상 환경 변수나 별도 설정 파일에서 관리하는 것이 좋음)
login=이메일주소 # Cloudflare 계정 이메일
password=비밀번호 # Cloudflare API 키 또는 비밀번호 (보안 주의!)
# 도메인 설정
zone=sample.com # Cloudflare에서 관리하는 도메인(zone)
k8s.sample.com # 업데이트할 서브도메인 (예: Kubernetes 클러스터용)
sudo systemctl restart ddclient
sudo systemctl enable ddclient
7. 쿠버네티스 세팅
인그레스를 만들고
트래픽을 받아서
서비스를 통해 nginx 포드를 보여줍니다.
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-controller --create-namespace \
--set controller.service.type=NodePort \
--set controller.service.nodePorts.http=40080 \
--set controller.service.nodePorts.https=40443
kubectl get svc -n ingress-controller
kubectl run nginx-sample --image=nginx:latest --port=80
kubectl expose pod nginx-sample --port=80 --target-port=80 --name=nginx-sample-service
ingress 설정 예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: sample-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: sample1.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-sample-service
port:
number: 80
- host: sample2.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-sample-service
port:
number: 80
8. 끝

이제 정상적으로 사설망에 k8s 클러스터 구축 후
외부에서 proxy를 걸고 유동망으로 접근하고 유동망을 업데이트하는 부분이 완료되었습니다~
이제 정상적으로 사설망에 Kubernetes 클러스터를 구축한 후,
외부에서 프록시를 설정하여 유동 IP를 통한 접근을 가능하게 하고,
유동 IP 자동 업데이트까지 완료되었습니다~
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
'DevOps > Kubernetes' 카테고리의 다른 글
쿠버네티스 미니홈서버 구축해보기 - 9 - 기존 HAProxy 와 NodePort로 연결된 NGINX Ingress를MetalLB로 교체 (0) | 2025.03.09 |
---|---|
쿠버네티스 미니홈서버 구축해보기 - 7 - Proxmox에서 프라이빗 네트워크 만들고 VM 연결하기 (1) | 2025.03.03 |
쿠버네티스 미니홈서버 구축해보기 - 6 - Proxmox 방화벽 점검해보기 (0) | 2025.03.02 |
쿠버네티스 미니홈서버 구축해보기 - 5 - Master Node Control Plane설정해보기 (0) | 2025.03.01 |
쿠버네티스 미니홈서버 구축해보기 - 4 - PROXMOX Ubuntu VM 세팅하기 (2) | 2025.02.26 |