Infograb logo
Teleport EKS 자동 검색

EKS 자동 검색은 클러스터의 태그가 구성된 레이블과 일치하는 경우 EKS 클러스터를 자동으로 검색하고 Teleport에 등록할 수 있습니다.

Teleport cluster 자동 발견은 두 가지 구성 요소로 이루어집니다:

  1. 새로운 cluster나 이전에 발견된 cluster의 변경 사항을 감시하는 Teleport Discovery Service입니다. 발견된 각 cluster는 Teleport 클러스터에서 kube_cluster 리소스로 동적으로 등록됩니다. 발견하는 cluster에 대한 연결이 필요하지 않습니다.

  2. Discovery Service에 의해 등록된 동적 kube_cluster 리소스를 모니터링하는 Teleport Kubernetes Service입니다. 이는 사용자와 cluster 간의 통신을 프록시합니다.

Tip

이 가이드는 같은 프로세스에서 Discovery Service와 Kubernetes 서비스를 실행하는 방법을 제시하지만, 두 서비스는 독립적으로 다른 기계에서도 실행될 수 있습니다.

예를 들어, cluster를 Teleport 클러스터에 등록하려는 경우, Kubernetes 서비스의 인스턴스를 같은 사설 네트워크에서 실행할 수 있으며, Discovery Service의 인스턴스는 원하는 네트워크에서 실행할 수 있습니다.

작동 방식

Teleport Discovery Service는 구성된 클라우드 프로바이더(AWS 포함)를 스캔하여 지정된 필터링 레이블과 일치하는 쿠버네티스 클러스터를 찾아, 식별된 새로운 클러스터에 대한 동적 리소스를 Teleport 내에서 생성합니다. Teleport Kubernetes Service는 이 동적 리소스를 모니터링하고 해당 쿠버네티스 클러스터에 요청을 전달합니다. 두 서비스 모두 기능을 수행하기 위해 AWS API에 대한 액세스가 필요합니다.

추가로, Kubernetes Service는 대상 클러스터에 대한 직접 액세스와 요청을 전달하는 데 필요한 권한이 필요합니다.

전제 조건

  • 실행 중인 Teleport 클러스터 버전 이상. Teleport를 시작하려면, 가입하기 위해 무료 평가판에 등록하거나 데모 환경 설정하기를 참조하세요.

  • tctl 관리 도구와 tsh 클라이언트 도구.

    tctltsh 다운로드에 대한 지침은 설치를 방문하세요.

  • IAM 정책을 생성하고 연결할 권한이 있는 AWS 계정.
  • Teleport Discovery 및 Kubernetes 서비스를 실행할 호스트.
  • 하나 이상의 EKS 클러스터가 실행 중이어야 합니다.
Note

Teleport v15.3.8부터는 Discovery Service가 검색된 각 클러스터에 대한 Access Entries를 자동으로 생성하고 관리하여 EKS 클러스터에 대한 액세스를 자체적으로 부트스트랩할 수 있습니다. 이는 이전 버전의 EKS 자동 검색과 대조적으로, 에이전트가 미리 구성된 액세스 없이 클러스터에 접근할 수 없었습니다.

단계 1/3. AWS IAM 자격 증명 설정

Teleport Discovery Service를 실행하는 인스턴스의 ID에 다음 AWS IAM 정책을 생성하고 연결하세요:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EKSDiscovery",
            "Effect": "Allow",
            "Action": [
              "eks:DescribeCluster",
              "eks:ListClusters"
            ],
            "Resource": "*"
        },
        {
            "Sid": "EKSManageAccess",
            "Effect": "Allow",
            "Action": [
              "eks:AssociateAccessPolicy",
              "eks:CreateAccessEntry",
              "eks:DeleteAccessEntry",
              "eks:DescribeAccessEntry",
              "eks:TagResource",
              "eks:UpdateAccessEntry"
            ],
            "Resource": "*"
        }
    ]
}
진술목적
EKSDiscoveryEKS 클러스터를 검색하고 추가 세부정보를 가져옵니다.
EKSManageAccess발견된 EKS 클러스터에 대해 Teleport 접근을 자동으로 설정합니다.

ARN 목록을 사용하여 권한의 범위를 특정 지역 또는 EKS 클러스터로 좁힐 수 있습니다. 리소스 ARN은 다음 형식을 가집니다:

arn:{Partition}:eks:{Region}:{Account}:cluster/{ClusterName}

EKSManageAccess 진술의 권한은 선택사항입니다. 이유는 Discovery Service가 발견하는 클러스터에 대한 Teleport Kubernetes Service 접근을 보장할 수 없을 때에도 EKS 클러스터를 검색할 수 있습니다. EKSManageAccess 권한 중 일부를 생략하면 Teleport Kubernetes Service가 각 EKS 클러스터에 접근할 수 있도록 보장하는 것은 귀하의 책임입니다.

