K8s Network - Ingress 개념, 도메인 접근 (11)

박민준·2025년 7월 4일
0

Ingress

Ingress는 외부(인터넷)에서 K8s 클러스터 안의 서비스로 들어오는 HTTP/HTTPS 요청을 관리하는 입구입니다.

  • 파드를 도메인을 통해 접속할 수 있도록 가상 호스팅 기능 제공
  • ingress controller를 통해 관리됨
    • nginx, HAProxy, traefik, AWS ALB Ingress Controller(클라우드용) 등이 controller에 속함
  • L7 기능을 제공하기에, 로드밸런싱 기능도 가능

학교 비유를 통한 Ingress 설명

학교 안에 여러 교실(Pod)이 있는데,
학생들이 외부(집)에서 학교로 와서 각 교실로 찾아가려면 정문(Ingress)이 필요합니다.
그리고 그 정문에서 "너는 1반 가, 너는 2반 가" 이렇게 안내해주는 경비 아저씨(Ingress Controller)도 필요합니다.

Ingress Controller

Ingress는 규칙만 적어놓은 안내표이고, 실제로 이 규칙을 따라 트래픽을 전달하는 역할을 하는 게 바로 Ingress Controller입니다.

트래픽 처리 흐름

  1. Client가 hello.world.com 도메인으로 https 요청 전달
  2. ingress controller는 ingress 규칙을 참조
  3. 규칙에 의해, 도메인이 "hello.world.com", 경로가 "/" 이면, 해당 요청을 "hello service"로 전달함
  4. hello service는 해당 요청을 처리할 수 있는 Pod로 트래픽을 전달
  5. Pod가 요청을 처리한 후, 다시 역순으로 응답 전달

ingress routing

ingress는 subpath를 통한 routing도 가능하여, 여러 path를 통해 분기처리가 가능합니다.

외부 접근

ingress controller통한 요청 처리를 위해서는 반드시 ingress controller로 접근이 필요합니다.
그렇기 위해서는 K8s 외부에서는 Loadbalancer 등으로, 내부에서는 Nodeport/LoadBalancer 타입의 Service가 필수입니다.

ingress 실습

NCP에서 VM 3개를 클러스터링하여 K8s 운영 중이니 참고하시기 바랍니다.

Nodeport + ingress

외부 접근을 위해서 흔히 사용하는 조합입니다.
LB를 활용해도 되지만, 간단한 서비스의 경우 Service 타입을 Nodeport로 해도 무방합니다.

nginx-ingress-controller 설치

  • ingress controller 파드가 32080, 32443 포트를 수신하도록 명시하였습니다.
    • 명시하지 않으면 랜덤
helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx --create-namespace \
  --set controller.service.type=NodePort \
  --set controller.service.nodePorts.http=32080 \
  --set controller.service.nodePorts.https=32443

nginx ingress 리소스 구성

  • 이외에도 요청을 처리할 nginx pod를 구성했습니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
    - host: "*"
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx
                port:
                  number: 80

생성된 리소스들

nginx가 생성된 worker node의 <공인IP:nodeport> 로 curl을 하면 nginx가 호출되야 합니다.

ingress 구성 시, 80 포트를 통해 접근하도록 명시했기에, 443포트를 수신하도록 설정하였어도, 400 code를 줄 뿐입니다.

  • 만약 수신하도록 설정된 port 이외로 접근한다면?
    --> connection timeout 발생

도메인을 통한 접근

서두에 언급했다시피 ingress는 ip 뿐만 아니라, 도메인을 통해서 접근도 가능합니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
    - host: hello.world.com   # ip > domain으로 수정
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx
                port:
                  number: 80

hello.world.com 도메인을 소유하지 않고 있기에, curl을 호출할 서버에 해당 도메인이 어떤 ip로 매칭되는지 설정이 필요합니다.

일반적으로 linux의 경우 /etc/hosts에 해당 정보를 설정하며, nginx가 구성된 worker의 공인 ip를 도메인과 매칭시켜주도록 설정하면 됩니다.
echo "<worker1 pub ip> hello.world.com" | sudo tee -a /etc/hosts

  • 만약, 설정없이 테스트 하고 싶다면?
    • curl -H "Host: hello.world.com" http://101.79.10.90:32080/ -H 옵션을 통해 도메인 resolve 가능
profile
바교망

0개의 댓글