Infograb logo
Kubernetes에 Teleport 배포

Teleport는 Kubernetes 클러스터에 대한 안전하고 통합된 접근을 제공할 수 있습니다. 이 가이드는 Helm을 사용하여 Kubernetes 클러스터에 Teleport를 배포하는 방법을 보여줍니다.

이 가이드를 완료하는 동안, Kubernetes 클러스터에 각각 Auth Service와 Proxy Service를 위한 Teleport pod를 하나씩 배포하고, 외부 트래픽을 Teleport 클러스터로 전달하는 로드 발란서를 배포할 것입니다. 사용자는 Teleport 클러스터를 통해 Kubernetes 클러스터에 접근할 수 있습니다.

이미 다른 플랫폼에서 Teleport Auth Service와 Proxy Service를 실행하고 있다면, 기존의 Teleport 배포를 사용하여 Kubernetes 클러스터에 접근할 수 있습니다. 가이드를 따라 Kubernetes 클러스터를 Teleport에 연결하세요.

Teleport Enterprise Cloud가 이 설정을 자동으로 처리하므로, 귀하는 즉시 안전한 인프라 접근을 제공할 수 있습니다.

무료 체험으로 Teleport Enterprise Cloud를 시작하세요.

전제 조건

  • 등록된 도메인 이름. 이는 Teleport가 Let's Encrypt를 통해 TLS를 설정하고 Teleport 클라이언트가 Proxy Service 호스트를 검증하기 위해 필요합니다.

  • 클라우드 제공업체가 호스팅하는 Kubernetes 클러스터, 이는 이 가이드에서 배포하는 로드 발란서에 필요합니다. 시작할 때는 비운영 클러스터에서 이 가이드를 따르는 것을 권장합니다.

  • Auth Service가 클러스터 상태를 저장하는 데 사용할 수 있는 지속적 볼륨. Kubernetes 클러스터에 사용 가능한 것이 있는지 확인하세요:

    kubectl get pv

    사용 가능한 지속적 볼륨이 없으면, 하나를 제공하거나 클러스터에 동적 볼륨 프로비저닝을 활성화해야 합니다. 예를 들어, Amazon Elastic Kubernetes Service에서는 Elastic Block Store Container Storage Interface 드라이버 추가 기능을 구성할 수 있습니다.

    동적 볼륨 프로비저닝이 활성화되어 있는지 확인하려면 기본 StorageClass의 존재 여부를 확인하세요:

    kubectl get storageclasses

    이 가이드를 따르기 위해 새 Amazon Elastic Kubernetes Service 클러스터를 시작하기 위해 eksctl을 사용하는 경우, 다음 예제 구성은 EBS CSI 드라이버 추가 기능을 설정합니다.

    아래의 예제 구성은 eksctl이 어떻게 작동하는지 알고 있으며, EKS 클러스터를 운영 중이지 않고, 자신이 위험을 감수하고 진행하고 있다는 것을 이해하고 있다고 가정합니다.

    클러스터 이름, 버전, 노드 그룹 크기 및 리전을 필요에 따라 업데이트하세요:

    apiVersion: eksctl.io/v1alpha5
    kind: ClusterConfig
    metadata:
      name: my-cluster
      region: us-east-1
      version: "1.23"
    
    iam:
      withOIDC: true
    
    addons:
    - name: aws-ebs-csi-driver
      version: v1.11.4-eksbuild.1
      attachPolicyARNs:
      - arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy
    
    managedNodeGroups:
      - name: managed-ng-2
        instanceType: t3.medium
        minSize: 2
        maxSize: 3
    
  • 작업station에 설치된 tsh 클라이언트 도구 v16.2.0+. 이는 우리의 설치 페이지에서 다운로드할 수 있습니다.

  • Kubernetes >= v1.17.0

  • Helm >= 3.4.2

    Helm과 Kubernetes가 설치되어 있고 최신 상태인지 확인하세요.

    helm version

    version.BuildInfo{Version:"v3.4.2"}


    kubectl version

    클라이언트 버전: version.Info{Major:"1", Minor:"17+"}

    서버 버전: version.Info{Major:"1", Minor:"17+"}

