본문 바로가기
WIKI 기술 지식 베이스

Kubernetes IngressRouteTCP

원문 보기 위키 갱신

출처: Kubernetes IngressRouteTCP

본문

IngressRouteTCP

IngressRouteTCP는 Traefik TCP 라우터의 CRD 구현이에요.

IngressRouteTCP 객체를 만들기 전에 Traefik Kubernetes CRD를 Kubernetes 클러스터에 적용해야 해요.

이렇게 하면 IngressRouteTCP kind와 기타 Traefik 전용 리소스가 등록돼요.

일반

HTTP 라우터와 TCP 라우터가 모두 같은 EntryPoint에 연결된 경우, TCP 라우터가 HTTP 라우터보다 먼저 적용돼요. TCP 라우터에 일치하는 라우트가 없으면 HTTP 라우터가 처리해요.

Configuration Example (설정 예시)

IngressRouteTCP는 아래와 같이 선언할 수 있어요:

IngressRouteTCP

apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: ingressroutetcpfoo
  namespace: apps

spec:
  ingressClassName: traefik-lb
  entryPoints:
    - footcp
  routes:
  - match: HostSNI(`*`)
    priority: 10
    middlewares:
    - name: middleware1
      namespace: default
    services:
    - name: foo
      port: 8080
      weight: 10
      serversTransport: transport
      nativeLB: true
      nodePortLB: true

  tls:
    secretName: supersecret
    options:
      name: opt
      namespace: default
    certResolver: foo
    domains:
    - main: example.net
      sans:
      - a.example.net
      - b.example.net
    passthrough: false

Configuration Options (설정 옵션)

| Field | Description | Default | Required | | ingressClassName | 사용할 IngressClass 클러스터 리소스를 정의해요. 더 이상 사용되지 않는 kubernetes.io/ingress.class 어노테이션을 대체해요. spec 필드가 어노테이션보다 우선해요. | | No | | entryPoints | 엔트리포인트 이름 목록이에요. | | No | | routes | 라우트 목록이에요. | | Yes | | routes[n].match | 기본 라우터의 규칙을 정의해요. | | Yes | | routes[n].priority | 라우트 매칭을 위해 같은 길이의 규칙을 구분하는 우선순위를 정의해요. | | No | | routes[n].middlewares[n].name | MiddlewareTCP 이름을 정의해요. | | Yes | | routes[n].middlewares[n].namespace | MiddlewareTCP 네임스페이스를 정의해요. | "" | No | | routes[n].services | Kubernetes service 정의 목록이에요. | | No | | routes[n].services[n].name | Kubernetes service의 이름을 정의해요. | | Yes | | routes[n].services[n].namespace | 참조된 Kubernetes service의 네임스페이스를 정의해요. | "" | No | | routes[n].services[n].port | Kubernetes service의 포트를 정의해요. 명명된 포트에 대한 참조일 수 있어요. | | Yes | | routes[n].services[n].weight | 서버 로드 밸런싱에 적용할 가중치를 정의해요. | 1 | No | | routes[n].services[n].proxyProtocol | PROXY 프로토콜 구성을 정의해요. | | No | | routes[n].services[n].proxyProtocol.version | PROXY 프로토콜 버전을 정의해요. | | No | | routes[n].services[n].serversTransport | ServersTransportTCP를 정의해요. ServersTransport 네임스페이스는 Kubernetes service 네임스페이스로 가정해요. | | No | | routes[n].services[n].tls | 백엔드에 연결할 때 TLS를 사용할지 결정해요. | false | No | | routes[n].services[n].nativeLB | 로드 밸런서를 만들 때 LB의 자식이 파드 IP인지, 아니면 유일한 자식이 Kubernetes Service clusterIP인지 제어해요. 자세한 내용은 여기를 참고해 주세요. | false | No | | routes[n].services[n].nodePortLB | 서비스 타입이 NodePort일 때 로드 밸런서를 만들 때 LB의 자식이 nodePort를 사용하는 노드 내부 IP인지 제어해요. Traefik이 Kubernetes 클러스터 외부에 있지만 노드와 같은 네트워크 안에서 실행될 때 서비스에 도달할 수 있게 해 줘요. | false | No | | tls | TLS 인증서 구성을 정의해요. | | No | | tls.secretName | 인증서를 저장하는 데 사용되는 시크릿 이름(IngressRoute 네임스페이스)을 정의해요. | "" | No | | tls.options | TLSOption에 대한 참조를 정의해요. | "" | No | | tls.options.name | TLSOption 이름을 정의해요. | "" | No | | tls.options.namespace | TLSOption 네임스페이스를 정의해요. | "" | No | | tls.store | TLSStore에 대한 참조를 정의해요. default TLSStore만 사용할 수 있다는 점에 유의하세요. | | No | | tls.certResolver | CertResolver에 대한 참조를 정의해요. | "" | No | | tls.domains | 도메인 목록이에요. | "" | No | | tls.domains[n].main | 주요 도메인 이름을 정의해요. | "" | No | | tls.domains[n].sans | SAN(대체 도메인) 목록이에요. | "" | No | | tls.passthrough | true이면 TLS 종료를 백엔드에 위임해요. | false | No |

