Infograb logo
Kubernetes 클러스터 발견

Kubernetes 클러스터 발견은 클라우드 공급자에서 호스팅되는 Kubernetes 클러스터를 자동으로 발견하고 등록할 수 있습니다.

새로운 Kubernetes 클러스터를 발견할 때, Teleport는 클러스터에 구성 요소를 설치하지 않습니다. 대신 클러스터의 API에 대한 직접적인 접근과 최소한의 접근 권한이 필요합니다.

지원되는 클라우드

  • AWS: AWS EKS 클러스터에 대한 발견.
  • Azure: Azure AKS 클러스터에 대한 발견.
  • Google Cloud: Google Kubernetes Engine 클러스터에 대한 발견.

Kubernetes 클러스터 발견 작동 방식

Kubernetes 클러스터 발견은 두 단계로 구성됩니다:

클라우드 API 폴링

Teleport Discovery Service는 구성된 클라우드 공급자를 스캔하고, 어떤 Kubernetes 클러스터가 필터링 레이블 집합과 일치하는지를 식별하는 책임이 있습니다. 프로세스가 새로운 Kubernetes 클러스터를 식별하면 Teleport 내에서 동적 리소스를 생성합니다. 이 리소스는 클라우드 공급자로부터 가져온 정보가 포함되어 있습니다:

  • 이름: 클러스터 이름
  • 레이블
    • 클러스터 태그.
    • 클러스터 위치.
    • 클러스터가 속한 클라우드 계정의 식별 — AWS 계정 ID / Azure 구독 ID.

클러스터를 Teleport의 레지스트리에 다른 이름으로 가져올 수 있습니다. 이를 달성하려면 클라우드 공급자의 리소스에 다음 태그를 첨부해야 합니다 — EKS, AKS, GKE:

  • key: TeleportKubernetesName
  • value: 원하는 이름

Discovery Service는 클러스터가 태그를 포함하고 있는지 확인하고, 그 값을 Teleport의 리소스 이름으로 사용합니다.

이 기능은 동일한 이름의 클러스터가 서로 다른 지역/클라우드 공급자에 있을 때 충돌을 방지하기 위해 사용해야 합니다.

새로운 Kubernetes 클러스터를 감지하는 것 외에도, Discovery Service는 삭제되었거나 태그가 더 이상 필터링 레이블에 부합하지 않는 Kubernetes 클러스터를 Teleport의 레지스트리에서 제거합니다.

Discovery Service는 discovery_service.discovery_group이라는 구성 매개변수를 노출하여 발견된 리소스를 서로 다른 세트로 그룹화할 수 있도록 합니다. 이 매개변수는 서로 다른 세트의 클라우드 리소스를 모니터링하는 Discovery Agent가 서로 충돌하여 다른 서비스에 의해 생성된 리소스를 삭제하는 것을 방지하는 데 사용됩니다.

여러 Discovery Service를 실행할 때는 같은 클라우드 리소스를 모니터링하는 경우 각 서비스가 동일한 discovery_group 값을 사용하도록 구성되어야 하며, 서로 다른 클라우드 리소스를 모니터링하는 경우에는 서로 다른 값을 가져야 합니다.

같은 Teleport 클러스터 내에서 다양한 구성을 혼합하여 실행하는 것이 가능하므로 일부 Discovery Service는 동일한 클라우드 리소스를 모니터링하도록 구성할 수 있으며 다른 서비스는 서로 다른 리소스를 모니터링할 수 있습니다. 예를 들어, 두 개의 서로 다른 클라우드 계정에서 데이터를 분석하는 4-agent 고가용성 구성은 다음과 같이 설정됩니다.

  • Production 계정에서 데이터를 폴링하는 discovery_group: "prod"로 구성된 2개의 Discovery Service.
  • Staging 계정에서 데이터를 폴링하는 discovery_group: "staging"로 구성된 2개의 Discovery Service.

다음 스니펫은 Discovery Service의 다양한 구성 옵션과 기본값을 설명합니다.

