Infograb logo
Kubernetes 앱 발견 아키텍처

Kubernetes 애플리케이션 자동 발견은 두 부분으로 구성됩니다:

  • Kubernetes 클러스터의 서비스 목록을 주기적으로 폴링
  • 해당 목록에 기반하여 Teleport 앱 생성 및 요청을 이를 프록시
Note

이는 Teleport 에이전트가 대상 Kubernetes 클러스터 내에서 실행될 때만 작동합니다.

Kubernetes 서비스 폴링

Kubernetes 클러스터에서 실행 중인 Discovery Service는 주기적으로 서비스를 나열하고 서비스 구성의 kubernetes 필드에 지정된 매처에 따라 필터링합니다. 서비스는 유형, 네임스페이스 및 서비스 레이블에 따라 필터링할 수 있습니다. kube-systemkube-public 네임스페이스에서 실행 중인 서비스는 자동으로 무시됩니다. 현재 기본적으로 모든 서비스는 "앱" 유형으로 간주되지만, Kubernetes 주석 teleport.dev/discovery-type를 사용하여 서비스에 대해 변경할 수 있습니다. 서비스의 유형이 매처에 지정된 것과 동일하지 않으면 서비스는 무시됩니다.

기본적으로 생성된 Teleport 앱의 이름은 Kubernetes 서비스 이름, 네임스페이스 및 Kubernetes 클러스터 이름으로 구성됩니다: $SERVICE_NAME-$NAMESPACE-$KUBE_CLUSTER_NAME. 해당 이름은 Kubernetes 주석 teleport.dev/name를 사용하여 변경할 수 있습니다.

서비스에서 노출된 모든 포트는 개별적으로 고려되므로, 하나의 Kubernetes 서비스는 여러 Teleport 앱 리소스의 생성을 초래할 수 있습니다. 이 경우 포트 이름은 앱 이름에 추가됩니다.

기본적으로 Discovery Service는 HTTP/HTTPS를 제공하는 포트만 노출하려고 시도합니다. 이 포트가 HTTP를 제공하는지 이해하기 위해, 발견 서비스는 여러 휴리스틱을 사용하거나 HEAD HTTP 요청으로 노출된 포트를 스캐닝하려고 시도합니다.

HTTP/HTTPS를 제공하는지 결정하기 위한 휴리스틱은 다음과 같습니다:

  • Kubernetes 서비스 포트 정의에 appProtocol 필드가 있고, 그 값이 http/https인 경우 URI에 사용됩니다.
  • 노출된 포트의 이름이 https이거나 숫자 값이 443인 경우 https가 사용됩니다.
  • Teleport는 포트에 HTTP 요청을 수행하여 HTTP/HTTPS 요청을 제공하는지 확인합니다.
  • 노출된 포트의 이름이 http이거나 숫자 값이 80 또는 8080인 경우 http가 사용됩니다.

그렇지 않으면 이 포트는 무시됩니다. 그러나 서비스에 주석 teleport.dev/protocol이 사용되고 그 값이 "tcp"인 경우, 이 포트는 TCP 앱으로 노출됩니다.

Teleport 앱 생성 및 요청 프록시

관련 Kubernetes 서비스가 나열되고 필터링된 후, Discovery Service는 Teleport 앱을 생성하며 기존 앱과 새 앱을 조정합니다:

  • 발견된 앱이 Teleport 백엔드에 없으면 생성됩니다.
  • 발견된 앱이 이미 백엔드에 있으면 업데이트됩니다.
  • 발견된 앱이 이미 백엔드에 있었지만 더 이상 Kubernetes 클러스터에서 발견되지 않으면 삭제됩니다.

앱 서비스는 Kubernetes 클러스터에서 실행되며 resources 필드에 지정된 레이블을 기반으로 앱을 프록시합니다. Discovery Service에 의해 생성된 모든 앱은 원본 서비스에서 레이블이 복사됩니다. 또한 레이블 teleport.dev/kubernetes-cluster가 앱에 설정되며 이는 원본 Kubernetes 클러스터의 이름과 같습니다. Discovery Service는 Kubernetes 클러스터 이름을 얻기 위해 discovery_group 속성을 사용합니다.

Teleport 원문 보기