단계 2/3. EKS 클러스터 권한 구성

Teleport Discovery v15.3.8 이상을 실행 중이며 Discovery Service에서 사용하는 IAM 역할에 Access Entries를 생성 및 업데이트할 수 있는 권한이 있는 경우, 이 섹션을 건너뛸 수 있습니다. 서비스는 필요한 권한을 자동으로 부트스트랩할 수 있습니다.

Kubernetes Service가 클러스터를 생성한 것과 다른 IAM 역할을 사용하는 경우, 각 검색된 클러스터의 aws-auth Configmap을 편집하여 Teleport IAM 역할과 Kubernetes RBAC 권한 간의 매핑을 구성해야 합니다.

Kubernetes 클러스터에 요청을 전달하기 위해, Teleport Kubernetes Service는 RBAC 사용자 및 그룹을 Impersonate할 수 있는 클러스터 전체 권한과 SelfSubjectAccessReviews, SelfSubjectRulesReviews를 생성할 수 있는 권한 및 마지막으로 Pods에 대한 읽기 권한이 필요합니다.

Kubernetes 클러스터에 필요한 권한이 있는 RBAC 그룹이 없다면, ClusterRole, ClusterRoleBinding을 생성하고 매핑을 만들려면 Creating RBAC group 가이드를 따르세요. 이미 요구되는 권한을 충족하는 RBAC 그룹이 존재하는 경우, 이를 재사용하고 Teleport Kubernetes Service에서 사용하는 IAM 역할로 매핑할 수 있습니다. 간단함을 위해, Teleport IAM 역할을 system:masters와 같은 내장 Kubernetes RBAC 그룹에 매핑하는 것도 가능합니다. 하지만 프로덕션에서는 권장하지 않습니다.

대상 클러스터에 자격 증명을 사용하여 연결하고, kubectl을 사용하여 다음 리소스를 생성하세요.

ClusterRole

Teleport Kubernetes Service가 클러스터에 요청을 전달할 수 있도록 필요한 권한이 있는 ClusterRole RBAC 정의를 생성하세요.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: teleport
rules:
- apiGroups:
  - ""
  resources:
  - users
  - groups
  - serviceaccounts
  verbs:
  - impersonate
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - "authorization.k8s.io"
  resources:
  - selfsubjectaccessreviews
  - selfsubjectrulesreviews
  verbs:
  - create

ClusterRoleBinding

이전에 생성한 ClusterRoleteleport RBAC 그룹에 연결합니다.

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: teleport
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: teleport
subjects:
- kind: Group
  name: teleport
  apiGroup: rbac.authorization.k8s.io

IAM 매핑

EKS 액세스 항목을 생성하여 arn:aws:iam::222222222222:role/teleport-role 를 이전 단계에서 생성한 Kubernetes 그룹 teleport에 연결합니다.

$ aws eks create-access-entry \
  --cluster-name eks-cluster \
  --region eu-west-1 \
  --principal-arn arn:aws:iam::222222222222:role/teleport-role \
  --kubernetes-groups teleport

{
  ...
}

마지막으로, kube-system 네임스페이스의 configmap/aws-auth를 편집하고 다음 내용을 mapRoles에 추가합니다. {teleport_aws_iam_role}을 Teleport Kubernetes Service가 사용할 적절한 IAM 역할로 교체하세요. 이 단계는 Teleport IAM 역할을 Kubernetes RBAC 그룹 teleport에 연결하여 Teleport Kubernetes Service가 클러스터에 요청을 전달할 수 있게 합니다.

apiVersion: v1
data:
  mapRoles: |
    - groups:
      - teleport
      rolearn: {teleport_aws_iam_role} # e.g. arn:aws:iam::222222222222:role/teleport-role
      username: teleport

이 시점에서 Teleport IAM 역할은 클러스터에 요청을 전달하기 위한 최소한의 권한을 가지고 있습니다.

Teleport IAM 역할을 기존 Kubernetes RBAC 그룹과 연결하려면, kube-system 네임스페이스의 configmap/aws-auth를 편집하고 다음 내용을 mapRoles에 추가하세요.

apiVersion: v1
data:
  mapRoles: |
  ...
    - groups:
      - {rbac_group}
      rolearn: {teleport_aws_iam_role} # e.g. arn:aws:iam::222222222222:role/teleport-role
      username: teleport

{teleport_aws_iam_role}을 Teleport Kubernetes Service가 사용하는 적절한 IAM 역할로 바꾸고, {rbac_group}을 필요한 권한을 만족하는 기존 Kubernetes RBAC 그룹으로 교체하세요.

이 시점에서 Teleport IAM 역할은 클러스터에 요청을 전달하기 위한 최소한의 권한을 가지고 있습니다.

