쿠버네티스 네트워크

이준석·2023년 2월 15일
0

인그레스


인그레스란

인그레스는 클러스터 내의 서비스에 대한 외부 접근을 관리하는 API 게이트웨이이다.
일반적으로 HTTP를 관리하며 로드 밸런서, SSL Termination(클러스터 내에서는 HTTP로만 통신하게 하는 전환 과정), 가상 호스팅을 제공한다.

실습으로 인그레스를 만들고 적용해보자.


1. 먼저 기존 서비스 타입을 LoadBalancer로 ClusterIP로 바꾸고 적용한다.
ClusterIP는 클러스터 내에서만 접근 가능하다.
더 이상 EXTERNAL-IP는 사용할 수 없다.

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
spec:
  selector:
    app: nginx
  type: ClusterIP
  ports:
  - name: nginx
    protocol: TCP
    port: 80
    targetPort: 80
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   92s
service/nginx        ClusterIP   10.99.173.242   <none>        80/TCP    58s

  1. 인그레스 리소스를 다음과 같이 만들고 적용한다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx
  namespace: default
spec:
  rules:
  - host: localhost
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80

  1. 생성된 인그레스를 조회한다.
    kubectl get all로는 조회가 안되므로 kubectl get all,ingress로 조회한다.
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-85996f8dbd-dmg8n   1/1     Running   0          69s
pod/nginx-deployment-85996f8dbd-dst2r   1/1     Running   0          69s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   92s
service/nginx        ClusterIP   10.99.173.242   <none>        80/TCP    58s

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   2/2     2            2           69s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-85996f8dbd   2         2         2       69s

NAME                              CLASS    HOSTS       ADDRESS   PORTS   AGE
ingress.networking.k8s.io/nginx   <none>   localhost             80      15s

  1. 인그레스는 인그레스 리소스(정책 그 자체) 외에도 인그레스 컨트롤러(정책을 실행시키는 도구)가 반드시 필요하다.
    minikube를 사용하는 경우, 인그레스 컨트롤러는 애드온으로 별도의 설치가 필요하다.
    공식 문서

  2. 터널을 열고, http://localhost 에 접속해본다.


인그레스의 필요성

애플리케이션을 외부에 노출시키는 방법으로 앞서 서비스를 배웠다.
외부 IP 주소를 할당해주는 서비스와 로드 밸런서를 생성하고 컨테이너로 트래픽을 보내는 방법을 이용한다.
이렇게 파드를 노출시킬 수 있는데 왜 인그레스를 별도로 사용해야 할까?

바로 인그레스 리소스는 로드밸런싱과 더불어 호스트 기반 라우팅을 지원하기 때문이다.

앞서 서비스를 LoadBalancer에서 ClusterIP로 바꿨기 때문에 인그레스가 로드 밸런서의 역할을 수행해야 한다.

아주 단순한 애플리케이션도 서비스는 두 개 이상의 HTTP 요청을 가지는 것이 보통이다.
보통 각각 Web Server와 WAS로 대표된다.
이러한 서비스의 접근을 별도의 포트로 구분하여 접속하게 할 수도 있지만, 하나의 호스트 상에서 라우팅으로 구분하면 보다 유연한 서비스를 만들 수 있다.

예를 들어 Web Server는 /로 WAS는 /api로 라우팅 할 수 있다.
YAML 파일에서 spec.rules.host에 별도의 호스트를 지정하여 Web Server는 www.mydomain.click, WAS는 api.mydomain.click으로 설정하는 것도 가능하다.

그렇다면 인그레스 컨트롤러는 무엇일까?
인그레스 컨트롤러라고 해서 뭔가 특별한 프로그램은 아니다.
우리가 흔히 잘 알고 있는 nginx와 같은 애플리케이션이다. (nginx가 하는 일이 결국 호스트 기반 라우팅과 로드 밸런싱이라는 점과 같다.)
즉 인그레스 컨트롤러는 규칙을 이행하는 실질적인 애플리케이션 컨테이너다.

0개의 댓글