Dev / App

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

K8s Network

5 min read
K8s Network - Ingress 개념, 도메인 접근

Ingress

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

학교 비유를 통한 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로 트래픽을 전달

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 설치

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 리소스 구성

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를 줄 뿐입니다.

도메인을 통한 접근

서두에 언급했다시피 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로 매칭되는지 설정이 필요합니다.

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 가능

Share This Post

Check out these related posts

개발팀의 애자일 도입 이야기2

개발팀의 애자일 도입 이야기 1

Lambda@Edge 고급 로깅 제어 기능