이 가이드는 가장 광범위한 권한 세트를 사용하여 Kubernetes 접근을 설정하는 방법을 보여줍니다. 이는 개인 데모 클러스터에 적합하지만, 운영 환경에서 Kubernetes RBAC를 설정하려면 시작하기 전에 Teleport Kubernetes RBAC 가이드를 숙지하시기 바랍니다.

1/2 단계. Teleport 설치

Kubernetes에 Teleport 클러스터를 배포하려면 다음을 수행해야 합니다:

  1. Kubernetes 클러스터에 Teleport Auth Service와 Proxy Service를 배포하는 teleport-cluster Helm 차트를 설치합니다.
  2. 클러스터가 실행 중일 때, 클라이언트가 클러스터에 접근하는 데 사용할 수 있는 DNS 레코드를 생성합니다.

teleport-cluster Helm 차트 설치

Kubernetes 클러스터에 Teleport Auth Service와 Proxy Service를 배포하려면 아래 지침에 따라 teleport-cluster Helm 차트를 설치하세요.

  1. Teleport Helm 리포지토리를 설정하세요. Teleport Helm 리포지토리에 호스팅된 차트를 설치하도록 Helm을 허용하세요:

    helm repo add teleport https://charts.releases.teleport.dev

    원격 리포지토리의 차트 캐시를 업데이트하여 모든 사용 가능한 릴리즈로 업그레이드할 수 있습니다:

    helm repo update
  2. Teleport를 위한 네임스페이스를 생성하고 Pod 보안 승인(Pod Security Admission)을 구성하며, 네임스페이스 내의 pods에 대한 보안 표준을 시행합니다:

    kubectl create namespace teleport-cluster
    namespace/teleport-cluster created
    kubectl label namespace teleport-cluster 'pod-security.kubernetes.io/enforce=baseline'
    namespace/teleport-cluster labeled
  3. 몇 번의 입력을 줄이기 위해 kubectl 컨텍스트를 네임스페이스로 설정합니다:

    kubectl config set-context --current --namespace=teleport-cluster
  4. clusterName를 도메인 이름의 서브도메인으로 할당합니다. 예를 들면, teleport.example.com.

  5. email를 Let's Encrypt로부터 TLS 자격 증명을 수신하는 데 사용할 이메일 주소로 할당합니다. 이는 Teleport Proxy Service의 HTTPS 엔드포인트에 대한 것입니다.

  6. Helm 값을 저장할 파일을 생성합니다:

    단일 노드 Teleport 클러스터를 구성하고 ACME를 사용하여 인증서를 프로비저닝할 값을 파일(teleport-cluster-values.yaml)에 작성합니다.

    cat << EOF > teleport-cluster-values.yamlclusterName: clusterNameproxyListenerMode: multiplexacme: trueacmeEmail: emailEOF

    Teleport 인증 서비스는 Teleport Enterprise 계정을 인증하기 위해 라이선스 파일을 읽습니다.

    라이선스 파일을 얻으려면 Teleport 계정 대시보드로 이동하여 로그인하십시오.
    teleport.sh에서 시작하고 Teleport 계정 이름(예: my-company)을 입력하세요.
    로그인 후 "GENERATE LICENSE KEY" 버튼이 표시되며, 이 버튼을 클릭하면 새로운 라이선스 파일이 생성되고 이를 다운로드할 수 있습니다.

    라이센스가 터미널의 작업 디렉토리 license.pem 경로에 저장되어 있는지 확인합니다.

    라이센스 파일을 사용하여 teleport-cluster 네임스페이스에서 "license"라는 비밀을 생성합니다:

    kubectl create secret generic license --from-file=license.pem
    secret/license created

    단일 노드 Teleport 클러스터를 구성하고 ACME를 사용하여 인증서를 프로비저닝할 값을 파일(teleport-cluster-values.yaml)에 작성합니다.

    cat << EOF > teleport-cluster-values.yamlclusterName: clusterNameproxyListenerMode: multiplexacme: trueacmeEmail: emailenterprise: trueEOF
  7. 작성한 값을 사용하여 teleport-cluster Helm 차트를 설치합니다:

    helm install teleport-cluster teleport/teleport-cluster \ --create-namespace \ --version 16.2.0 \ --values teleport-cluster-values.yaml
  8. teleport-cluster 차트를 설치한 후, 잠시 기다렸다가 Auth Service와 Proxy Service pod가 모두 실행 중인지 확인합니다:

    kubectl get pods
    NAME READY STATUS RESTARTS AGEteleport-cluster-auth-000000000-00000 1/1 Running 0 114steleport-cluster-proxy-0000000000-00000 1/1 Running 0 114s

