인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
Kubernetes에 Teleport 배포하기
Teleport는 Kubernetes 클러스터에 대한 안전하고 통합된 액세스를 제공할 수 있습니다. 이 가이드는 Helm을 사용하여 Kubernetes 클러스터에 Teleport를 배포하는 방법을 보여줍니다.
이 가이드를 완료하는 동안, Kubernetes 클러스터에 Auth Service와 Proxy Service 각각에 대해 하나의 Teleport 포드를 배포하고, 외부 트래픽을 Teleport 클러스터로 전달하는 로드 밸런서를 배포합니다. 그러면 사용자는 클러스터 내에서 실행 중인 Teleport 클러스터를 통해 Kubernetes 클러스터에 접근할 수 있습니다.
이미 다른 플랫폼에서 Teleport Auth Service와 Proxy Service를 실행하고 있다면, 기존의 Teleport 배포를 사용하여 Kubernetes 클러스터에 접근할 수 있습니다. 우리의 가이드를 따라 Kubernetes 클러스터를 Teleport에 연결하세요.
Tip
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이 가이드를 따르기 위해
eksctl
을 사용하여 새로운 Amazon Elastic Kubernetes Service 클러스터를 시작하는 경우, 아래의 예시 구성은 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
-
워크스테이션에 v17.0.0-dev+ 설치된
tsh
클라이언트 도구. 설치 페이지에서 다운로드할 수 있습니다.
-
Kubernetes >= v1.17.0
-
Helm >= 3.4.2
Helm과 Kubernetes가 설치되어 있고 최신 상태인지 확인하십시오.
helm versionversion.BuildInfo{Version:"v3.4.2"}
kubectl versionClient Version: version.Info{Major:"1", Minor:"17+"}
Server Version: version.Info{Major:"1", Minor:"17+"}
이 가이드는 가장 폭넓은 권한 세트를 사용하여 Kubernetes 액세스를 설정하는 방법을 보여줍니다. 이는 개인 데모 클러스터에 적합하지만, 생산 사용을 위해 Kubernetes RBAC를 설정하고자 한다면 시작하기 전에 Teleport Kubernetes RBAC 가이드에 익숙해지는 것을 권장합니다.
1/2단계. Teleport 설치
Kubernetes에 Teleport 클러스터를 배포하려면 다음을 수행해야 합니다:
- Teleport Auth Service 및 Proxy Service를 Kubernetes 클러스터에 배포하는
teleport-cluster
Helm 차트를 설치합니다. - 클러스터가 실행 중이면 클라이언트가 클러스터에 접근할 수 있도록 DNS 레코드를 생성합니다.
teleport-cluster
Helm 차트 설치
Teleport Auth Service와 Proxy Service를 Kubernetes 클러스터에 배포하려면 아래의 지침에 따라 teleport-cluster
Helm 차트를 설치합니다.
-
Teleport Helm 저장소를 설정합니다.
Helm이 Teleport Helm 저장소에서 호스팅되는 차트를 설치할 수 있도록 허용합니다:
helm repo add teleport https://charts.releases.teleport.dev원격 저장소의 차트 캐시를 업데이트하여 모든 사용 가능한 릴리스로 업그레이드할 수 있습니다:
helm repo update -
Teleport용 네임스페이스를 만들고 네임스페이스의 Pod 보안 수락을 구성하여 보안 표준을 enforce 합니다:
kubectl create namespace teleport-clusternamespace/teleport-cluster createdkubectl label namespace teleport-cluster 'pod-security.kubernetes.io/enforce=baseline'namespace/teleport-cluster labeled -
kubectl
컨텍스트를 네임스페이스로 설정하여 입력을 줄입니다:kubectl config set-context --current --namespace=teleport-cluster -
clusterName 를 도메인 이름의 하위 도메인으로 할당합니다, 예:
teleport.example.com
. -
email 를 Let's Encrypt로부터 알림을 받는 데 사용할 이메일 주소로 할당합니다. Let's Encrypt는 Teleport Proxy Service의 HTTPS 엔드포인트에 대한 TLS 자격 증명을 제공합니다.
-
Helm 값 파일을 만듭니다:
단일 노드 Teleport 클러스터를 구성하고 ACME를 사용하여 인증서를 프로비저닝할 값을 파일(teleport-cluster-values.yaml
)로 작성합니다.
cat << EOF > teleport-cluster-values.yamlclusterName: clusterNameproxyListenerMode: multiplexacme: trueacmeEmail: emailEOF
Teleport Auth 서비스는 Teleport Enterprise 계정을 인증하기 위해 라이센스 파일을 읽습니다.
라이센스 파일을 얻으려면 Teleport 계정 대시보드로 이동하여 로그인하십시오. teleport.sh에서 시작하여 Teleport 계정 이름(예: my-company)을 입력합니다. 로그인 후 "GENERATE LICENSE KEY" 버튼이 표시되며, 이를 클릭하면 새 라이센스 파일이 생성되고 다운로드할 수 있습니다.
라이센스가 터미널의 작업 디렉토리에 license.pem
경로로 저장되어 있는지 확인합니다.
라이센스 파일을 사용하여 teleport-cluster
네임스페이스에 "license"라는 비밀을 생성합니다:
kubectl create secret generic license --from-file=license.pemsecret/license created
단일 노드 Teleport 클러스터를 구성하고 ACME를 사용하여 인증서를 프로비저닝할 값을 파일(teleport-cluster-values.yaml
)로 작성합니다.
cat << EOF > teleport-cluster-values.yamlclusterName: clusterNameproxyListenerMode: multiplexacme: trueacmeEmail: emailenterprise: trueEOF
-
작성한 값 파일을 사용하여
teleport-cluster
Helm 차트를 설치합니다:helm install teleport-cluster teleport/teleport-cluster \ --create-namespace \ --version 17.0.0-dev \ --values teleport-cluster-values.yaml -
teleport-cluster
차트를 설치한 후, 1분 정도 기다리고 Auth Service와 Proxy Service 포드가 모두 실행 중인지 확인합니다:kubectl get podsNAME READY STATUS RESTARTS AGEteleport-cluster-auth-000000000-00000 1/1 Running 0 114steleport-cluster-proxy-0000000000-00000 1/1 Running 0 114s
DNS 레코드 설정
이 섹션에서는 사용자가 클러스터에 연결할 수 있도록 DNS 레코드를 생성하여 Proxy Service의 주소를 가리키게 합니다.
teleport-cluster
Helm 차트는 클라우드 제공업체와 함께 외부 로드 밸런서를 설정하는 Kubernetes 서비스를 사용하여 인터넷에서 트래픽을 Proxy Service로 유도합니다.
아래의 지침을 따라 로드 밸런서의 주소를 얻으십시오.
-
Proxy Service 로드 밸런서에 대한 정보를 가져옵니다:
kubectl get services/teleport-clusterNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEteleport-cluster LoadBalancer 10.4.4.73 192.0.2.0 443:31204/TCP 89steleport-cluster
서비스는 트래픽을 Teleport Proxy Service로 전송합니다. 클라우드 호스팅 로드 밸런서의 IP 주소 또는 도메인 이름을 보여주는EXTERNAL-IP
필드를 주목하십시오. 예를 들어, AWS에서는 다음과 유사한 도메인 이름을 볼 수 있습니다:00000000000000000000000000000000-0000000000.us-east-2.elb.amazonaws.com
-
두 개의 DNS 레코드를 설정합니다: 모든 트래픽을 위한
teleport.example.com
과 Teleport에 등록할 웹 애플리케이션을 위한*.teleport.example.com
. 도메인 이름이example.com
이고,teleport
가 Teleport 클러스터에 할당한 서브도메인이라고 가정합니다.위의
EXTERNAL-IP
열이 IP 주소를 가리키는지 도메인 이름을 가리키는지에 따라 레코드는 다음 세부 정보를 갖습니다:
레코드 유형 | 도메인 이름 | 값 |
---|---|---|
A | teleport.example.com | 로드 밸런서의 IP 주소 |
A | *.teleport.example.com | 로드 밸런서의 IP 주소 |
레코드 유형 | 도메인 이름 | 값 |
---|---|---|
CNAME | teleport.example.com | 로드 밸런서의 도메인 이름 |
CNAME | *.teleport.example.com | 로드 밸런서의 도메인 이름 |
-
레코드를 생성한 후, 다음 명령을 사용하여 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":"17.0.0-dev","min_client_version":"12.0.0","cluster_name":"teleport.example.com","automatic_upgrades":false}
2/2단계. 로컬 사용자 만들기
Teleport 사용자가 단일 로그인을 통한 인증을 권장하지만, SSO 제공업체가 다운된 경우에는 로컬 사용자가 신뢰할 수 있는 대안입니다.
이 섹션에서는 Teleport 역할 member
를 통해 Kubernetes 그룹 system:masters
에 접근할 수 있는 로컬 사용자를 만들 것입니다. 이 사용자는 관리 권한을 위한 내장 역할인 access
및 editor
역할도 가지고 있습니다.
다음 역할 사양을 member.yaml
이라는 파일에 붙여넣으세요:
kind: 역할
version: v7
metadata:
name: member
spec:
allow:
kubernetes_groups: ["system:masters"]
kubernetes_labels:
'*': '*'
kubernetes_resources:
- kind: '*'
namespace: '*'
name: '*'
verbs: ['*']
-
역할 만들기:
kubectl exec -i deployment/teleport-cluster-auth -- tctl create -f < member.yaml역할 'member'가 생성되었습니다 -
사용자를 만들고 초대 링크를 생성합니다. 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 프록시를 가리키고 있는지 확인하십시오. -
초대 링크를 방문하고 Web UI의 지침에 따라 사용자를 활성화하세요.
-
로컬 사용자로
tsh login
을 시도하세요:tsh login --proxy=clusterName:443 --user=myuser -
Teleport 클러스터에 연결되면 사용자를 위한 사용 가능한 Kubernetes 클러스터를 나열합니다:
tsh kube lsKube 클러스터 이름 선택됨----------------- --------tele.example.com -
Kubernetes 클러스터에 로그인합니다.
tsh
클라이언트 도구는 로컬 kubeconfig를 Teleport 클러스터를 가리키도록 업데이트하므로, 설치 과정 동안KUBECONFIG
를 임시 값으로 설정합니다. 이렇게 하면 문제가 발생할 경우 원래 kubeconfig로 쉽게 되돌릴 수 있습니다:KUBECONFIG=$HOME/teleport-kubeconfig.yaml tsh kube login clusterNameKUBECONFIG=$HOME/teleport-kubeconfig.yaml kubectl get -n teleport-cluster pods이름 준비 완료 상태 재시작 수 경과teleport-cluster-auth-000000000-00000 1/1 실행 중 0 26mteleport-cluster-proxy-0000000000-00000 1/1 실행 중 0 26m
문제 해결
Teleport 클러스터에 연결하는 데 오류가 발생하는 경우, Auth Service 및 Proxy Service 팟의 상태를 확인하세요. 성공적인 상태는 다음과 같이 두 팟이 실행 중이어야 합니다:
kubectl get pods -n teleport-cluster이름 준비 완료 상태 재시작 수 경과teleport-cluster-auth-5f8587bfd4-p5zv6 1/1 실행 중 0 48steleport-cluster-proxy-767747dd94-vkxz6 1/1 실행 중 0 48s
팟의 상태가 Pending
인 경우, kubectl logs
및 kubectl describe
명령어를 해당 팟에 대해 사용하여 상태를 확인하세요. Auth Service 팟은 영구 볼륨 청구를 할당받을 수 있어야 하며, 사용 가능한 영구 볼륨이 없으면 Pending
상태로 들어갈 수 있습니다.
kubectl get events --sort-by='.metadata.creationTimestamp' -A
의 출력도 유용할 수 있으며, Kubernetes 클러스터 내부에서 발생하는 가장 최근의 이벤트를 보여줍니다.
다음 단계
- 싱글 사인온 설정: 이 가이드에서는 데모 환경에 적합한 로컬 사용자를 생성하는 방법을 보여주었습니다. 프로덕션 배포를 위해서는 선택한 공급자와 함께 싱글 사인온을 설정해야 합니다. 이를 위한 방법은 싱글 사인온 가이드를 참조하세요.
- Teleport 배포 구성:
teleport-cluster
Helm 차트의 값 파일에서 설정할 수 있는 모든 옵션을 보려면 참조 가이드를 참조하세요. - 리소스 등록: 인프라스트럭처의 모든 Kubernetes 클러스터를 Teleport에 등록할 수 있습니다. 시작하려면, 클라우드의 모든 클러스터를 자동으로 등록하는 방법을 알아보려면 자동 검색 가이드를 읽어보세요. 서버, 데이터베이스, 애플리케이션 및 Windows 데스크탑도 등록할 수 있습니다.
- Kubernetes RBAC 미세 조정: 이 가이드에서 생성한 사용자는
system:masters
역할에 접근할 수 있지만, Kubernetes 리소스에 대한 미세한 제어를 활성화하기 위해 Teleport의 RBAC를 설정할 수 있습니다. 자세한 내용은 Kubernetes 액세스 제어 가이드를 참조하세요.