애플리케이션 노출: 서비스-인그레스

코딩노잼·2022년 7월 6일
0

서비스

쿠버네티스에서 고정 ip를 사용하고, 애플리케이션을 외부에 노출하기 위해서는 서비스를 사용해야 한다.

파드는 생성될 때마다 다른 private ip 주소를 할당받고, 여러 노드를 옮겨 다닌다.

반면 서비스는 여러 개의 파드에 접근할 수 있는 하나의 IP를 제공한다. 따라서, 서비스를 사용하면 파드의 변동에 상관 없이, 연결된 파드에 서비스 주소로 접근할 수 있다.

파드에 어떻게 접근할 것이냐에 따라 적절한 서비스의 종류를 선택해야 한다.

ClusterIP

ClusterIP 타입의 서비스를 생성하면 내부 ip를 생성해 Selector의 라벨을 참조하여 해당하는 파드들과 연결하여 파드에 접속할 수 있게 해준다.

쿠버네티스에서는 내부 dns를 구동하고 있어서, 서비스는 ip 뿐만 아니라 서비스 이름으로 접근할 수 있다.

kubectl port-forward 를 사용하면 프록시를 통해 외부에서도 접근할 수 있다.

NodePort

모든 노드의 특정 포트를 개방해 서비스에 접근하는 방식.
웹 어플리케이션에 노드포트 쓰기에는 적절하지 않음 (안쓰는 포트라 헷갈림. 웬만하면 웰노운 포트 쓰기...) 쓸거면 인그레스와 함께 쓰자.

LoadBalancer

서비스 생성과 동시에 L4 로드밸런서가 생성되어, 모든 노드에 랜덤 포트가 열림.
(쿠버네티스가 로드밸런서 직접 제공하는 것은 아니고 aws나 오픈스택 환경 구축해놓든지 해야 쓸수있음.)


인그레스

인그레스란 외부에서 유입되는 트래픽을 처리하기 위해 네트워크 7계층 레벨에서 정의하는 쿠버네티스 오브젝트이다.

  • 외부 요청의 라우팅 : 특정 경로로 들어온 요청을 어떠한 서비스로 전달할지 정의
  • 가상 호스트 기반의 요청 처리 : 같은 ip 에 대해 다른 도메인 이름으로 요청이 도착했을 때 어떻게 처리할 것인지 정의
  • SSL/TLS 보안 연결 처리 : 여러 개의 서비스로 요청을 라우팅할 때, 보안 연결을 위한 인증서를 쉽게 적용할 수 있음.

왜 써야 할까?


SSL/TLS 보안 연결 등을 구현할 때 각 서비스와 디플로이먼트에 대해 일일이 설정해야 하므로 귀찮다.

하나의 url로 접근하여 적절한 디플로이먼트로 전달될 수 있음.
라우팅 정의, 보안 연결 등 세부 설정은 인그레스에 의해 수행되므로 편리함

인그레스 설정

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-example
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: alicek106.example.com                   # [1]
    http:
      paths:
      - path: /echo-hostname                     # [2]
        pathType: Prefix
        backend: 
          service: 
            name: hostname-service               # [3]
            port: 
              number: 80

[1] 해당 도메인 이름으로 접근하는 요청에 대해 규칙 적용 (ip 혹은 다른 도메인으로 접속하면 접속 되지 않음)
[2], [3] /echo-hostname 경로로 들어온 요청을 hostname-service 서비스의 80번 포트로 전달하겠다.

annotation : 세부 기능

동작 방식

  1. 인그레스 오브젝트를 생성하면 요청을 처리하는 '규칙'이 생성된다
  2. 실제 요청을 받아들이기 위해 '인그레스 컨트롤러' 라는 특수한 서버를 생성하고, 규칙을 적용한다. (인그레스 컨트롤러는 따로 설치해야 함. 책에서는 nginx 웹서버 사용.)
  3. 쿠버네티스 api 에는 특정 오브젝트의 상태 변화를 지켜보고 있는 watch api 가 있는데, 인그레스 컨트롤러는 인그레스 리소스에 대해 watch api 를 사용하여 모든 네임스페이스의 인그레스 리소스를 읽어와 규칙을 적용한다.

  4. 요청이 들어왔을 때 인그레스 컨트롤러는 bypass 방식(실제로는 서비스를 거치지 않고 파드로 직접 전달하는것)으로 요청을 전달한다.

References

시작하세요! 도커/쿠버네티스

profile
올해는 진짜 블로그 써야지 (라고 매년 말하기)

0개의 댓글