ExternalName Service

Traefik은 도메인과 포트가 있는 백엔드에 연결해요. 다만 Kubernetes ExternalName Service는 포트 없이 정의될 수 있어요. 따라서 Traefik은 다음과 같은 두 가지 방식으로 포트 정의를 지원해요:

  • IngressRouteTCP service에만 정의

  • 양쪽 모두에 정의(포트가 일치하지 않으면 경고가 표시되고 IngressRouteTCP service 포트가 사용돼요)

따라서 양쪽에 포트가 정의된 경우 Traefik은 포트가 일치하기를 기대해요.

Resource에 포트가 정의된 경우

IngressRouteTCP

apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: test.route
  namespace: apps

spec:
  entryPoints:
    - foo
  routes:
  - match: Host(`example.net`)
    services:
    - name: external-svc
      port: 80

Service ExternalName

apiVersion: v1
kind: Service
metadata:
  name: external-svc
  namespace: apps

spec:
  externalName: external.domain
  type: ExternalName

Service에 포트가 정의된 경우

IngressRouteTCP

apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: test.route
  namespace: apps

spec:
  entryPoints:
    - foo
  routes:
  - match: Host(`example.net`)
    services:
    - name: external-svc

Service ExternalName

apiVersion: v1
kind: Service
metadata:
  name: external-svc
  namespace: apps

spec:
  externalName: external.domain
  type: ExternalName
  ports:
    - port: 80

양쪽에 포트가 정의된 경우

IngressRouteTCP

apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: test.route
  namespace: apps

spec:
  entryPoints:
    - foo
  routes:
  - match: Host(`example.net`)
    services:
    - name: external-svc
      port: 80

Service ExternalName

apiVersion: v1
kind: Service
metadata:
  name: external-svc
  namespace: apps

spec:
  externalName: external.domain
  type: ExternalName
  ports:
    - port: 80

NativeLB

파드 IP로 서버 로드 밸런서를 만들지 않고 Kubernetes Service clusterIP를 직접 사용하려면 NativeLB 옵션을 true로 설정해야 해요. 기본적으로 NativeLB는 false예요.

IngressRouteTCP

apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: test.route
  namespace: default
spec:
  entryPoints:
    - foo
  routes:
  - match: HostSNI(`*`)
    services:
    - name: svc
      port: 80
      # Here, nativeLB instructs to build the servers load balancer with the Kubernetes Service clusterIP only.
      nativeLB: true

Service

apiVersion: v1
kind: Service
metadata:
  name: svc
  namespace: default
spec:
  type: ClusterIP
  ...

더 알아보기 (Learn more)