system:masters 그룹을 Teleport 서비스와 연결된 IAM 역할에 부여하면, Kubernetes 클러스터에서 관리자 수준의 권한을 부여하는 것입니다. 최소 권한 원칙을 따르기 위해 이 방법은 프로덕션에서 사용하지 않는 것이 권장됩니다.

EKS 액세스 항목과 액세스 정책을 생성하여 arn:aws:iam::222222222222:role/teleport-role 를 클러스터 전체 정책 arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy (동일한 cluster-admin ClusterRole에 해당)과 연결합니다.

$ aws eks create-access-entry \
  --cluster-name eks-cluster \
  --region eu-west-1 \
  --principal-arn arn:aws:iam::222222222222:role/teleport-role

{
  ...
}

$ aws eks associate-access-policy \
  --cluster-name eks-cluster \
  --region eu-west-1 \
  --principal-arn arn:aws:iam::222222222222:role/teleport-role
  --policy-arn "arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy" \
  --access-scope type=cluster

{
  ...
}

system:masters RBAC 그룹과 Teleport IAM 역할을 연결하려면, kube-system 네임스페이스의 configmap/aws-auth를 편집하고 다음 내용을 mapRoles에 추가하세요.

apiVersion: v1
data:
  mapRoles: |
  ...
    - groups:
      - system:masters
      rolearn: {teleport_aws_iam_role} # e.g. arn:aws:iam::222222222222:role/teleport-role
      username: teleport

{teleport_aws_iam_role}을 Teleport Kubernetes Service가 사용하는 적절한 IAM 역할로 교체하세요.

이 시점에서 Teleport IAM 역할은 클러스터에 요청을 전달하기 위한 최소한의 권한을 가지고 있습니다.

EKS 클러스터를 terraform, eksctl 또는 Cloudformation과 같은 도구를 사용하여 프로비저닝하는 경우, 클러스터 프로비저닝 중에 aws-auth Configmap 또는 액세스 항목을 자동으로 구성하고 ClusterRoleClusterRoleBinding 리소스를 생성하는 데 사용할 수 있습니다.

단계 3/3. Teleport를 구성하여 EKS 클러스터를 검색

조인 토큰 받기

Teleport EKS 자동 검색은 Discovery 및 Kubernetes 서비스가 클러스터에 조인하기 위해 유효한 Teleport 인증 토큰이 필요합니다. 이를 생성하려면 Teleport Auth Service에 대해 다음 명령어를 실행하고 Kubernetes Discovery를 실행할 기계의 /tmp/token에 저장하세요:

tctl tokens add --type=discovery,kube

Teleport Kubernetes 및 Discovery 서비스 구성

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.

EKS 자동 검색을 활성화하려면 discovery_service.aws 섹션에 최소 하나의 항목이 포함되어야 하고, discovery_service.aws.typeseks가 포함되어야 합니다. 또한, kubernetes_service.resources.tagsdiscovery_service.aws.tags에 구성된 동일한 레이블 또는 해당 서브셋으로 설정하여 Kubernetes Service가 Discovery Service에 의해 생성된 동적 리소스를 수신하도록 설정해야 합니다.

version: v3
teleport:
  join_params:
    token_name: "/tmp/token"
    method: token
  proxy_server: teleport.example.com:443
auth_service:
  enabled: off
proxy_service:
  enabled: off
ssh_service:
  enabled: off
discovery_service:
  enabled: "yes"
  discovery_group: "aws-prod"
  aws:
   - types: ["eks"]
     regions: ["*"]
     tags:
       "env": "prod" # EKS 클러스터 태그에 맞췄습니다: tag:env=prod
kubernetes_service:
  enabled: "yes"
  resources:
  - labels:
      "env": "prod" # 이전에 지정된 Kubernetes 클러스터 레이블과 일치합니다.

Kubernetes 및 Discovery 서비스 시작

Kubernetes 및 Discovery 서비스에 AWS에 인증하는 데 사용할 수 있는 자격 증명에 대한 액세스를 부여합니다.

Kubernetes 및 Discovery 서비스를 EC2 인스턴스에서 실행하는 경우 EC2 인스턴스 메타데이터 서비스 방법을 사용할 수 있습니다. 그렇지 않은 경우 환경 변수를 사용해야 합니다:

Teleport는 EC2 인스턴스에서 실행될 때 이를 감지하고 인스턴스 메타데이터 서비스를 사용하여 자격 증명을 가져옵니다.

EC2 인스턴스는 EC2 인스턴스 프로파일을 사용하도록 구성되어 있어야 합니다. 자세한 내용은 인스턴스 프로파일 사용하기를 참조하세요.

Teleport의 내장 AWS 클라이언트는 다음 환경 변수에서 자격 증명을 읽습니다:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_DEFAULT_REGION

