Infograb logo
Kubernetes ServiceAccount 토큰을 통한 서비스 조인

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

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

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

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

전제 조건

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

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

Kubernetes 클러스터에서 호스팅된 Teleport 서비스가 Teleport 클러스터에 조인할 수 있도록 Teleport Auth 서비스에 조인 토큰(Provision Token이라고도 함)을 구성하세요.

언더 후드에서는, Teleport 인스턴스가 인증되는 방법은 인증 서비스에 대한 서명된 ServiceAccount 토큰을 보내면서 같은 Kubernetes 클러스터에서 실행되고 있음을 증명하는 것입니다. 이 토큰은 Kubernetes 조인 토큰에 구성된 allow 규칙과 일치해야 합니다.

다음 내용을 포함하는 token.yaml이라는 파일을 생성하세요. 이 파일에는 Teleport 서비스가 실행되는 Kubernetes 네임스페이스와 Kubernetes ServiceAccount를 지정하는 allow 규칙이 포함됩니다.

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

  # 이 토큰에 허용된 join 방법을 설정합니다.
  join_method: kubernetes
  
  kubernetes:
    # 유형이 지정되지 않으면 기본값은 in_cluster입니다.
    type: in_cluster
    allow:
      # 서비스 계정 이름은 "네임스페이스:서비스계정이름" 형식을 따릅니다.
      - 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 애플리케이션 서비스로 이 애플리케이션에 대한 액세스를 관리하고, 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. 애플리케이션 서비스 구성

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

# values.yaml

# 포트가 포함된 Teleport 클러스터의 공개 주소.
# 이 자리 표시자를 프로시 주소로 교체해야 합니다.
proxyAddr: "teleport.example.com:443"

# `teleport-kube-agent` 차트가 실행해야 하는 서비스의 쉼표로 구분된 목록
# (지원되는 값: kube,db,app,discovery)
# 이 가이드에서는 앱 액세스만 배포합니다.
# 여기에서 더 많은 서비스를 추가하려면 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. 애플리케이션 서비스 배포

사용된 토큰이 1단계에서 생성된 것이므로 조인 인스턴스는 Auth 서비스와 동일한 Kubernetes 클러스터에서 실행되어야 하고 Kubernetes ServiceAccount 토큰이 마운트되어야 합니다. 이 섹션에서 설치할 teleport-kube-agent 차트가 기본적으로 이를 처리합니다.

다음 명령을 실행하여 Teleport 애플리케이션 서비스를 배포하세요:

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 웹 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 원문 보기