인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
Kubernetes 앱 발견 아키텍처
Kubernetes 애플리케이션 자동 발견은 두 부분으로 구성됩니다:
- Kubernetes 클러스터에서 서비스 목록을 주기적으로 폴링
- 해당 목록을 기반으로 Teleport 앱 생성 및 요청을 프록시하는 것.
Note
이는 Teleport 에이전트가 대상 Kubernetes 클러스터 내에서 실행될 때만 작동합니다.
Kubernetes 서비스 폴링
Kubernetes 클러스터 내에서 실행되는 Discovery Service는 주기적으로 서비스를 나열하고 kubernetes
서비스 구성의 필드에 지정된 매처에 따라 필터링합니다. 서비스는 타입, 네임스페이스 및 서비스 레이블에 따라 필터링할 수 있습니다. kube-system
및 kube-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를 제공하는지 이해하기 위해, Discovery는 여러 휴리스틱을 사용하거나 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 서비스는 discovery_group
속성을 사용하여 Kubernetes 클러스터 이름을 가져옵니다.