Kubernetes 및 Discovery 서비스를 시작하면 서비스는 /etc/default/teleport 경로의 파일에서 환경 변수를 읽습니다. 이 자격 증명은 귀하의 조직에서 가져오십시오. /etc/default/teleport에 다음 내용을 포함하고 각 변수의 값을 대체해야 합니다:

AWS_ACCESS_KEY_ID=00000000000000000000
AWS_SECRET_ACCESS_KEY=0000000000000000000000000000000000000000
AWS_DEFAULT_REGION=<YOUR_REGION>

Teleport의 AWS 클라이언트는 자격 증명을 다음 순서로 다양한 출처에서 로드합니다:

  • 환경 변수
  • 공유 자격 증명 파일
  • 공유 구성 파일 (Teleport는 항상 공유 구성을 활성화합니다)
  • EC2 인스턴스 메타데이터 (자격 증명 전용)

공유 자격 증명 파일 또는 공유 구성 파일을 통해 AWS 자격 증명을 제공할 수 있지만, Kubernetes 및 Discovery 서비스를 실행할 때 AWS_PROFILE 환경 변수를 선택한 프로파일의 이름으로 지정해야 합니다.

위의 지침이 고려하지 않은 특정 사용 사례가 있는 경우, 자격 증명 로딩 동작에 대한 자세한 설명을 보려면 AWS SDK for Go의 문서를 참조하십시오.

호스트가 부팅될 때 Kubernetes 및 Discovery 서비스가 자동으로 시작되도록 시스템 데몬 서비스를 생성하여 구성합니다. 지침은 Kubernetes 및 Discovery 서비스를 설치한 방법에 따라 다릅니다.

Kubernetes 및 Discovery 서비스를 실행할 호스트에서 Teleport를 활성화하고 시작하십시오:

sudo systemctl enable teleport
sudo systemctl start teleport

Kubernetes 및 Discovery 서비스를 실행할 호스트에서 Teleport에 대한 시스템 데몬 서비스 구성을 생성하고, Teleport 서비스를 활성화한 후 Teleport를 시작하십시오:

sudo teleport install systemd -o /etc/systemd/system/teleport.service
sudo systemctl enable teleport
sudo systemctl start teleport

Kubernetes 및 Discovery 서비스의 상태는 systemctl status teleport로 확인할 수 있으며, 로그는 journalctl -fu teleport로 볼 수 있습니다.

Kubernetes 및 Discovery 서비스가 시작되면, AWS 섹션에 지정된 태그와 지역과 일치하는 EKS 클러스터가 자동으로 Teleport 클러스터에 추가됩니다.

문제 해결

Discovery Service 문제 해결

먼저, 발견된 Kubernetes cluster가 있는지 확인하세요. 이렇게 하려면 tctl get kube_cluster 명령을 사용하여 예상되는 Kubernetes cluster가 이미 Teleport 클러스터에 등록되었는지 확인할 수 있습니다.

목록에 일부 Kubernetes cluster가 나타나지 않으면, Discovery Service 선택기 레이블이 누락된 Kubernetes cluster 태그와 일치하는지 확인하거나 Discovery Service 로그에서 권한 오류를 확인하세요.

Discovery Service가 올바른 AWS 계정의 자격 증명으로 실행되고 있는지 확인하세요. 다른 AWS 계정에서 리소스를 발견할 수 있지만, 그럴 경우 다른 AWS 계정에서 역할을 맡도록 구성되어야 합니다.

한 개 이상의 Discovery Service가 실행되고 있는지 확인하세요:

tctl inventory status --connected

여러 개의 Discovery Service를 실행하는 경우, 각 서비스가 동일한 클라우드 Kubernetes cluster를 감시하는 경우는 동일한 discovery_group 값으로 구성되어야 하며, 다른 클라우드 Kubernetes cluster를 감시하는 경우는 서로 다른 값으로 구성되어야 합니다. 이것이 올바르게 구성되지 않으면, 일반적인 증상은 kube_cluster 리소스가 Teleport 클러스터의 레지스트리에서 간헐적으로 삭제되는 것입니다.

Kubernetes 서비스 문제 해결

tctl get kube_cluster 명령이 발견된 클러스터를 반환하지만 tctl kube ls 명령에 포함되지 않는 경우, kubernetes_service.resources 섹션이 올바르게 설정되었는지 확인하세요.

kubernetes_service:
  enabled: "yes"
  resources:
  - labels:
      "env": "prod"

섹션이 올바르게 구성되었지만 클러스터가 여전히 나타나지 않거나 인증 오류가 반환되는 경우, 대상 클러스터에서 권한이 올바르게 구성되었는지 또는 Teleport에서 Kubernetes 클러스터를 나열할 수 있는 올바른 권한이 있는지 확인하세요.

Teleport 원문 보기