[Kubernetes] Ingress 란?

김지환·2023년 1월 28일
1

Ingress 란?

외부에서 들어온 HTTP, HTTPS 를 Cluster 내부의 Service로 라우트 시켜준다.

Traffic은 Ingress resource 에서 정의된 방식으로 route 되게 된다.

인그레스는 외부에서 서비스로 접속이 가능한 URL, 로드밸런스 트래픽, SSL/TLS 그리고 이름기반의 가상 호스팅을 구성할 수 있다.

하지만 Ingress 는 HTTP/HTTPS 요청만을 다루고 그외에 다른 요청에 대해 서비스를 오픈하기 위해서는 Service.Type = NodePort, LoadBalancer를 설정해 주어야한다.

Ingress 사용하기

Ingress를 정의한다고해서 그 기능을 바로 사용할 수 있지는 않다.

IngressController가 존재해야 Ingress가 제 기능을 할 수 있게 된다.
Kubernetes에서 공식 지원하고 있는 Ingress Controller는 AWS, GCP 그리고 Nginx가 있다.

IngressController는 각자 사용자의 상황에 맞게 설치해서 사용하면 된다.
하나의 클러스터에 여러개의 IngressController를 사용할 수도 있는데 이 때는 IngressClass 에 controller를 명시하고 Ingress.spec.ingressClassName 을 명시하는 방식으로 싱크를 맞출 수 있다.

Ingress 명세 보기

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - host: "foo.bar.com"
  	http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test
            port:
              number: 80

metadata.name

Ingress.metadata.name 은 DNS 도메인 룰을 따라서 영숫자, -, . 만으로 구성되어야 한다. 해당 이름이 DNS 역할을 하기 때문

spec.ingressClassname

spec 에는 사용할 ingressClassName 을 명시할 수 있다. 만약 따로 명시하지 않으면 default ingressController를 사용하게 된다.

rules

rules를 살펴보면 host, http 필드가 있다.

rules.host

host 필드는 해당 hostname을 host의 value 값으로 지정함을 의미한다. 와일드 카드를 적용할 수도 있지만 와일드 카드는 . 을 기준으로 구분 된다.

rules.http

http 필드는 paths 아래로 여러 path 들을 지정할 수 있게 된다. 해당 path 를 지정하고 pathType 을 통해서 Prefix, Exact, ImplementationSpecific 3가지 타입으로 정의할 수 있다.

그리고 해당 path 와 연결되는 backend를 service.name, service.port.number 를 정의하여 연결지을 수 있다.

pathType 종류

  • Prefix: / 를 기준으로 접두사 기준 filtering을 하게 된다. 예를 들어 /foo/bbb 일 대 /foo/bbb/, /foo/bbb, /foo/bbb/abc 모두 일치하여 routing 되지만 /foo/bb 와 같은 값은 통과하지 못하게 된다.
  • Exact: 정확히 일치하는 값만을 통과시킨다.
  • ImplementationSpecific: IngressClass 에서 정의한 값을 따라서 routing 이 되는 방식으로 아무 설정을 해주지 않았을 때 default로 작동한다. IngressClass의 정의에 따라 달라질 수 있다.

만약 다중일치가 일어나는 경우 같은 조건에서는 긴 일치값으로 routing 되게 되고 Prefix 보다는 Exact가 더 높은 우선순위를 갖게 된다.

IngressClass

위에서 잠깐 설명한 IngressClass는 여러 Ingress Controller를 사용할 때 사용할 수 있다.

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: external-lb
spec:
  controller: example.com/ingress-controller
  parameters:
    apiGroup: k8s.example.com
    kind: IngressParameters
    name: external-lb

spec.controller

를 통해서 Ingress Controller를 정의할 수 있다.

spec.parameters

IngressClass 에 대한 추가 환경설정 값들이 정의되어 있는 값을 참조하기 위해서 사용된다.
해당 apiGroup, kind, name 을 정의하여 참조하게 된다.

parameter에 대한 scope도 지정이 가능한데 Cluster, Namespace 두 가지로 설정이 가능하다.

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: external-lb-2
spec:
  controller: example.com/ingress-controller
  parameters:
    # 이 인그레스클래스에 대한 파라미터는 
    # "external-configuration" 네임스페이스에 있는
    # "external-config" 라는 IngressParameter(API 그룹 k8s.example.com)에 기재되어 있다.
    scope: Namespace 
    apiGroup: k8s.example.com
    kind: IngressParameter
    namespace: external-configuration
    name: external-config
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: external-lb-1
spec:
  controller: example.com/ingress-controller
  parameters:
    # 이 인그레스클래스에 대한 파라미터는 "external-config-1" 라는
    # ClusterIngressParameter(API 그룹 k8s.example.net)에 기재되어 있다.
    # 이 정의는 쿠버네티스가 
    # 클러스터 범위의 파라미터 리소스를 검색하도록 한다.
    scope: Cluster
    apiGroup: k8s.example.net
    kind: ClusterIngressParameter
    name: external-config-1

default ingressClass

IngressClass의 metadata.annotation 에 다음과 같은 표현을 사용하여 ingressClassName이 명시되지 않은 ingress 에 대하여 기본 ingressClass를 적용시킬 수 있다.

만양 default 설정이된 ingressClass가 2개 이상이라면 ingressClassName을 명시하지 않았을 때 ingress 가 생성되지 않는다.

ingressclass.kubernetes.io/is-default-class: "true"
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  labels:
    app.kubernetes.io/component: controller
  name: nginx-example
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: k8s.io/ingress-nginx

Ingress 설정 팁

AWS 에서도 여러 ingressClass 가 존재한다.
그 중에서 alb ( application load balancer ) 에서 알아두면 좋을 것 같은 annotation 들을 정리

annotation 설정

alb.ingress.kubernetes.io/scheme: internet-facing / internal
alb.ingress.kubernetes.io/target-type: ip / instance             
alb.ingress.kubernetes.io/load-balancer-name: foo
alb.ingress.kubernetes.io/group.name: bar 
alb.ingress.kubernetes.io/group.order: '2'
  • alb.ingress.kubernetes.io/scheme: 로드밸런서를 internal 로 사용할지 외부와의 연결도 가능하게 설정할지를 정할 수 있음.
  • alb.ingress.kubernetes.io/target-type: Loadbalancer 가 traffic routing을 pod ip 에 직접 넣을 것인지 혹은 nodeport가 열려있는 모든 instance에 traffic을 routing할 것인지를 정할 수 있다.
  • alb.ingress.kubernetes.io/load-balancer-name: 로드 밸런서의 이름을 설정.
  • alb.ingress.kubernetes.io/group.name: 여러 ingress resource를 group으로 묶어서 사용할 수 있는데 이 때 묶을 ingressGroup 의 이름을 정의 ( 명시하지 않으면 implicit ingressGroup으로 처리됨 )
  • alb.ingress.kubernetes.io/group.order: ingressGroup 내에서의 우선순위 level 로 1-1000까지 지정가능.

alb ingressClass 를 사용하기 위해서 ingressClassName: alb 로 지정해줘야함!

Reference

https://kubernetes.io/ko/docs/concepts/services-networking/ingress/

profile
Developer

0개의 댓글