Microsoft Azure, AKS, Helm을 사용하여 HA Teleport 클러스터 실행
Teleport v18.9이 가이드에서는 Teleport Helm 차트와 Microsoft Azure 관리형 서비스(Kubernetes Services, Database for PostgreSQL, Blob Storage)를 사용하여 Kubernetes에서 여러 복제본이 있는 고가용성 T...
이 가이드에서는 Teleport Helm 차트와 Microsoft Azure 관리형 서비스(Kubernetes Services, Database for PostgreSQL, Blob Storage)를 사용하여 Kubernetes에서 여러 복제본이 있는 고가용성 Teleport 클러스터를 설정합니다.
팁: 기존 Teleport 클러스터가 있으신가요?
이미 다른 플랫폼에서 Teleport를 실행 중인 경우, 기존 Teleport 배포를 사용하여 Kubernetes 클러스터에 접근할 수 있습니다. 가이드를 따라 Kubernetes 클러스터를 Teleport에 연결하세요.
작동 방식#
teleport-cluster Helm 차트는 Azure Kubernetes Service 클러스터에 Teleport Auth Service와 Teleport Proxy Service를 배포합니다. 이 차트에는 다음 리소스가 필요하며, 이 가이드에서 생성 방법을 보여줍니다:
- Teleport Auth Service의 IAM 권한. Auth Service는 백엔드에서 리소스를 관리하기 위한 권한이 필요합니다.
- cert-manager. Proxy Service가 HTTPS 서버를 실행하는 데 사용할 TLS 자격 증명을 획득하고 갱신합니다.
- cert-manager의 IAM 권한. 이 가이드에서 보여주는 설정에서
cert-manager는 도메인 소유권을 증명하고 Let's Encrypt에서 TLS 자격 증명을 받기 위해 DNS 레코드를 수정합니다. 이를 위해 Proxy Service는 ACME DNS-01 챌린지를 완료합니다. - Teleport Auth Service 백엔드 구성 요소: PostgreSQL 데이터베이스와 Amazon S3 호환 오브젝트 스토리지 솔루션.
사전 요구사항#
이 지침을 따르려면 azure-cli 2.51 이상이 필요합니다. Azure CLI 설치 방법은 Azure 문서를 참조하세요.
설치 후 az login을 입력하여 로그인이 되어 있는지 확인하세요. 이 가이드에서는 사용자에게 Azure Database for PostgreSQL 인스턴스, Azure Blob Storage 계정, Managed Identity를 생성하고 이에 대한 역할 할당을 추가하는 권한이 있다고 가정합니다. 또한 Azure DNS 영역과 cert-manager가 설치되어 해당 Azure DNS 영역에 대한 인증서를 발급하도록 구성된 AKS 클러스터에 대한 접근이 필요합니다.
이 가이드에서는 워크로드 아이덴티티를 사용하여 Teleport를 PostgreSQL 및 Blob Storage에 인증하므로, 아직 활성화되지 않은 경우 AKS 클러스터에서 워크로드 아이덴티티 및 OIDC 발급자를 활성화해야 합니다:
$ az aks update --resource-group aks-rg --name aks-name --enable-oidc-issuer --enable-workload-identity
1단계/5. Teleport Helm 차트 리포지토리 추가#
2단계/5. PostgreSQL 및 Blob Storage 설정#
편의를 위해 새 리소스 그룹에서 필요한 모든 리소스를 생성합니다. 기존 리소스 그룹을 사용하려면 이 단계를 건너뛸 수 있습니다. region에 Azure 리전을 할당합니다:
$ az group create --name teleport-rg --location region
Teleport에서 이러한 서비스를 사용할 Managed Identity가 필요합니다.
$ az identity create --resource-group teleport-rg --name teleport-id
Azure에서 Teleport의 권장 HA 배포는 PostgreSQL 인스턴스에 클러스터 상태와 감사 로그 항목을 저장합니다. 이 가이드에서는 공개적으로 접근 가능한 인스턴스를 생성하지만, AKS 클러스터의 IP 주소로 제한하거나 클러스터가 사용하는 동일한 가상 네트워크에 연결하여 생성할 수도 있습니다.
리전에 따라 ZoneRedundant 고가용성 또는 SameZone 고가용성을 사용할 수 있습니다.
$ az postgres flexible-server create --resource-group teleport-rg --name teleport-pg \
--microsoft-entra-auth Enabled --password-auth Disabled \
--version 15 --high-availability SameZone --public-access All
$ az postgres flexible-server parameter set --resource-group teleport-rg --server-name teleport-pg \
--name wal_level --value logical
$ az postgres flexible-server restart --resource-group teleport-rg --name teleport-pg
$ az postgres flexible-server microsoft-entra-admin create --resource-group teleport-rg --server-name teleport-pg \
--display-name pguser --type ServicePrincipal \
--object-id "$(az identity show --resource-group teleport-rg --name teleport-id --query principalId -o tsv)"
Teleport는 Blob Storage 계정에 세션 녹화를 저장합니다. 선택적으로 AKS 아웃바운드 주소만으로 접근을 제한하거나 AKS 클러스터가 사용하는 가상 네트워크의 일부로 만들 수 있습니다.
$ az storage account create --resource-group teleport-rg --name teleportblob \
--allow-blob-public-access false
$ az role assignment create --role "Storage Blob Data Owner" --assignee-principal-type ServicePrincipal \
--assignee-object-id "$(az identity show --resource-group teleport-rg --name teleport-id --query principalId -o tsv)" \
--scope "$(az storage account show --resource-group teleport-rg --name teleportblob --query id -o tsv)"
워크로드 아이덴티티를 사용하여 이러한 서비스에 인증하므로, Auth Service에서 사용하는 Teleport 서비스 계정에 대한 페더레이션 자격 증명을 추가합니다.
$ az identity federated-credential create --resource-group teleport-rg --identity-name teleport-id \
--name aks --audience api://AzureADTokenExchange \
--subject system:serviceaccount:teleport-ns:teleport-release \
--issuer "$(az aks show --resource-group aks-rg --name aks-name --query oidcIssuerProfile.issuerUrl -o tsv)"
3단계/5. 클러스터 구성 값 설정#
라이선스 시크릿
Kubernetes 클러스터에 Teleport Enterprise를 설치하기 전에 Teleport 라이선스 정보가 포함된 시크릿을 생성해야 합니다.
license.pem 파일에서 시크릿을 생성합니다. 파일 이름이 license.pem인 한 Teleport가 자동으로 이 시크릿을 검색합니다.
$ kubectl create namespace teleport-ns
$ kubectl -n teleport-ns create secret generic license --from-file=license.pem
이제 azure 모드를 사용하도록 teleport-cluster Helm 차트를 구성합니다.
먼저 teleport-id 아이덴티티의 클라이언트 ID를 가져옵니다:
$ az identity show --resource-group teleport-rg --name teleport-id --query clientId -o tsv
teleport-client-id-uuid-123456789012
그런 다음 위에서 선택한 값을 포함하는 azure-values.yaml 파일을 생성합니다:
오픈 소스:
chartMode: azure
# Name of your cluster. Use the FQDN you intend to configure in DNS later
clusterName: teleport.example.com
azure:
databaseHost: "teleport-pg.postgres.database.azure.com"
databaseUser: "pguser"
sessionRecordingStorageAccount: "teleportblob.blob.core.windows.net"
# Whether to mirror audit log entries to stdout in JSON format (useful for external log collectors)
auditLogMirrorOnStdout: false
clientID: "teleport-client-id-uuid-123456789012"
highAvailability:
# Number of replicas to configure
replicaCount: 2
certManager:
# Enable cert-manager support to get TLS certificates
enabled: true
# Name of the cert-manager GlobalIssuer or Issuer to use
issuerName: letsencrypt-production
issuerKind: ClusterIssuer
# If you are running Kubernetes 1.23 or above, disable PodSecurityPolicies
podSecurityPolicy:
enabled: false
Enterprise:
chartMode: azure
# Name of your cluster. Use the FQDN you intend to configure in DNS later
clusterName: teleport.example.com
azure:
databaseHost: "teleport-pg.postgres.database.azure.com"
databaseUser: "pguser"
sessionRecordingStorageAccount: "teleportblob.blob.core.windows.net"
# Whether to mirror audit log entries to stdout in JSON format (useful for external log collectors)
auditLogMirrorOnStdout: false
clientID: "teleport-client-id-uuid-123456789012"
highAvailability:
# Number of replicas to configure
replicaCount: 2
certManager:
# Enable cert-manager support to get TLS certificates
enabled: true
# Name of the cert-manager GlobalIssuer or Issuer to use
issuerName: letsencrypt-production
issuerKind: ClusterIssuer
# If you are running Kubernetes 1.23 or above, disable PodSecurityPolicies
podSecurityPolicy:
enabled: false
# Indicate that this is a Teleport Enterprise deployment
enterprise: true
다음 명령으로 azure-values.yaml 파일의 값을 사용하여 차트를 설치합니다:
$ helm install teleport-release teleport/teleport-cluster \
--create-namespace --namespace teleport-ns \
--values azure-values.yaml
참고
클러스터가 구성된 후에는
clusterName을 변경할 수 없으므로 신중하게 선택하세요. Teleport 클러스터에 대한 외부 접근에 사용할 완전한 도메인 이름을 사용하는 것을 권장합니다.
차트가 설치되면 kubectl 명령을 사용하여 배포를 볼 수 있습니다:
$ kubectl --namespace teleport-ns get all
NAME READY STATUS RESTARTS AGE
pod/teleport-auth-57989d4cb-4q2ds 1/1 Running 0 22h
pod/teleport-auth-57989d4cb-rtrzn 1/1 Running 0 22h
pod/teleport-proxy-c6bf55cfc-w96d2 1/1 Running 0 22h
pod/teleport-proxy-c6bf55cfc-z256w 1/1 Running 0 22h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/teleport LoadBalancer 10.40.11.180 34.138.177.11 443:30258/TCP,3023:31802/TCP,3026:32182/TCP,3024:30101/TCP,3036:30302/TCP 22h
service/teleport-auth ClusterIP 10.40.8.251 <none> 3025/TCP,3026/TCP 22h
service/teleport-auth-v13 ClusterIP None <none> <none> 22h
service/teleport-auth-v14 ClusterIP None <none> <none> 22h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/teleport-auth 2/2 2 2 22h
deployment.apps/teleport-proxy 2/2 2 2 22h
NAME DESIRED CURRENT READY AGE
replicaset.apps/teleport-auth-57989d4cb 2 2 2 22h
replicaset.apps/teleport-proxy-c6bf55cfc 2 2 2 22h
4단계/5. DNS 설정#
이제 example.com에 루트된 Azure DNS 영역을 사용하여 teleport.example.com 및 *.teleport.example.com에 대한 DNS A 레코드를 설정합니다. 다른 DNS 호스팅 서비스를 사용하는 경우 해당 지침을 따르세요.
$ PREFIX=teleport
$ ZONE=example.com
$ ZONE_RG=dns-rg
$ external_ip="$(kubectl --namespace teleport-ns get service/teleport-release -o jsonpath='{.status.loadBalancer.ingress[*].ip}')"
$ az network dns record-set a add-record --resource-group ${ZONE_RG} --zone-name ${ZONE} --record-set-name ${PREFIX} --ipv4-address "${external_ip}"
$ az network dns record-set a add-record --resource-group ${ZONE_RG} --zone-name ${ZONE} --record-set-name "*.${PREFIX}" --ipv4-address "${external_ip}"
5단계/5. Teleport 사용자 생성#
Teleport에 로그인할 수 있는 사용자를 생성합니다. 이 작업은 Teleport Auth Service에서 수행해야 하므로 kubectl을 사용하여 명령을 실행할 수 있습니다:
오픈 소스:
$ kubectl --namespace teleport-ns exec deploy/teleport-release-auth -- tctl users add test --roles=access,editor
User "test" has been created but requires a password. Share this URL with the user to complete user setup, link is valid for 1h:
https://teleport.example.com:443/web/invite/91cfbd08bc89122275006e48b516cc68
NOTE: Make sure teleport.example.com:443 points at a Teleport proxy that users can access.
Enterprise:
$ kubectl --namespace teleport-ns exec deploy/teleport-release-auth -- tctl users add test --roles=access,editor,reviewer
User "test" has been created but requires a password. Share this URL with the user to complete user setup, link is valid for 1h:
https://teleport.example.com:443/web/invite/91cfbd08bc89122275006e48b516cc68
NOTE: Make sure teleport.example.com:443 points at a Teleport proxy that users can access.
웹 UI를 통해 사용자 생성 링크를 로드하여 비밀번호를 만들고 Teleport 사용자에 대한 다단계 인증을 설정합니다.
고가용성#
이 가이드에서는 2개의 복제본을 구성했습니다. 이는 아래 helm upgrade 사용으로 highAvailability.replicaCount 값을 변경하여 클러스터 생성 후에도 변경할 수 있습니다.
배포 후 클러스터 업그레이드#
배포 후 Teleport 클러스터를 변경하려면 helm upgrade를 사용할 수 있습니다.
Helm은 기본적으로 리포에서 사용 가능한 최신 버전의 차트를 사용하며, 이는 Teleport의 최신 버전에 해당합니다. helm repo update를 실행하여 리포가 최신 상태인지 확인할 수 있습니다.
다른 버전의 Teleport를 사용하려면 --version 인수를 Helm에 전달합니다:
$ helm upgrade --version 14.0.0 \
teleport-release teleport/teleport-cluster \
--namespace teleport-ns \
-f azure-values.yaml
다음은 차트를 3개의 복제본을 사용하도록 설정하는 예입니다:
values.yaml 사용:
azure-values.yaml 파일을 편집하여 적절한 변경을 수행합니다.
다음 명령으로 azure-values.yaml 파일의 값으로 배포를 업그레이드합니다:
$ helm upgrade teleport-release teleport/teleport-cluster \
--namespace teleport-ns \
-f azure-values.yaml
CLI에서 --set 사용:
명령줄 매개변수를 적절히 편집하여 이 명령을 실행합니다:
$ helm upgrade teleport-release teleport/teleport-cluster \
--namespace teleport-ns \
--set highAvailability.replicaCount=3
참고
chartMode,clusterName또는azure설정을 변경하려면 먼저 기존 차트를 제거한 다음 적절한 값으로 새 버전을 설치해야 합니다.
Teleport 제거#
teleport-cluster 차트를 제거하려면 helm uninstall을 사용합니다. 예:
$ helm --namespace teleport-ns uninstall teleport-release
다음 단계#
Teleport 클러스터를 배포했으므로 접근 관리 섹션을 읽고 사용자 등록 및 RBAC 설정을 시작합니다.
고가용성에 대한 자세한 내용은 Helm 차트 참조의 고가용성 섹션을 참조하세요.