DNS 레코드 설정

이 섹션에서는 사용자가 클러스터에 연결할 수 있도록 Proxy Service의 주소를 가리키는 DNS 레코드를 생성하여 사용자가 서비스에 접속할 수 있도록 합니다.

teleport-cluster Helm 차트는 클라우드 제공업체의 외부 로드 발란서를 설정하는 Kubernetes 서비스의 트래픽을 인터넷에 노출합니다.

아래 지침에 따라 로드 발란서의 주소를 가져옵니다.

  1. Proxy Service 로드 발란서에 대한 정보를 가져옵니다:

    kubectl get services/teleport-cluster
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEteleport-cluster LoadBalancer 10.4.4.73 192.0.2.0 443:31204/TCP 89s

    teleport-cluster 서비스는 Teleport Proxy Service로 트래픽을 전송합니다. 클라우드 호스팅된 로드 발란서의 IP 주소 또는 도메인 이름을 보여주는 EXTERNAL-IP 필드를 확인하세요. 예를 들어 AWS에서는 다음과 같은 도메인 이름을 볼 수 있습니다:

    00000000000000000000000000000000-0000000000.us-east-2.elb.amazonaws.com
    
  2. 모든 트래픽을 위한 teleport.example.com과 Teleport에 등록할 웹 애플리케이션에 대한 *.teleport.example.com의 두 가지 DNS 레코드를 설정합니다. 도메인 이름이 example.com이고 teleport가 Teleport 클러스터에 할당한 서브도메인이라고 가정합니다.

    EXTERNAL-IP 열이 IP 주소를 가리키는지 도메인 이름을 가리키는지에 따라 레코드의 세부사항은 다음과 같습니다:

    레코드 유형도메인 이름
    Ateleport.example.com로드 발란서의 IP 주소
    A*.teleport.example.com로드 발란서의 IP 주소
    레코드 유형도메인 이름
    CNAMEteleport.example.com로드 발란서의 도메인 이름
    CNAME*.teleport.example.com로드 발란서의 도메인 이름
  3. 레코드를 생성한 후, 다음 명령을 사용하여 Teleport 클러스터가 실행 중인지 확인합니다:

    curl https://clusterName/webapi/ping
    {"auth":{"type":"local","second_factor":"on","preferred_local_mfa":"webauthn","allow_passwordless":true,"allow_headless":true,"local":{"name":""},"webauthn":{"rp_id":"teleport.example.com"},"private_key_policy":"none","device_trust":{},"has_motd":false},"proxy":{"kube":{"enabled":true,"listen_addr":"0.0.0.0:3026"},"ssh":{"listen_addr":"[::]:3023","tunnel_listen_addr":"0.0.0.0:3024","web_listen_addr":"0.0.0.0:3080","public_addr":"teleport.example.com:443"},"db":{"mysql_listen_addr":"0.0.0.0:3036"},"tls_routing_enabled":false},"server_version":"16.2.0","min_client_version":"12.0.0","cluster_name":"teleport.example.com","automatic_upgrades":false}

2/2 단계. 로컬 사용자 만들기

Teleport 사용자가 SSO 제공자로 인증 받는 것을 권장하지만, SSO 제공자가 다운될 경우를 대비하여 로컬 사용자는 신뢰할 수 있는 대체 수단입니다.

이 섹션에서는 Kubernetes 그룹 system:masters에 접근할 수 있는 로컬 사용자를 생성할 것입니다. 이 사용자는 또한 관리 권한을 위한 내장 accesseditor 역할을 가집니다.

다음 역할 사양을 member.yaml이라는 파일에 붙여넣습니다:

kind: 역할
version: v7
metadata:
  name: 멤버
