Infograb logo
Kubernetes 클러스터 발견

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

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

지원되는 클라우드

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

Kubernetes 클러스터 발견 방식

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

클라우드 API 폴링

Teleport Discovery 서비스는 구성된 클라우드 공급자를 스캔하고, 필터링 라벨 세트에 맞는 Kubernetes 클러스터가 있는지 식별하는 역할을 합니다. 프로세스가 새로운 Kubernetes 클러스터를 식별하면, Teleport 내에 동적 리소스를 생성합니다. 이 리소스는 클라우드 공급자로부터 가져온 정보가 포함되어 있습니다:

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

클러스터를 Teleport의 레지스트리에 다른 이름으로 가져올 수 있습니다. 이를 위해서는 클라우드 공급자의 리소스에 다음 태그를 붙여야 합니다 — EKS, AKS, GKE — :

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

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

동일한 이름의 클러스터가 서로 다른 리전/클라우드 공급자에 존재할 때 이 기능을 사용하여 Teleport 내에서 충돌을 방지해야 합니다.

새로운 Kubernetes 클러스터를 감지하는 것 외에도, Discovery 서비스는 삭제된 Kubernetes 클러스터 또는 태그가 더 이상 필터링 라벨을 충족하지 않는 Kubernetes 클러스터를 Teleport의 레지스트리에서 제거합니다.

Discovery Service는 발견된 리소스를 서로 다른 집합으로 그룹화할 수 있는 구성 매개변수 - discovery_service.discovery_group - 를 노출합니다. 이 매개변수는 서로 다른 클라우드 리소스 집합을 감시하는 Discovery Agents들이 충돌하여 다른 서비스에 의해 생성된 리소스를 삭제하는 것을 방지하는 데 사용됩니다.

여러 Discovery Services를 실행할 때, 동일한 클라우드 리소스를 감시하는 경우 각 서비스가 동일한 discovery_group 값으로 구성되어야 하며, 서로 다른 클라우드 리소스를 감시하는 경우에는 다른 값으로 구성해야 합니다.

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

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

다음 코드는 Discovery 서비스의 다양한 구성 옵션 및 기본 값을 설명합니다.

# 이 섹션은 Discovery 서비스를 구성합니다.
discovery_service:
  enabled: "yes"
  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는 타사 서비스(위임된 접근)에서 AWS 계정에 접근할 때 설정해야 하는 선택적 값입니다.
      external_id: "example-external-id"
      # Discovery 서비스가 EKS 접근 항목을 생성해야 하는 선택적 역할.
      # 설정하지 않으면 Discovery 서비스는 자신의 신원을 사용하여 접근 항목을 생성하려고 시도합니다.
      # 사용할 경우, 해당 역할은 Teleport Kubernetes 서비스에 구성된 역할과 일치해야 합니다.
      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. 유효한 옵션은:
      # '*' - 모든 구독에서 리소스를 발견합니다(기본값).
      # 구독 ID: `az account subscription list -o table`
      subscriptions: ["*"]
      # 리소스를 검색할 Azure 리소스 그룹. 유효한 옵션은:
      # '*' - 구성된 구독 내 모든 리소스 그룹에서 리소스를 발견합니다(기본값).
      # 모든 리소스 그룹: `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 서비스는 Discovery 서비스에 의해 생성되거나 업데이트된 동적 리소스를 모니터링하고 이를 나타내는 Kubernetes 클러스터에 요청을 전달하는 역할을 합니다. 제대로 작동하기 위해서는 대상 Kubernetes 클러스터에 직접 접근할 수 있어야 하며 요청을 전달할 수 있는 권한이 필요합니다.

Kubernetes 서비스에서 동적 리소스 모니터링을 활성화하려면 다음 코드 조각과 같이 kubernetes_service.resources 섹션을 구성해야 합니다:

## 이 섹션은 Kubernetes 서비스를 구성합니다
kubernetes_service:
  enabled: "yes"
  # "tctl create" 명령어 또는 Kubernetes 자동 검색으로 생성된 동적 Kubernetes 클러스터 리소스에 대한 매처입니다.
  resources:
    - labels:
        "*": "*" # 이 서비스에서 모니터링할 클러스터를 제한하도록 구성할 수 있습니다.
      aws:
        # AWS 계정에서 EKS 클러스터에 접근할 때 가정할 AWS 역할입니다.
        # 이 값은 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 서비스는 Teleport Discovery 서비스에 의해 발견된 EKS 클러스터를 모니터링하도록 설정됩니다. 모니터링 프로세스에는 EKS 클러스터를 식별하고 관리하기 위한 레이블 매칭 메커니즘이 포함됩니다.

  1. 발견 및 레이블 매칭: Discovery 서비스는 AWS 환경 내에서 사용 가능한 EKS 클러스터를 식별합니다. Teleport Kubernetes 서비스는 이러한 클러스터의 레이블을 kubernetes_service.resources[].labels 구성에 지정된 레이블과 비교하며, 이는 선택자 배열입니다.
  2. 역할 선택: 배열에서 레이블과 일치하는 첫 번째 선택자가 EKS 클러스터의 역할을 결정합니다. 이 역할은 Teleport Kubernetes 서비스가 AWS API에서 필요한 클러스터 세부정보를 검색하는 데 필수적입니다. 일치하는 항목이 없으면 Kubernetes 서비스는 자신의 정체성으로 기본값을 사용합니다.
  3. AWS 및 Kubernetes API와의 상호작용: 일치 항목이 발견되고 역할이 가정되면 Teleport Kubernetes 서비스는 이 역할을 사용하여 AWS API에 접근합니다. EKS 클러스터의 구성 및 상태와 같은 정보를 검색합니다. 그 후, Teleport Kubernetes 서비스는 Kubernetes API에 요청을 전달하여 클러스터와의 상호작용을 가능하게 합니다.

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

Teleport 원문 보기