Infograb logo
Kubernetes ServiceAccount 토큰을 통한 서비스 연결

이 가이드는 Kubernetes 조인 방법을 사용하여 Teleport 서비스가 Auth 서비스와 동일한 Kubernetes 클러스터에서 실행될 때 비밀을 공유하지 않고 Teleport 클러스터에 조인하는 방법을 설명합니다.

Teleport 서비스가 클러스터의 일원이 되고자 할 때, 인증서를 받기 전에 Teleport Auth 서비스에 자신의 신원을 증명해야 합니다. Kubernetes는 각 파드에 대해 가상화할 수 있는 Kubernetes ServiceAccount를 설명하는 서명된 증명을 발급합니다. Kubernetes 조인 방법을 사용할 때, Teleport는 이 Kubernetes 증명을 사용하여 클러스터의 일원이 됩니다.

Kubernetes 조인 방법은 Auth 서비스와 동일한 Kubernetes 클러스터에서 실행 중인 조인 서비스가 필요하기 때문에 Teleport Enterprise Cloud에서는 사용할 수 없습니다.

Kubernetes 조인 방법은 자주호스팅된 Teleport 버전에서 사용할 수 있습니다.
이 방법은 Auth 서비스와 동일한 Kubernetes 클러스터에서 실행되는 모든 Teleport 서비스에 조인하는 것을 지원합니다.

전제 조건

  • Kubernetes에 실행 중인 Teleport 클러스터가 필요합니다. 이를 설정하는 방법에 대한 자세한 내용은 Helm을 사용한 Teleport 실행 가이드를 참조하십시오.
  • Teleport 클러스터가 실행 중인 Kubernetes 클러스터에 대한 편집자 액세스 권한이 필요합니다. 네임스페이스와 배포를 생성할 수 있어야 합니다.
  • access 역할을 가진 Teleport 사용자 또는 app: demo-app 레이블이 있는 애플리케이션에 접근할 수 있는 다른 역할이어야 합니다.
  • Teleport editor 역할 또는 기존 Teleport Auth 서비스 파드로 kubectl exec 할 수 있는 권한이 필요합니다.
  • Auth 서비스 ServiceAccount는 system:auth-delegator ClusterRole을 부여받아야 합니다. teleport-cluster Helm 차트를 사용하여 배포된 클러스터 는 기본적으로 올바른 역할을 가지고 있습니다.

1/5 단계. Kubernetes 조인 토큰 생성

Kubernetes 클러스터에 호스팅된 Teleport 서비스가 Teleport 클러스터에 조인할 수 있도록 조인 토큰(Provision Token)으로 Teleport Auth 서비스를 구성합니다.

Teleport 인스턴스는 Auth 서비스에 동일한 Kubernetes 클러스터에서 실행 중임을 증명하기 위해 Kubernetes 조인 토큰에 설정된 allow 규칙과 일치하는 서명된 ServiceAccount 토큰을 전송합니다.

아래 내용을 포함하는 token.yaml 이라는 파일을 생성하고, 이는 당신의 Teleport 서비스가 실행되는 Kubernetes 네임스페이스와 Kubernetes ServiceAccount를 지정하는 allow 규칙을 포함합니다.

# token.yaml
kind: token
version: v2
metadata:
  # 토큰 이름은 비밀이 아니며 Kubernetes 조인 방법은
  # 조인 토큰 이름이 아닌 Kubernetes 서명에 의존하여 신뢰를 설정합니다.
  name: kubernetes-token
  # 긴 만료 시간을 설정합니다. 토큰의 기본값은 30분입니다.
  expires: "2050-01-01T00:00:00Z"
spec:
  # 필요한 최소 시스템 역할 집합을 사용합니다.
  roles: [App]

  # 이 토큰에 대해 허용된 조인 방법을 설정합니다.
  join_method: kubernetes
  
  kubernetes:
    # 유형이 지정되지 않으면 기본적으로 in_cluster로 설정됩니다.
    type: in_cluster
    allow:
      # 서비스 계정 이름은 "namespace:serviceaccountname" 형식을 따릅니다.
      - service_account: "teleport-agent:teleport-app-service"

Kubernetes 조인 토큰은 Auth 서비스 외에도 Proxy 서비스와 SSH 서비스와 같은 모든 Teleport 서비스에서 사용할 수 있습니다. 이 가이드에서는 토큰을 애플리케이션 서비스 인스턴스에 조인하는 것으로 제한합니다.

모든 것에 조인할 수 있는 단일 토큰을 사용하는 것은 권장하지 않습니다. 토큰을 조인 인스턴스에서 사용하는 역할로 제한해야 합니다. 예를 들어, 애플리케이션 서비스와 데이터베이스 서비스 모두를 실행 중인 Teleport 인스턴스는 roles: [App, Db] 를 가진 토큰을 사용해야 합니다. 다음 지침에 따라 Auth 서비스 파드에 대한 관리 액세스 권한이 있는지에 따라 토큰을 생성합니다:

토큰을 생성합니다:

tctl create token.yaml

마지막으로, 토큰이 생성되었는지 확인합니다:

tctl get token/kubernetes-token

kind: tokenmetadata: expires: "3000-01-01T00:00:00Z" name: kubernetes-tokenspec: join_method: kubernetes roles: - Appversion: v2

Auth 서비스 배포의 이름과 네임스페이스를 가져옵니다:

kubectl get namespaces
NAME STATUS AGEcert-manager Active 40ddefault Active 40dkube-system Active 40dteleport Active 40d

"teleport" 네임스페이스의 배포를 찾습니다.

kubectl get deployments -n teleport
NAME READY UP-TO-DATE AVAILABLE AGEteleport-auth 2/2 2 2 6d20hteleport-proxy 2/2 2 2 6d20h

여기서 배포 이름은 "teleport-auth"입니다.

그런 다음 Auth 서비스 파드 중 하나에서 tctl create 명령을 실행하기 위해 다음 명령을 실행합니다:

kubectl exec -i -n teleport deployment/teleport-auth -- tctl create < token.yaml

마지막으로, 토큰이 성공적으로 생성되었는지 확인합니다:

kubectl exec -i -n teleport deployment/teleport-auth tctl get token/kubernetes-token

kind: tokenmetadata: expires: "3000-01-01T00:00:00Z" name: kubernetes-tokenspec: join_method: kubernetes roles: - Appversion: v2

2/5단계. 데모 HTTP 애플리케이션 배포

이 단계에서는 데모 HTTP 애플리케이션을 배포하고 이를 공개적으로 노출하지 않습니다. 대신, Teleport Application Service를 사용하여 이 애플리케이션에 대한 액세스를 관리하며, 이를 Kubernetes 조인 방법을 사용하여 Teleport에 등록할 것입니다.

kubectl create namespace demo-app
namespace/demo-app created
kubectl create deployment --image=nginx --namespace demo-app --port=80 demo-app
deployment.apps/demo-app created
kubectl expose deployment demo-app -n demo-app --port=80 --target-port=80 --selector='app=demo-app'
service/demo-app exposed

애플리케이션 파드가 실행 중이고 준비 상태인지 확인하려면 다음 명령어를 사용하세요:

kubectl get pods -n demo-app
NAME READY STATUS RESTARTS AGEdemo-app-7664d59cb8-bv888 1/1 Running 0 67s

3/5단계. Application Service 구성

teleport-kube-agent 차트를 구성하여 애플리케이션 서비스가 실행되는 Teleport 인스턴스를 배포합니다. 이를 위해 다음 내용을 포함하는 values.yaml 파일을 생성합니다:

# values.yaml

# 포트를 포함한 Teleport 클러스터의 공개 주소입니다.
# 플레이스홀더를 프록시 주소로 교체해야 합니다.
proxyAddr: "teleport.example.com:443"

# `teleport-kube-agent` 차트가 실행해야 하는 서비스의 쉼표로 구분된 목록입니다.
# (지원되는 값: kube,db,app,discovery)
# 이 가이드에서는 app 액세스만 배포합니다.
# 여기에서 더 많은 서비스를 추가하려면 1단계에서 생성된 프로비저닝 토큰에 역할을 추가해야 합니다.
roles: app

joinParams:
  method: "kubernetes"
  # 이는 1단계에서 생성된 프로비저닝 토큰과 일치해야 합니다.
  tokenName: "kubernetes-token"

apps:
  - name: demo-app
    uri: "http://demo-app.demo-app.svc.cluster.local:80"

4/5단계. Application Service 배포

1단계에서 생성된 토큰을 사용하기 위해, 조인 인스턴스는 Auth Service와 동일한 Kubernetes 클러스터에서 실행되어야 하며 Kubernetes ServiceAccount 토큰이 마운트되어 있어야 합니다. 이 섹션에서 설치할 teleport-kube-agent 차트는 기본적으로 이 작업을 처리합니다.

다음 명령어를 실행하여 Teleport Application Service를 배포합니다:

helm install teleport-app-service teleport/teleport-kube-agent -n teleport-agent --create-namespace -f values.yaml

그런 다음 몇 초 후에 포드가 실행 중인지 확인합니다:

kubectl get pods -n teleport-agent
NAME READY STATUS RESTARTS AGEteleport-app-service-0 1/1 Running 0 23s

마지막으로 Teleport Web UI 또는 명령줄을 사용하여 애플리케이션을 볼 수 있는지 확인합니다:

tsh apps ls
Application Description Type Public Address Labels----------- ----------- ---- -------------------- -------------------demo-app HTTP teleport.example.com teleport.dev/origin

5/5단계. 정리

teleport-app-service Helm 릴리스를 제거하고 demo-appteleport-agent 네임스페이스를 삭제합니다.

helm delete -n teleport-agent teleport-app-service
release "teleport-app-service" uninstalled
kubectl delete namespaces demo-app teleport-agent
namespace "demo-app" deletednamespace "teleport-agent" deleted

더 나아가기

Teleport 원문 보기