spec:
  allow:
    kubernetes_groups: ["system:masters"]
    kubernetes_labels:
      '*': '*'
    kubernetes_resources:
      - kind: '*'
        namespace: '*'
        name: '*'
        verbs: ['*']
  1. 역할을 생성합니다:

    kubectl exec -i deployment/teleport-cluster-auth -- tctl create -f < member.yaml
    역할 'member'가 생성되었습니다.
  2. 사용자를 생성하고 초대 링크를 생성합니다. myuser를 만들고자 하는 로컬 Teleport 사용자 이름으로 대체합니다:

    kubectl exec -ti deployment/teleport-cluster-auth -- tctl users add myuser --roles=member,access,editor
    사용자 "myuser"가 생성되었지만 비밀번호가 필요합니다. 이 URL을 사용자와 공유하여 사용자 설정을 완료하세요. 링크는 1시간 동안 유효합니다:
    https://tele.example.com:443/web/invite/abcd123-insecure-do-not-use-this
    참고: tele.example.com:443가 사용자가 접근할 수 있는 Teleport 프록시에 가리키도록 하세요.
  3. 초대 링크를 방문하여 웹 UI의 지침에 따라 사용자를 활성화합니다.

  4. 로컬 사용자로 tsh login을 시도합니다:

    tsh login --proxy=clusterName:443 --user=myuser
  5. Teleport 클러스터에 연결되면 사용 가능한 Kubernetes 클러스터를 목록으로 표시합니다:

    tsh kube ls
    Kube 클러스터 이름 선택됨----------------- --------tele.example.com
  6. Kubernetes 클러스터에 로그인합니다. tsh 클라이언트 도구는 로컬 kubeconfig를 Teleport 클러스터를 가리키도록 업데이트합니다. 설치 과정 중에는 임시 값을 할당하여 KUBECONFIG를 설정합니다. 이렇게 하면 문제가 발생할 경우 쉽게 원래 kubeconfig로 되돌아갈 수 있습니다:

    KUBECONFIG=$HOME/teleport-kubeconfig.yaml tsh kube login clusterName

    KUBECONFIG=$HOME/teleport-kubeconfig.yaml kubectl get -n teleport-cluster pods
    NAME READY STATUS RESTARTS AGEteleport-cluster-auth-000000000-00000 1/1 Running 0 26mteleport-cluster-proxy-0000000000-00000 1/1 Running 0 26m

문제 해결

Teleport 클러스터에 연결하는 데 오류가 발생하는 경우, Auth Service 및 Proxy Service pods의 상태를 확인하세요. 성공적인 상태는 아래와 같이 두 개의 pods가 모두 실행 중임을 보여줍니다:

kubectl get pods -n teleport-cluster
NAME READY STATUS RESTARTS AGEteleport-cluster-auth-5f8587bfd4-p5zv6 1/1 Running 0 48steleport-cluster-proxy-767747dd94-vkxz6 1/1 Running 0 48s

pod의 상태가 Pending인 경우, 해당 pod의 상태를 확인하기 위해 kubectl logskubectl describe 명령을 사용하세요. Auth Service pod는 지속적 볼륨 클레임을 할당할 수 있어야 하며, 사용 가능한 지속적 볼륨이 없으면 Pending 상태로 들어갈 수 있습니다.

kubectl get events --sort-by='.metadata.creationTimestamp' -A의 출력도 도움이 될 수 있으며, Kubernetes 클러스터 내에서 발생하는 가장 최신 이벤트를 보여줍니다.

다음 단계

  • Single Sign-On 설정: 이 가이드는 로컬 사용자 만드는 방법을 보여주었으며, 데모 환경에 적합합니다. 프로덕션 배포의 경우, 선택한 제공자로 Single Sign-On을 설정해야 합니다. 이를 위한 우리의 Single Sign-On 가이드를 참고하세요.
  • Teleport 배포 구성: teleport-cluster Helm 차트의 값 파일에 설정할 수 있는 모든 옵션을 보려면 우리의 참조 가이드를 참조하세요.
  • 리소스 등록: 인프라 내의 모든 Kubernetes 클러스터를 Teleport에 등록할 수 있습니다. 시작하려면, 모든 클러스터를 자동으로 등록하는 방법을 알아보려면 우리의 자동 발견 가이드를 읽으세요. 서버, 데이터베이스, 애플리케이션 및 Windows 데스크탑을 등록할 수도 있습니다.
  • Kubernetes RBAC 조정: 이 가이드에서 생성한 사용자는 system:masters 역할에 접근할 수 있지만, Kubernetes 리소스에 접근하기 위한 세밀한 제어를 위해 Teleport의 RBAC를 설정할 수 있습니다. 자세한 정보는 우리의 Kubernetes 접근 제어 가이드를 참조하세요.
Teleport 원문 보기