# 이 섹션은 Discovery Service를 구성합니다
discovery_service:
    enabled: "yes"
    # discovery_group은 발견된 리소스를 서로 다른 세트로 그룹화하는 데 사용됩니다.
    # 이는 같은 클러스터에서 여러 Teleport Discovery 서비스가 실행되지만,
    # 서로 다른 클라우드 공급자 또는 클라우드 계정을 폴링할 때 유용합니다.
    # 발견된 서비스가 Teleport에서 충돌하는 것을 방지합니다.
    discovery_group: "prod"
    aws:
       # AWS 리소스 유형. 유효한 옵션은:
       # eks - AWS EKS 클러스터를 발견하고 등록합니다
       # ec2 - AWS EC2 머신을 발견하고 등록합니다
     - types: ["eks"]
       # 리소스를 검색할 AWS 지역
       regions: ["us-east-1", "us-west-1"]
       # 리소스를 등록할 때 일치하는 AWS 리소스 태그
       # 선택적 섹션: 기본값은 "*":"*"
       tags:
         "env": "prod"
       # AWS 계정에서 리소스를 찾을 때 가정할 AWS 역할.
       # 이 값은 EKS 클러스터를 폴링할 때 가정할 선택적 AWS 역할 ARN입니다.
       assume_role_arn: arn:aws:iam::123456789012:role/iam-discovery-role
       # 외부 ID는 제3자 서비스(위임된 접근)에서 AWS 계정에 접근할 때 설정해야 하는 선택적 값입니다.
       external_id: "example-external-id"
       # Discovery Service가 EKS 접근 항목을 생성해야 하는 선택적 역할.
       # 설정하지 않으면 Discovery Service는 자신의 신원을 사용하여 접근 항목을 생성하려고 시도합니다.
       # 사용되는 경우, 역할은 Teleport Kubernetes Service에 대해 구성된 역할과 일치해야 합니다.
       setup_access_for_arn: arn:aws:iam::123456789012:role/kube-service-role
    # Azure에서 호스팅되는 리소스를 발견하기 위한 매처.
    azure:
      # Azure 리소스 유형. 유효한 옵션은:
      # 'aks' - Azure AKS Kubernetes 클러스터를 발견하고 등록합니다.
    - types: ["aks"]
      # 리소스를 검색할 Azure 지역. 유효한 옵션은:
      # '*' - 모든 지역에서 리소스를 발견합니다(기본값).
      # 유효한 Azure 지역 이름. Azure "az" cli를 사용하여 모든 유효한 지역을 나열합니다: `az account list-locations -o table`
      regions: ["*"]
      # 리소스를 검색할 Azure 구독 ID. 유효한 옵션은:
      # '*' - 모든 구독에서 리소스를 발견합니다(기본값).
      # 어떤 subscription_id: `az account subscription list -o table`
      subscriptions: ["*"]
      # 리소스를 검색할 Azure 리소스 그룹. 유효한 옵션은:
      # '*' - 구성된 구독 내 모든 리소스 그룹에서 리소스를 발견합니다(기본값).
      # 어떤 resource_groups: `az group list -o table`
      resource_groups: ["*"]
      # 리소스를 일치시키는 데 사용되는 Azure 리소스 태그 필터.
      # 선택적 섹션: 기본값은 "*":"*"
      tags:
        "env": "prod"
    # GCP에서 호스팅되는 리소스를 발견하기 위한 매처.
    gcp:
      # GCP 리소스 유형. 유효한 옵션은:
      # 'gke' - GCP GKE Kubernetes 클러스터를 발견하고 등록합니다.
    - types: ["gke"]
      # 리소스를 검색할 GCP 위치. 유효한 옵션은:
      # '*' - 모든 위치에서 리소스를 발견합니다(기본값).
      # 유효한 GCP 지역 또는 존 이름.
      locations: ["*"]
      # GCP 프로젝트 ID
      project_ids: ["myproject"]
      # 리소스를 일치시키는 데 사용되는 GCP 리소스 태그 필터.
      # 선택적 섹션: 기본값은 "*":"*"
      tags:
        "*" : "*"

Kubernetes 클러스터로 요청 포워딩

Teleport Kubernetes Service는 Discovery Service에 의해 생성되거나 업데이트된 동적 리소스를 모니터링하고, 그들이 나타내는 Kubernetes 클러스터로 요청을 포워딩하는 책임이 있습니다. 올바르게 작동하기 위해, 대상 Kubernetes 클러스터에 대한 직접적인 접근과 요청을 포워딩할 수 있는 권한이 필요합니다.

Kubernetes Service에서 동적 리소스 모니터링을 활성화하려면, 다음 스니펫처럼 kubernetes_service.resources 섹션을 구성해야 합니다:

## 이 섹션은 Kubernetes Service를 구성합니다
kubernetes_service:
    enabled: "yes"
    # "tctl create" 명령 또는 Kubernetes 자동 발견을 통해 생성된 동적 Kubernetes 클러스터 리소스에 대한 매처.
    resources:
    - labels:
        "*": "*" # 이 서비스에 의해 모니터링할 클러스터를 제한하도록 구성될 수 있습니다.
      aws:
       # AWS 계정에서 EKS 클러스터에 접근할 때 가정할 역할.
       # 이 값은 EKS 클러스터로의 요청을 포워딩할 때 가정할 선택적 AWS 역할 ARN입니다.
       assume_role_arn: arn:aws:iam::123456789012:role/iam-discovery-role
       # 외부 ID는 제3자 서비스(위임된 접근)에서 AWS 계정에 접근할 때 설정해야 하는 선택적 값입니다.
       external_id: "example-external-id"

kubernetes_service.resources 매개 변수를 구성할 때, Teleport Kubernetes Service는 Teleport Discovery Service에 의해 발견된 EKS 클러스터를 모니터링하도록 설정됩니다. 모니터링 프로세스는 EKS 클러스터를 식별하고 관리하기 위한 레이블 매칭 메커니즘을 포함합니다.

  1. 발견 및 레이블 매칭: Discovery Service는 AWS 환경 내에서 사용 가능한 EKS 클러스터를 식별합니다. Teleport Kubernetes Service는 이 클러스터의 레이블을 kubernetes_service.resources[].labels 구성에 지정된 레이블과 비교합니다, 이것이 선택기 배열입니다.
  2. 역할 선택: 배열의 첫 번째 선택기가 EKS 클러스터의 레이블과 일치하는 경우, Kubernetes Service가 가정할 역할을 결정합니다. 이 역할은 Teleport Kubernetes Service가 AWS API로부터 필요한 클러스터 세부 정보를 가져오는 데 필수적입니다. 일치하는 것이 없으면 Kubernetes Service는 자신의 신원으로 기본 설정됩니다.
  3. AWS 및 Kubernetes API와의 상호작용: 일치가 발견되고 역할이 가정되면, Teleport Kubernetes Service는 이 역할을 사용하여 AWS API에 접근합니다. EKS 클러스터에 대한 구성 및 상태와 같은 정보를 조회합니다. 이후, Teleport Kubernetes Service는 Kubernetes API에 요청을 포워딩하여 클러스터와 상호작용할 수 있도록 합니다.

두 서비스 — Discovery 및 Kubernetes — 는 동일한 Teleport 프로세스 또는 별도의 프로세스에서 구성할 수 있습니다.

Teleport 원문 보기