IaC로 Kubernetes OIDC 조인 구성하기
Teleport v18.9이 가이드에서는 Kubernetes 에이전트가 시크릿 토큰 없이 Teleport에 조인할 수 있도록 Teleport를 구성하는 방법을 알아봅니다. 이 가이드는 Kubernetes 조인 방법의 OIDC 변형을 사용합니다.
이 가이드에서는 Kubernetes 에이전트가 시크릿 토큰 없이 Teleport에 조인할 수 있도록 Teleport를 구성하는 방법을 알아봅니다. Teleport는 코드에서 리소스를 동적으로 생성하는 세 가지 방법을 지원합니다:
- Kubernetes에서 Teleport 리소스를 관리할 수 있는 Teleport Kubernetes Operator
- Terraform을 통해 Teleport 리소스를 관리할 수 있는 Teleport Terraform 프로바이더
- 로컬 컴퓨터나 CI 환경에서 Teleport 리소스를 관리할 수 있는
tctlCLI
작동 방식#
이 가이드는 Kubernetes 조인 방법의 OIDC 변형을 사용합니다. 대부분의 Kubernetes 클러스터는 OpenID Connect(OIDC) 프로바이더를 사용하여 서비스 어카운트 토큰에 서명합니다.
이 가이드에서는 Kubernetes 클러스터에서 실행 중인 에이전트가 Kubernetes 발급 토큰을 사용하여 Teleport 클러스터에 조인할 수 있도록 Teleport를 구성합니다.
사전 요구 사항#
이 가이드를 따르려면 다음이 필요합니다:
- v18.1.5 이상을 실행 중인 Teleport 클러스터
- 등록하려는 Kubernetes 클러스터로, 서비스 어카운트 토큰이 공개적으로 접근 가능한 OIDC 프로바이더에 의해 서명되어야 합니다.
클라우드 관리형 Kubernetes 클러스터는 기본적으로 공개 OIDC 프로바이더를 사용하거나, 클러스터 생성 시 구성할 수 있습니다:
- EKS 및 GKE 클러스터는 모두 공개적으로 접근 가능한 OIDC 프로바이더를 가져야 합니다.
- AKS 클러스터에서는 선택 사항입니다.
- OKE 클러스터에서 OIDC Discovery는 선택 사항입니다.
클러스터 자체는 공개일 필요가 없으며, OIDC 프로바이더만 공개이면 됩니다.
-
실행 중인 Teleport 클러스터. Teleport를 시작하려면 무료 체험판에 가입하거나 데모 환경을 구성하세요.
-
tctlandtshclients.Installing `tctl` and `tsh` clients
-
Teleport 클러스터의 버전을 확인합니다.
tctlandtshclients는 Teleport 클러스터 버전보다 최대 한 개의 메이저 버전까지만 뒤처질 수 있습니다. Proxy Service의/v1/webapi/find로 GET 요청을 보내고 JSON 쿼리 도구를 사용하여 클러스터 버전을 확인합니다.teleport.example.com:443를 Teleport Proxy Service의 웹 주소로 바꿉니다:$ TELEPORT_DOMAIN=teleport.example.com:443 $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')" -
사용 중인 플랫폼에 대한 지침에 따라
tctlandtshclients를 설치합니다:
-
Mac
`tctl` and `tsh` clients가 포함된, 서명된 Teleport macOS .pkg 설치 프로그램을 다운로드합니다:
```code
$ curl -O https://cdn.teleport.dev/teleport-${TELEPORT_VERSION?}.pkg
```
Finder에서 `pkg` 파일을 더블 클릭하여 설치를 시작합니다.
Homebrew를 사용하여 Teleport를 설치하는 것은 지원되지 않습니다. Homebrew의
Teleport 패키지는 Teleport에서 유지 관리하지 않으므로 신뢰성이나 보안을
보장할 수 없습니다.
Windows - Powershell
```code
$ curl.exe -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-windows-amd64-bin.zip
# Unzip the archive and move the `tctl` and `tsh` clients to your %PATH%
# NOTE: Do not place the `tctl` and `tsh` clients in the System32 directory, as this can cause issues when using WinSCP.
# Use %SystemRoot% (C:\Windows) or %USERPROFILE% (C:\Users\<username>) instead.
```
Linux
Linux 설치판의 모든 Teleport 바이너리에는 `tctl` and `tsh` clients가 포함되어 있습니다. RPM/DEB
패키지 및 i386/ARM/ARM64용 다운로드를 포함한 더 많은 옵션은
[설치 페이지](../installation/installation.mdx)를 참조하세요.
```code
$ curl -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
$ tar -xzf teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
$ cd teleport
$ sudo ./install
# Teleport binaries have been copied to /usr/local/bin
```
다음 중 하나를 따라 실행 중인 오퍼레이터:
오퍼레이터를 배포한 네임스페이스도 설정해야 합니다. 이 네임스페이스가 CustomResources를 배포하는 곳입니다:
# `teleport-cluster` Helm 차트로 배포된 오퍼레이터의 경우
$ export OPERATOR_NAMESPACE="teleport-cluster"
# 독립 실행형 오퍼레이터의 경우
$ export OPERATOR_NAMESPACE="teleport-iac"
Terraform 프로바이더 가이드를 따라 Teleport Terraform 프로바이더를 작동 중인 상태로 준비합니다.
1/4단계. OIDC 프로바이더 URL 감지#
이 단계에서는 클러스터에 연결하고 OIDC 프로바이더 URL을 복구합니다. 이미 클러스터의 OIDC 프로바이더 URL이 있는 경우(예: 클러스터 프로비저닝의 출력으로) 2단계로 건너뛸 수 있습니다.
접근 권한이 있는지 확인합니다:
$ kubectl cluster-info
Kubernetes control plane is running at https://kube.example.com:443
CoreDNS is running at https://kube.example.com:443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://kube.example.com:443/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
OIDC 구성 엔드포인트의 issuer 필드에서 OIDC 발급자 URL을 가져옵니다:
$ kubectl get --raw=/.well-known/openid-configuration
{"issuer":"https://oidc.example.com/path/to/issuer/",
"jwks_uri":"https://kube.example.com:443/openid/v1/jwks","response_types_supported":["id_token"],
"subject_types_supported":["public"],"id_token_signing_alg_values_supported":["RS256"]}
위의 예에서는 https://oidc.example.com/path/to/issuer/입니다.
발급자 URL은 URL 끝의 / 유무를 포함하여 정확하게 복사해야 합니다.
다음 명령을 실행하여 OIDC 프로바이더가 공개적으로 접근 가능한지 확인하고 JSON이 반환되는지 확인합니다:
$ curl https://oidc.example.com/path/to/issuer/.well-known/openid-configuration
{
"issuer": "https://oidc.example.com/path/to/issuer/",
"jwks_uri": "https://oidc.example.com/path/to/issuer/openid/v1/jwks",
"response_types_supported": [
"id_token"
],
"subject_types_supported": [
"public"
],
"id_token_signing_alg_values_supported": [
"RS256"
]
}
2/4단계. 조인 토큰 생성#
이 단계에서는 Kubernetes OIDC 프로바이더가 서명한 토큰을 신뢰하도록 Teleport를 구성합니다. 이를 통해 이 Kubernetes 클러스터에서 실행 중인 에이전트가 Teleport 클러스터에 조인할 수 있습니다.
토큰 이름은 신뢰하는 Kubernetes 클러스터의 이름을 따르는 것을 권장합니다. 이를 통해 토큰 이름 충돌 없이 다른 클러스터를 등록할 수 있습니다.
매니페스트 작성#
토큰을 생성할 때 미래 에이전트 네임스페이스(teleport)와 에이전트 릴리즈 이름(teleport-agent)을 지정해야 합니다. 이를 통해 Teleport는 에이전트가 조인할 수 있는지 확인합니다.
다음 내용으로 token.yaml 파일을 생성합니다:
kind: token
version: v2
metadata:
name: kube-cluster-name-oidc
spec:
roles: ['Kube']
join_method: "kubernetes"
kubernetes:
type: oidc
oidc:
issuer: "https://oidc.example.com/path/to/issuer/"
allow:
- service_account: "teleport:teleport-agent"
다음 내용으로 token.yaml 파일을 생성합니다:
apiVersion: resources.teleport.dev/v1
kind: TeleportProvisionToken
metadata:
name: kube-cluster-name-oidc
spec:
roles: ['Kube']
join_method: "kubernetes"
kubernetes:
type: oidc
oidc:
issuer: "https://oidc.example.com/path/to/issuer/"
allow:
- service_account: "teleport:teleport-agent"
Kubernetes는 모든 커스텀 리소스 이름이 RFC 1123을 따르도록 검증합니다. RFC 1123에는 호스트명 사양이 포함됩니다. 따라서 오퍼레이터가 제어하는 Teleport 리소스의 metadata.name 필드는 소문자 영숫자, - 또는 .로 구성되고 영숫자로 시작하고 끝나야 합니다.
다음 내용으로 token.tf 파일을 생성합니다:
resource "teleport_provision_token" "kube-cluster-name" {
version = "v2"
metadata = {
name = "kube-cluster-name-oidc"
}
spec = {
roles = ["Kube"]
join_method = "kubernetes"
kubernetes = {
type = "oidc"
oidc = {
issuer = "https://oidc.example.com/path/to/issuer/"
}
allow = [
{
service_account = "teleport:teleport-agent"
}
]
}
}
}
매니페스트 적용#
$ tctl create -f token.yaml
token 'kube-cluster-name-oidc' has been created
$ kubectl apply -n "$OPERATOR_NAMESPACE" -f token.yaml
teleportprovisiontokenv2.resources.teleport.dev/kube-cluster-name-oidc created
생성된 Kubernetes 리소스를 나열합니다:
$ kubectl get teleportprovisiontokenv2 -n "$OPERATOR_NAMESPACE"
NAME AGE
kube-cluster-name-oidc 10m
$ terraform plan
[...]
Plan: 1 to add, 0 to change, 0 to destroy.
$ terraform apply
teleport_provision_token.kube-cluster-name-oidc: Creating...
teleport_provision_token.kube-cluster-name-oidc: Creation complete after 0s [id=kube-cluster-name-oidc]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
3/4단계. 에이전트 구성#
이 단계에서는 에이전트가 이전에 생성한 토큰을 사용하여 조인하도록 teleport-kube-agent Helm 차트 구성을 작성합니다.
다음 정보가 필요합니다:
- Teleport 클러스터 주소:
teleport.example.com:443 - Teleport 클러스터 이름:
teleport.example.com - 연결하는 Kubernetes 클러스터 이름:
kube-cluster-name
다음 values.yaml YAML 매니페스트를 작성합니다.
roles: "kube"
proxyAddr: teleport.example.com:443
# Teleport Community Edition 또는 AGPL을 사용하는 경우 false로 설정
enterprise: true
updater:
enabled: true
joinParams:
method: "kubernetes"
tokenName: kube-cluster-name-oidc
kubeClusterName: kube-cluster-name
teleportClusterName: teleport.example.com
4/4단계. 에이전트 배포#
이 단계에서는 이전에 작성한 values를 사용하여 teleport-kube-agent 차트의 릴리즈를 배포합니다.
Teleport Helm 리포지토리에서 Teleport 차트를 가져오도록 Helm을 구성하십시오.
$ helm repo add teleport (=teleport.helm_repo_url=)
최신 차트를 가져와 로컬 Helm 캐시를 새로 고치십시오.
$ helm repo update
마지막으로 프로비전 토큰에서 이전에 설정한 values를 사용하여 Teleport Kubernetes 에이전트를 배포합니다:
- 에이전트를 배포할 네임스페이스:
teleport - Teleport 에이전트 릴리즈 이름:
teleport-agent
$ helm upgrade --install teleport-agent teleport/teleport-kube-agent \
--namespace teleport --create-namespace \
--version (=teleport.version=) \
--values values.yaml
파드 준비 상태를 확인하여 에이전트가 클러스터에 성공적으로 조인했는지 검증합니다(몇 분 정도 걸릴 수 있습니다):
$ kubectl get pods -n teleport
NAME READY STATUS RESTARTS AGE
teleport-agent-0 1/1 Running 0 9s
teleport-agent-updater-6b8b74996-jz4qg 1/1 Running 0 15s
다음 단계#
지원되는 values 목록은 teleport-kube-agent Helm 차트 참조를 참조하세요.