인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
Teleport EKS 자동 발견
EKS 자동 발견은 태그가 구성된 레이블과 일치하는 경우 자동으로 모든 EKS 클러스터를 발견하고 Teleport에 등록할 수 있습니다.
Teleport cluster 자동 검색에는 두 가지 구성 요소가 포함됩니다:
- 새로운 cluster 또는 이전에 발견된 cluster의 변경 사항을 감시하는 Teleport Discovery Service.
발견된 각 cluster를 Teleport 클러스터의kube_cluster
리소스로 동적으로 등록합니다.
발견되는 cluster에 대한 연결이 필요하지 않습니다. - Discovery Service에 의해 등록된 동적
kube_cluster
리소스를 모니터링하는 Teleport Kubernetes Service.
사용자와 cluster 간의 통신을 프록시합니다.
Tip
이 가이드는 Discovery Service와 Kubernetes 서비스가 동일한 프로세스에서 실행되는 방법을 제시하지만, 두 서비스는 독립적으로 그리고 다른 머신에서 실행될 수 있습니다.
예를 들어, Kubernetes 서비스의 인스턴스를 Teleport 클러스터에 등록하려는 cluster와 동일한 개인 네트워크에서 실행할 수 있으며, Discovery Service의 인스턴스는 원하는 어떤 네트워크에서도 실행할 수 있습니다.
작동 원리
Teleport Discovery Service는 AWS를 포함한 구성된 클라우드 공급자를 스캔하여 지정된 필터링 레이블과 일치하는 Kubernetes 클러스터를 찾아내며, 발견된 새로운 클러스터에 대해 Teleport 내에 동적 자원을 생성합니다. Teleport Kubernetes Service는 이러한 동적 자원을 모니터링하고 해당 Kubernetes 클러스터로 요청을 전달합니다. 두 서비스 모두 기능을 수행하기 위해 AWS API에 대한 접근이 필요합니다.
추가로, Kubernetes Service는 대상 클러스터에 대한 직접 접근과 요청을 전달하기 위한 필요한 권한이 필요합니다.
전제 조건
-
실행 중인 Teleport 클러스터 버전 17.0.0-dev 이상. Teleport를 시작하려면 가입하여 무료 평가판을 이용하거나 데모 환경 설정 방법을 확인하십시오.
-
tctl
관리자 도구와tsh
클라이언트 도구.tctl
및tsh
다운로드 방법에 대한 지침은 설치를 방문하십시오.
- 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": "*"
}
]
}
Statement | 목적 |
---|---|
EKSDiscovery | EKS 클러스터를 발견하고 추가 세부정보를 가져옵니다. |
EKSManageAccess | 발견된 EKS 클러스터에 대한 Teleport 액세스를 자동으로 설정합니다. |
권한을 특정 지역이나 EKS 클러스터로 좁히기 위해 ARNs 목록을 사용할 수 있으며, 와일드카드를 대신 사용할 수 있습니다.
리소스 ARN은 다음 형식을 가집니다:
arn:{Partition}:eks:{Region}:{Account}:cluster/{ClusterName}
EKSManageAccess
문장 내의 권한은 선택적이며, Discovery 서비스는 Teleport Kubernetes 서비스가 발견된 클러스터에 접근할 수 없더라도 EKS 클러스터를 발견할 수 있습니다.
EKSManageAccess
권한 중 일부를 생략하는 경우, Teleport Kubernetes 서비스가 각 EKS 클러스터에 접근할 수 있도록 보장하는 것은 귀하의 책임입니다.
2/3단계. EKS 클러스터 권한 설정
Teleport Discovery v15.3.8 이상을 실행 중이고 Discovery Service에서 사용하는 IAM 역할이 Access Entries를 생성하고 업데이트하는 데 필요한 권한을 갖춘 경우, 이 섹션을 건너뛸 수 있습니다. 서비스는 필요한 권한을 자동으로 자체 부트스트랩할 수 있습니다.
Kubernetes Service가 클러스터를 생성하는 것과 다른 IAM 역할을 사용하는 경우,
발견된 각 클러스터에서 aws-auth
Configmap
을 편집하여 Teleport IAM Role과 Kubernetes RBAC 권한 간의 매핑을 구성해야 합니다.
Kubernetes 클러스터로 요청을 전달하기 위해 Teleport Kubernetes Service는
RBAC 사용자 및 그룹을 Impersonate
하고, SelfSubjectAccessReviews
및 SelfSubjectRulesReviews
를 생성하며, 최종적으로 Pods
에 대한 읽기 권한이 필요합니다.
필요한 권한이 있는 RBAC 그룹이 클러스터에 없다면, ClusterRole
, ClusterRoleBinding
을 생성하고 매핑을 수행할 수 있습니다.
필요한 권한을 만족하는 RBAC 그룹이 이미 클러스터에 있는 경우, 이를 재사용하고 Teleport Kubernetes Service에서 사용하는 IAM Role과 매핑할 수 있습니다. 간단함을 위해 system:masters
와 같은 내장된 Kubernetes RBAC 그룹에 Teleport IAM 역할을 매핑하는 것도 가능하지만, 운영 환경에서는 추천하지 않습니다.
대상 클러스터에 자격 증명으로 연결하고 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
이전 생성한 ClusterRole
을 teleport
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 mapping
클러스터에 aws-auth
구성 맵이 포함되어 있는 경우, kube-system
네임스페이스에서 configmap/aws-auth
를 편집하고 mapRoles
에 다음을 추가합니다.
{teleport_aws_iam_role}
을 Teleport Kubernetes 서비스가 사용할 적절한 IAM 역할로 교체합니다. 이 단계는 Teleport IAM 역할을 Kubernetes RBAC 그룹 teleport
에 연결하여 Teleport Kubernetes 서비스가 클러스터로 요청을 전달할 수 있도록 합니다:
apiVersion: v1
data:
mapRoles: |
- groups:
- teleport
rolearn: {teleport_aws_iam_role} # 예: arn:aws:iam::222222222222:role/teleport-role
username: teleport
그렇지 않은 경우, 이전 단계에서 생성한 Kubernetes 그룹 teleport
에 arn:aws:iam::222222222222:role/teleport-role 를 연결하는 EKS 액세스 항목을 만듭니다:
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
{ ...}
이 시점에서 Teleport IAM 역할은 클러스터로 요청을 전달할 최소한의 권한을 이미 가지고 있습니다.
Teleport IAM 역할을 기존 Kubernetes RBAC 그룹과 연결하려면, kube-system
네임스페이스에서 configmap/aws-auth
를 편집하고 mapRoles
에 다음을 추가합니다.
apiVersion: v1
data:
mapRoles: |
...
- groups:
- {rbac_group}
rolearn: {teleport_aws_iam_role} # 예: arn:aws:iam::222222222222:role/teleport-role
username: teleport
여기서 {teleport_aws_iam_role}
을 Teleport Kubernetes 서비스가 사용하는 적절한 IAM 역할로 바꾸고, {rbac_group}
을 필요한 권한을 충족하는 기존 Kubernetes RBAC 그룹으로 바꾸십시오.
이 시점에서 Teleport IAM 역할은 클러스터로 요청을 전달할 최소한의 권한을 이미 가지고 있습니다.
system:masters
그룹을 Teleport 서비스와 연결된 IAM 역할에 부여하는 것은 Kubernetes 클러스터에서 관리자 수준의 권한을 부여하는 것을 의미합니다.
최소 권한 원칙을 따르기 때문에 이 방법을 운영 환경에서 사용하는 것은 권장하지 않습니다.
클러스터에 aws-auth
구성 맵이 포함되어 있는 경우, 이를 사용하여 Teleport IAM 역할을 system:masters
RBAC 그룹과 연결할 수 있습니다.
kube-system
네임스페이스에서 configmap/aws-auth
를 편집하고 mapRoles
에 다음을 추가합니다:
apiVersion: v1
data:
mapRoles: |
...
- groups:
- system:masters
rolearn: {teleport_aws_iam_role} # 예: arn:aws:iam::222222222222:role/teleport-role
username: teleport
여기서 {teleport_aws_iam_role}
을 Teleport Kubernetes 서비스가 사용하는 적절한 IAM 역할로 교체합니다.
그렇지 않은 경우, 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
{ ...}
이 시점에서 Teleport IAM 역할은 클러스터로 요청을 전달할 최소한의 권한을 이미 가지고 있습니다.
terraform
, eksctl
또는 Cloudformation
과 같은 도구를 사용하여 EKS
클러스터를 프로비저닝하는 경우, 이를 사용하여 aws-auth
Configmap
또는
액세스 항목을 자동으로 구성하고 클러스터 프로비저닝 중에 ClusterRole
및
ClusterRoleBinding
리소스를 생성할 수 있습니다.
3/3단계. EKS 클러스터 발견을 위해 Teleport 구성
조인 토큰 가져오기
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 Agents들이 충돌하여 다른 서비스에 의해 생성된 리소스를 삭제하는 것을 방지하는 데 사용됩니다.
여러 Discovery Services를 실행할 때, 동일한 클라우드 리소스를 감시하는 경우 각 서비스가 동일한 discovery_group
값으로 구성되어야 하며, 서로 다른 클라우드 리소스를 감시하는 경우에는 다른 값으로 구성해야 합니다.
동일한 Teleport 클러스터 내에서 혼합된 구성을 실행하는 것이 가능하므로 일부 Discovery Services는 동일한 클라우드 리소스를 감시하도록 구성할 수 있고, 다른 서비스는 서로 다른 리소스를 감시하도록 할 수도 있습니다. 예를 들어, 두 개의 서로 다른 클라우드 계정에서 데이터를 분석하는 4-agent 고가용성 구성은 다음과 같이 구성됩니다.
- Production 계정에서 데이터를 폴링하기 위해
discovery_group: "prod"
로 구성된 2개의 Discovery Services. - Staging 계정에서 데이터를 폴링하기 위해
discovery_group: "staging"
로 구성된 2개의 Discovery Services.
EKS 자동 검색을 활성화하려면 discovery_service.aws
섹션에 최소한 하나의 항목이 포함되어야 하고, discovery_service.aws.types
에 eks
가 포함되어야 합니다. 또한 kubernetes_service.resources.tags
를 discovery_service.aws.tags
에 구성된 동일한 레이블 또는 그 하위 집합을 사용하여 구성하여, Kubernetes 서비스가 Discovery 서비스에 의해 생성된 동적 리소스를 수신하도록 해야 합니다.
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 클러스터 태그와 일치하는 태그: env=prod
kubernetes_service:
enabled: "yes"
resources:
- labels:
"env": "prod" # 이전에 명시된 Kubernetes 클러스터 레이블과 일치
Kubernetes 및 Discovery 서비스 시작
Kubernetes 및 Discovery 서비스 가 AWS에 인증하는 데 사용할 수 있는 자격 증명에 대한 액세스를 부여하십시오.
- Kubernetes 및 Discovery 서비스 를 EC2 인스턴스에서 실행 중인 경우, EC2 인스턴스 메타데이터 서비스 방법을 사용할 수 있습니다.
- Kubernetes 및 Discovery 서비스 를 Kubernetes에서 실행 중인 경우, IAM Roles for Service Accounts (IRSA)를 사용할 수 있습니다.
- 그렇지 않은 경우, 환경 변수를 사용해야 합니다.
Teleport는 EC2 인스턴스에서 실행 중일 때 이를 감지하고 인스턴스 메타데이터 서비스를 사용하여 자격 증명을 가져옵니다.
EC2 인스턴스는 EC2 인스턴스 프로필을 사용하도록 구성되어야 합니다. 자세한 내용은 인스턴스 프로필 사용을 참조하십시오.
AWS의 IAM Roles for Service Accounts (IRSA)를 참조하여 AWS에서 OIDC 공급자를 설정하고 포드의 서비스 계정이 해당 역할을 맡을 수 있도록 하는 AWS IAM 역할을 구성하십시오.
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 서비스가 자동으로 시작되도록 systemd 서비스를 생성하여 구성합니다. 지침은 Kubernetes 및 Discovery 서비스를 설치한 방법에 따라 다릅니다.
Kubernetes 및 Discovery 서비스를 실행할 호스트에서 Teleport를 활성화하고 시작합니다:
sudo systemctl enable teleportsudo systemctl start teleport
Kubernetes 및 Discovery 서비스를 실행할 호스트에서 Teleport의 systemd 서비스 구성을 만들고, Teleport 서비스를 활성화한 후 Teleport를 시작합니다:
sudo teleport install systemd -o /etc/systemd/system/teleport.servicesudo systemctl enable teleportsudo systemctl start teleport
systemctl status teleport
로 Kubernetes 및 Discovery 서비스의 상태를 확인하고, 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 클러스터를 나열할 수 있는 올바른 권한이 있는지 확인하십시오.