Kubernetes Network - Ingress

OneDayDev·2023년 1월 26일
0

K8s

목록 보기
5/12
post-thumbnail

Ingress란?

  • 클러스터 내의 서비스에 외부에서 접근하는 것을 관리하는 API object, 보통 HTTP를 관리.
  • 부하 분산, SSL 종료, name-based 가상 호스팅을 제공할 수 있다.
  • 임의의 포트 또는 프로토콜을 노출시키지 않는다.
  • Ingress는 접근 규칙을 정의해둔 거고, 실제로 동작시키는 것은 Ingress Controllers이다.
  • 클라우드 서비스를 사용하면 자체 로드밸런서와 인그래스를 연동해서 사용하지만 직접 구축한 경우 인그레스 컨트롤러를 직접 인그레스와 연동해야 한다.
  • 가장 많이 사용하는 도구는 쿠버네티스에서 제공하는 ingress-nginx이다. 그 외의 여러 컨트롤러가 존재한다(참고 : Ingress Controllers)

참고 : nginx-controller 설치 가이드

설치 후에 Ingress 문서의 예시를 한번 실습해보는 것을 추천한다.

Ingress Class

인그레스는 서로 다른 컨트롤러에 의해 구현될 수 있으며, 종종 다른 구성으로 구현될 수 있다. 각 인그레스에서는 클래스를 구현해야하는 컨트롤러 이름을 포함하여 추가 구성이 포함된 IngressClass 리소스에 대한 참조 클래스를 지정해야 한다. 인그레스 클래스의 .spec.parametes 필드를 사용하여 해당 환경 설정을 제공하는 다른 리소스를 참조할 수 있다.
범주는 클러스터, 네임스페이스로 설정 가능한데 컨트롤러의 종류에 따라 다를 수 있다.

Hostname wildcards

Hostname을 정확히 매칭하게 설정해서 앞서 실습을 진행했다면 wildcard를 이용해서wildcards rule에 맞게 매칭되는지도 확인해보자.

Types of Ingress

Ingress backed by a single Service

하나의 서비스를 위한 Ingress 타입이다.
예시

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
spec:
  defaultBackend:
    service:
      name: test
      port:
        number: 80

apply 후 ingress를 확인해보면

NAME           CLASS         HOSTS   ADDRESS         PORTS   AGE
test-ingress   external-lb   *       123.0.123.123   80      10s

여기서 ADDRESS는 인그레스 컨트롤러가 할당한 IP

Simple fanout

HTTP URI에서 요청을 단일 IP 주소에서 1개 이상의 서비스로 트래픽을 라우팅한다.

예시

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-fanout-example
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 4200
      - path: /bar
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 8080

apply 결과

Name:             simple-fanout-example
Namespace:        default
Address:          178.91.123.132
Default backend:  default-http-backend:80 (10.8.2.3:8080)
Rules:
  Host         Path  Backends
  ----         ----  --------
  foo.bar.com
               /foo   service1:4200 (10.8.0.90:4200)
               /bar   service2:8080 (10.8.0.91:8080)
Events:
  Type     Reason  Age                From                     Message
  ----     ------  ----               ----                     -------
  Normal   ADD     22s                loadbalancer-controller  default/test

Name based virtual hosting

동일한 IP주소에서 여러 호스트 이름으로 HTTP 트래픽을 라우팅하는 것을 지원한다.

TLS

TLS 개인 키 및 인증서가 포함된 시크릿(Secret)을 지정해서 인그레스를 보호할 수 있다. 인그레스 리소스는 단일 TLS 포트인 443만 지원하고 인그레스 지점에서 TLS 종료를 가정한다(서비스 및 해당 파드에 대한 트래픽은 일반 텍스트임). 인그레스의 TLS 구성 섹션에서 다른 호스트를 지정하면, SNI TLS 확장을 통해 지정된 호스트이름에 따라 동일한 포트에서 멀티플렉싱 된다(인그레스 컨트롤러가 SNI를 지원하는 경우). TLS secret에는 tls.crt 와 tls.key 라는 이름의 키가 있어야 하고, 여기에는 TLS에 사용할 인증서와 개인 키가 있다.

Load balancing

인그레스 컨트롤러는 로드 밸런싱 알고리즘, 백엔드 가중치 구성표 등 모든 인그레스에 적용되는 일부 로드 밸런싱 정책 설정으로 부트스트랩된다. 보다 진보된 로드 밸런싱 개념(예: 지속적인 세션, 동적 가중치)은 아직 인그레스를 통해 노출되지 않는다. 대신 서비스에 사용되는 로드 밸런서를 통해 이러한 기능을 얻을 수 있다.

또한, 헬스 체크를 인그레스를 통해 직접 노출되지 않더라도, 쿠버네티스에는 준비 상태 프로브와 같은 동일한 최종 결과를 얻을 수 있는 병렬 개념이 있다는 점도 주목할 가치가 있다. 컨트롤러 별 설명서를 검토하여 헬스 체크를 처리하는 방법을 확인한다(예: nginx, 또는 GCE).

(이미지 출저: 공식 문서)

profile
안녕하세요.

0개의 댓글