madebychung

온프레미스 환경에서 Ingress Controller 앞단에 외부 Load Balancer 없이 설정하려면? 본문

K8s

온프레미스 환경에서 Ingress Controller 앞단에 외부 Load Balancer 없이 설정하려면?

mdchung 2025. 4. 8. 15:10

온프레미스 환경에서 Ingress Controller 앞단에 외부 Load Balancer 없이 설정하려면?

클라우드에서는 Ingress Controller 앞단에 LoadBalancer 서비스를 쓰면 외부에서 바로 접근할 수 있습니다. 하지만 온프레미스 환경에서는 LoadBalancer 타입이 작동하지 않습니다. EXTERNAL-IP가 <pending> 상태로 계속 남아있죠.

이 글에서는 외부 Load Balancer 없이 NodePort 방식으로 Ingress Controller를 설정하고, 외부에서 직접 접근할 수 있도록 구성하는 방법을 초보자 관점에서 정리합니다.


1. 기본 개념 정리

  • LoadBalancer: 클라우드에서 외부 IP를 자동 할당해주는 서비스 타입
  • NodePort: 클러스터 외부에서 노드 IP + 포트를 통해 접근하는 방식

온프레미스에서는 NodePort로 외부 접근 통로를 열고, 직접 접속해야 합니다.


2. Ingress Controller 설치

nginx ingress controller 설치 (기본은 LoadBalancer 타입):

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.4/deploy/static/provider/cloud/deploy.yaml

✅ 리소스 설치 확인

kubectl get pods -n ingress-nginx

정상 상태: Pod 상태가 Running이고 Ready가 1/1이어야 합니다.


3. Service 타입 NodePort로 변경

설치 직후 서비스 타입은 LoadBalancer입니다. NodePort로 바꿔줍니다:

kubectl -n ingress-nginx edit svc ingress-nginx-controller

수정 전:

spec:
  type: LoadBalancer

수정 후:

spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      nodePort: 30080
    - name: https
      port: 443
      nodePort: 30443

✅ 변경 확인

kubectl get svc -n ingress-nginx

출력 예시:

NAME                       TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller   NodePort   10.100.20.144  <none>        80:30080/TCP,443:30443/TCP   5m

4. 외부에서 접근 테스트

이제 브라우저 또는 curl을 사용해 접근할 수 있습니다:

curl http://<NODE_IP>:30080

만약 Ingress 리소스 없이 직접 접근하면 404 Not Found 페이지가 나오는 게 정상입니다.


5. 테스트용 서비스 및 Ingress 설정

✅ echo 서버 배포

kubectl create deployment echo-server --image=k8s.gcr.io/echoserver:1.4
kubectl expose deployment echo-server --port=80 --target-port=8080

✅ 서비스 확인

kubectl get svc

결과 예시:

NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
echo-server   ClusterIP   10.99.50.211   <none>        80/TCP    1m

✅ Ingress 리소스 생성

cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: echo-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: echo.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: echo-server
            port:
              number: 80
EOF

✅ Ingress 확인

kubectl get ingress

결과 예시:

NAME           CLASS    HOSTS        ADDRESS     PORTS   AGE
echo-ingress   nginx    echo.local   <pending>   80      1m

6. /etc/hosts 설정

/etc/hosts 파일을 열고 echo.local을 Node IP에 매핑합니다:

sudo vi /etc/hosts

내용 추가:

192.168.0.10 echo.local

이제 도메인으로도 접속 가능:

curl http://echo.local:30080

또는 브라우저로 http://echo.local:30080 입력


7. 방화벽 포트 확인

NodePort 포트가 열려 있어야 외부 접근이 됩니다.

✅ firewalld 사용하는 경우

sudo firewall-cmd --add-port=30080/tcp --permanent
sudo firewall-cmd --add-port=30443/tcp --permanent
sudo firewall-cmd --reload

정리

  • 온프레미스에서는 LoadBalancer를 사용할 수 없기 때문에 NodePort로 전환
  • Ingress Controller의 NodePort 포트로 직접 접근
  • 도메인 연결은 /etc/hosts로 처리 가능
  • 방화벽 포트 열려 있는지 반드시 확인