Microsoft Azure, AKS, Helm을 사용하여 HA Teleport 클러스터 실행
이 가이드에서는 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 --name --enable-oidc-issuer --enable-workload-identity
1단계/5. Teleport Helm 차트 리포지토리 추가#
2단계/5. PostgreSQL 및 Blob Storage 설정#
편의를 위해 새 리소스 그룹에서 필요한 모든 리소스를 생성합니다. 기존 리소스 그룹을 사용하려면 이 단계를 건너뛸 수 있습니다. 에 Azure 리전을 할당합니다:
$ az group create --name --location
Teleport에서 이러한 서비스를 사용할 Managed Identity가 필요합니다.
$ az identity create --resource-group --name teleport-id
Azure에서 Teleport의 권장 HA 배포는 PostgreSQL 인스턴스에 클러스터 상태와 감사 로그 항목을 저장합니다. 이 가이드에서는 공개적으로 접근 가능한 인스턴스를 생성하지만, AKS 클러스터의 IP 주소로 제한하거나 클러스터가 사용하는 동일한 가상 네트워크에 연결하여 생성할 수도 있습니다.
리전에 따라 ZoneRedundant 고가용성 또는 SameZone 고가용성을 사용할 수 있습니다.
$ az postgres flexible-server create --resource-group --name \
--microsoft-entra-auth Enabled --password-auth Disabled \
--version 15 --high-availability SameZone --public-access All
$ az postgres flexible-server parameter set --resource-group --server-name \
--name wal_level --value logical
$ az postgres flexible-server restart --resource-group --name
$ az postgres flexible-server microsoft-entra-admin create --resource-group --server-name \
--display-name --type ServicePrincipal \
--object-id "$(az identity show --resource-group --name teleport-id --query principalId -o tsv)"
Teleport는 Blob Storage 계정에 세션 녹화를 저장합니다. 선택적으로 AKS 아웃바운드 주소만으로 접근을 제한하거나 AKS 클러스터가 사용하는 가상 네트워크의 일부로 만들 수 있습니다.
$ az storage account create --resource-group --name \
--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 --name teleport-id --query principalId -o tsv)" \
--scope "$(az storage account show --resource-group --name --query id -o tsv)"
워크로드 아이덴티티를 사용하여 이러한 서비스에 인증하므로, Auth Service에서 사용하는 Teleport 서비스 계정에 대한 페더레이션 자격 증명을 추가합니다.
$ az identity federated-credential create --resource-group --identity-name teleport-id \
--name aks --audience api://AzureADTokenExchange \
--subject system:serviceaccount:: \
--issuer "$(az aks show --resource-group --name --query oidcIssuerProfile.issuerUrl -o tsv)"
3단계/5. 클러스터 구성 값 설정#
라이선스 시크릿
Kubernetes 클러스터에 Teleport Enterprise를 설치하기 전에 Teleport 라이선스 정보가 포함된 시크릿을 생성해야 합니다.
license.pem 파일에서 시크릿을 생성합니다. 파일 이름이 license.pem인 한 Teleport가 자동으로 이 시크릿을 검색합니다.
$ kubectl create namespace
$ kubectl -n create secret generic license --from-file=license.pem
이제 azure 모드를 사용하도록 teleport-cluster Helm 차트를 구성합니다.
먼저 teleport-id 아이덴티티의 클라이언트 ID를 가져옵니다:
$ az identity show --resource-group --name teleport-id --query clientId -o tsv
그런 다음 위에서 선택한 값을 포함하는 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/teleport-cluster \
--create-namespace --namespace \
--values azure-values.yaml
참고
클러스터가 구성된 후에는
clusterName을 변경할 수 없으므로 신중하게 선택하세요. Teleport 클러스터에 대한 외부 접근에 사용할 완전한 도메인 이름을 사용하는 것을 권장합니다.
차트가 설치되면 kubectl 명령을 사용하여 배포를 볼 수 있습니다:
$ kubectl --namespace 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 get service/ -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 exec deploy/-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 exec deploy/-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/teleport-cluster \
--namespace \
-f azure-values.yaml
다음은 차트를 3개의 복제본을 사용하도록 설정하는 예입니다:
values.yaml 사용:
azure-values.yaml 파일을 편집하여 적절한 변경을 수행합니다.
다음 명령으로 azure-values.yaml 파일의 값으로 배포를 업그레이드합니다:
$ helm upgrade teleport/teleport-cluster \
--namespace \
-f azure-values.yaml
CLI에서 --set 사용:
명령줄 매개변수를 적절히 편집하여 이 명령을 실행합니다:
$ helm upgrade teleport/teleport-cluster \
--namespace \
--set highAvailability.replicaCount=3
참고
chartMode,clusterName또는azure설정을 변경하려면 먼저 기존 차트를 제거한 다음 적절한 값으로 새 버전을 설치해야 합니다.
Teleport 제거#
teleport-cluster 차트를 제거하려면 helm uninstall을 사용합니다. 예:
$ helm --namespace uninstall
다음 단계#
Teleport 클러스터를 배포했으므로 접근 관리 섹션을 읽고 사용자 등록 및 RBAC 설정을 시작합니다.
고가용성에 대한 자세한 내용은 Helm 차트 참조의 고가용성 섹션을 참조하세요.
