인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
Kubernetes에 Machine ID 배포하기
이 가이드는 Kubernetes 클러스터에 Machine ID 데몬 tbot
을 배포하는 방법을 보여줍니다.
이 가이드에서 보여주는 설정에서는 tbot
이 Kubernetes 배포로 실행됩니다. 이는 필요한 자격 증명을 Kubernetes 비밀에 기록하며, 해당 자격 증명을 사용해야 하는 포드에서 마운트할 수 있습니다. tbot
이 자격 증명을 생성하는 서비스를 위해 동일한 포드 내에서 사이드카로 실행될 수도 있지만, Kubernetes의 사이드카에 대한 제한된 지원으로 인해 tbot
을 독립 실행형 배포로 실행하는 것을 추천합니다.
이 가이드에서는 tbot
이 Kubernetes API 서버에 의해 서명된 JSON 웹 토큰(JWT)을 제시하여 Teleport Auth 서비스에 자신의 신원을 증명하는 kubernetes
조인 방법을 시연합니다. 이 JWT는 서비스 계정, 포드 및 tbot
이 실행되고 있는 네임스페이스를 식별합니다. Teleport Auth 서비스는 JWT의 서명을 Kubernetes 클러스터의 공개 서명 키와 대조하여 확인합니다.
tbot
을 Teleport 클러스터에 배포할 때는 일반적으로 kubernetes
조인 방법을 사용하는 것이 권장됩니다. 이는 대부분의 Kubernetes 클러스터에서 작동합니다. 다음 가이드는 이 조인 방법을 구성하는 방법을 보여줄 것입니다.
그러나 특정 클라우드 Kubernetes 서비스에서는 kubernetes
조인 방법 대신 해당 플랫폼과 관련된 조인 방법을 사용할 수 있습니다. 이는 tbot
의 조인을 Kubernetes 클러스터와 동일한 플랫폼의 표준 VM에서 단일 조인 토큰으로 관리하려는 경우 유리할 수 있습니다. 이러한 서비스는 다음과 같습니다:
- Google Kubernetes Engine: GCP Workload Identity가 클러스터에 구성된 경우
gcp
조인 방법을 사용할 수 있습니다. 추가 정보는 GCP 플랫폼 가이드를 참조하십시오. - AWS Elastic Kubernetes Service: 서비스 계정에 대한 IAM 역할 (IRSA)가 클러스터에 구성된 경우
iam
조인 방법을 사용할 수 있습니다. 추가 정보는 AWS 플랫폼 가이드를 참조하십시오.
사전 요구 사항
-
실행 중인 Teleport 클러스터 버전 17.0.0-dev 이상. Teleport를 시작하려면 가입하여 무료 평가판을 이용하거나 데모 환경 설정 방법을 확인하십시오.
-
tctl
관리자 도구와tsh
클라이언트 도구.tctl
및tsh
다운로드 방법에 대한 지침은 설치를 방문하십시오.
- 연결이 가능한지 확인하기 위해
tsh login
으로 로그인한 다음, 현재 자격 증명을 사용하여tctl
명령어를 실행할 수 있는지 확인하십시오. 예를 들어:클러스터에 연결할 수 있고tsh login --proxy=teleport.example.com --user=email@example.comtctl status클러스터 teleport.example.com
버전 17.0.0-dev
CA 핀 sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678
tctl status
명령어를 실행할 수 있다면, 현재 자격 증명을 사용하여 워크스테이션에서 후속tctl
명령어를 실행할 수 있습니다.
자신의 Teleport 클러스터를 호스팅하는 경우, Teleport Auth Service를 호스팅하는 컴퓨터에서 전체 권한으로tctl
명령어를 실행할 수도 있습니다. - 토큰 요청 프로젝션을 지원하는 Kubernetes 클러스터(이는 Kubernetes 1.20에서 일반적으로 사용할 수 있는 기능으로 졸업했습니다).
tbot
을 배포할 클러스터에서 리소스를 생성할 수 있는 권한으로 인증된kubectl
.
이 가이드의 예제에서는 Kubernetes 클러스터의 default
네임스페이스에 tbot
배포를 설치합니다. default
에 대한 참조를 사용하려는 네임스페이스로 조정하십시오.
1/5단계. Kubernetes RBAC 준비하기
Machine ID를 위해 Kubernetes 클러스터를 준비하려면 여러 Kubernetes RBAC 리소스를 생성해야 합니다.
서비스 계정이 생성되어 나중에 tbot
이 실행될 포드에 할당됩니다. 이렇게 하면 Teleport 클러스터에 조인할 수 있도록 허용할 수 있는 정적 신원이 생성되며, 또한 Kubernetes 권한을 할당할 수 있는 신원을 제공합니다.
네임스페이스 내에서 비밀을 읽고 쓸 수 있는 권한을 부여하는 역할이 생성되며, 이는 RoleBinding을 사용하여 서비스 계정에 할당됩니다. 이렇게 하면 tbot
포드가 비밀에 자격 증명을 읽고 쓸 수 있습니다.
k8s-rbac.yaml
이라는 파일을 만듭니다:
# 이 서비스 계정은 `tbot` 포드에 Teleport Auth 서버에 의해 검증될 수 있는
# 개별 신원을 부여하는 데 사용됩니다.
apiVersion: v1
kind: ServiceAccount
metadata:
name: tbot
namespace: default
---
# 이 역할은 네임스페이스 내에서 비밀을 관리할 수 있는 권한을 부여합니다 -
# 이는 `kubernetes_secret` 목적지가 올바르게 작동하는 데 필요합니다.
#
# 민감한 환경에서 이 접근을 추가로 제한하기 위해 역할에 `resourceNames` 필드를
# 추가할 수 있습니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: secrets-admin
namespace: default
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["*"]
---
# 역할을 tbot을 위해 생성된 서비스 계정에 바인딩합니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: tbot-secrets-admin
namespace: default
subjects:
- kind: ServiceAccount
name: tbot
roleRef:
kind: Role
name: secrets-admin
apiGroup: rbac.authorization.k8s.io
이 파일을 Kubernetes 클러스터에 적용합니다:
kubectl apply -f ./k8s-rbac.yaml
2/5단계. 봇 생성하기
다음으로, Bot을 생성해야 합니다. Bot은 기계 또는 기계 그룹에 대한 Teleport ID입니다. 사용자와 마찬가지로 Bot도 액세스할 수 있는 권한을 정의하는 역할과 특성을 가지고 있습니다.
bot.yaml
을 생성합니다:
kind: bot
version: v1
metadata:
# name은 클러스터에서 Bot의 고유 식별자입니다.
name: example
spec:
# roles는 Bot에 부여할 역할 목록입니다. 여기에서 어떤 역할을 지정해야 할지 모른다면 걱정하지 마세요.
# 액세스 가이드가 이미 생성된 Bot에 역할을 생성하고 할당하는 방법을 안내할 것입니다.
roles: []
example
을 Bot에 대한 고유하고 설명적인 이름으로 교체했는지 확인하세요.
다음과 같이 tctl
을 사용하여 이 파일을 적용합니다:
tctl create bot.yaml
3/5단계. 조인 토큰 생성하기
다음으로, 조인 토큰을 구성해야 합니다. 이는 tbot
이 클러스터에 조인하는 데 사용됩니다. kubernetes
조인 방법이 사용될 것이므로, 먼저 Kubernetes 클러스터의 공개 키를 확인해야 합니다. JWT 서명에 사용되는 공개 키는 Kubernetes API 서버의 "JWKS" 엔드포인트에서 노출됩니다. 이 공개 키는 Teleport Auth가 tbot
이 제시하는 서비스 계정 JWT가 Kubernetes 클러스터에 의해 합법적으로 서명되었음을 검증하는 데 사용될 수 있습니다.
다음 명령어를 실행하여 JWKS 형식의 공개 키를 확인하세요:
kubectl proxy -p 8080curl http://localhost:8080/openid/v1/jwks{"keys":[--snip--]}%
bot-token.yaml
을 생성하고, JWKS 엔드포인트에서 반환된 값을 spec.kubernetes.static_jwks.jwks
에 삽입하십시오:
kind: token
version: v2
metadata:
# name은 이 토큰을 사용하기 위해 `tbot` 에서 지정됩니다.
name: example-bot
spec:
roles: [Bot]
# bot_name은 이 가이드에서 이전에 생성된 봇의 이름과 일치해야 합니다.
bot_name: example
join_method: kubernetes
kubernetes:
# static_jwks는 Auth Server가 `tbot` 이 제시하는 JWT를
# 정적으로 구성된 JWKS의 공개 키를 사용하여 검증하도록 설정합니다.
type: static_jwks
static_jwks:
jwks: |
# 여기에 curl 명령어로 반환된 데이터를 입력하십시오.
{"keys":[--snip--]}
# allow는 Auth Server가 `tbot` 이 조인할 수 있는지 결정하는 규칙을 지정합니다.
allow:
- service_account: "default:tbot" # service_account
이 파일을 적용하려면 tctl
을 사용하세요:
tctl create -f bot-token.yaml
4/5단계. tbot
배포 생성하기
먼저, tbot
의 구성 파일을 포함하는 ConfigMap이 생성됩니다. 이것은 Pod에 마운트됩니다.
k8s-deployment-config.yaml
을 생성하고, token
의 값을 앞서 생성한 토큰의 이름으로, proxy_server
의 값을 Teleport Proxy Service의 주소로 교체하십시오:
apiVersion: v1
kind: ConfigMap
metadata:
name: tbot-config
namespace: default
data:
tbot.yaml: |
version: v2
onboarding:
join_method: kubernetes
# token은 앞서 생성한 조인 토큰의 이름으로 설정되어야 합니다.
token: bot-kubernetes
storage:
# 메모리 목적지는 kubernetes 조인 방법이 영속성을 요구하지 않기 때문에
# 봇 자신의 상태에 사용됩니다.
type: memory
# 반드시 Teleport Proxy Service의 주소로 구성되어야 합니다.
proxy_server: example.teleport.sh:443
# outputs는 액세스 가이드 완료 시 채워집니다.
outputs: []
이 파일을 Kubernetes 클러스터에 적용하세요:
kubectl apply -f k8s-deployment-config.yaml
ConfigMap이 생성되었으므로, 이제 tbot
배포를 생성할 수 있습니다.
k8s-deployment.yaml
을 생성하세요:
apiVersion: apps/v1
kind: Deployment
metadata:
name: tbot
namespace: default
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app.kubernetes.io/name: tbot
template:
metadata:
labels:
app.kubernetes.io/name: tbot
spec:
containers:
- name: tbot
image: public.ecr.aws/gravitational/tbot-distroless:17.0.0-dev
args:
- start
- -c
- /config/tbot.yaml
env:
# POD_NAMESPACE는 kubernetes_secret` 목적지
# 유형이 올바르게 작동하도록 필요합니다.
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
# KUBERNETES_TOKEN_PATH는 조인에 사용할 서비스 계정
# JWT의 경로를 지정합니다.
# 이 경로는 볼륨 및 볼륨 마운트의 구성에 기반합니다.
- name: KUBERNETES_TOKEN_PATH
value: /var/run/secrets/tokens/join-sa-token
# TELEPORT_ANONYMOUS_TELEMETRY는 익명 사용량 텔레메트리 제출을 활성화합니다.
# 이는 `tbot` 의 향후 개발 방향을 정하는 데 도움이 됩니다.
# 이 설정을 생략함으로써 비활성화할 수 있습니다.
- name: TELEPORT_ANONYMOUS_TELEMETRY
value: "1"
volumeMounts:
- mountPath: /config
name: config
- mountPath: /var/run/secrets/tokens
name: join-sa-token
serviceAccountName: tbot
volumes:
- name: config
configMap:
name: tbot-config
- name: join-sa-token
projected:
sources:
- serviceAccountToken:
path: join-sa-token
# 600초는 Kubernetes가 지원하는 최소값입니다.
# 이 값을 사용하는 것을 권장합니다.
expirationSeconds: 600
# `example.teleport.sh` 는
# Teleport 클러스터의 이름으로 교체해야 합니다.
audience: example.teleport.sh
example.teleport.sh
를 Teleport 클러스터의 이름으로 교체합니다 - 이는 반드시 공개 주소일 필요는 없습니다 (포트는 포함해서는 안 됩니다).
이는 예시 매니페스트입니다. 클러스터에 배포 시 관례에 맞게 수정하는 것을 고려하십시오 (예: 레이블 사용자 지정).
FIPS 준수
기본 tbot-distroless
이미지는 FIPS 준수 바이너리를 포함하지 않습니다. FIPS
준수가 요구되는 환경에서 운영하는 경우, tbot-fips-distroless
이미지를 대신
사용하세요.
이 파일을 Kubernetes 클러스터에 적용하세요:
kubectl apply -f ./k8s-deployment.yaml
kubectl
을 사용하여 배포가 건강한지 확인하세요:
kubectl describe deployment/tbotkubectl logs deployment/tbot
이것으로 tbot
가 클러스터에 성공적으로 배포되었습니다. 그러나 아직 유용한 출력을 생성하지 않고 있습니다.
5/5단계. 출력 구성
액세스 요구 사항을 충족하는 출력을 구성하려면 액세스 가이드 중 하나를 따르십시오.
Kubernetes와 잘 작동하도록 액세스 가이드를 조정하려면 Kubernetes Secret 목적지 유형을 사용하십시오. 이렇게 하면 생성된 아티팩트가 지정된 Kubernetes Secret에 기록됩니다. 예를 들면 다음과 같습니다:
outputs:
- type: identity
destination:
type: kubernetes_secret
name: identity-output
그런 다음 이 비밀을 다른 포드 내에 마운트하여 출력을 사용할 수 있습니다:
apiVersion: v1
kind: Pod
metadata:
name: tsh
namespace: default
spec:
containers:
- name: tsh
image: public.ecr.aws/gravitational/teleport-distroless:17.0.0-dev
command:
- tsh
args:
- -i
- /identity-output/identity
- --proxy
- example.teleport.sh:443
- ls
volumeMounts:
- name: identity-output
mountPath: /identity-output
volumes:
- name: identity-output
secret:
secretName: identity-output
다음 단계
- 환경에 맞게
tbot
구성을 완료하려면 액세스 가이드를 따르십시오. - 사용 가능한 모든 구성 옵션을 탐색하려면 구성 참조를 읽으십시오.
TELEPORT_ANONYMOUS_TELEMETRY
에 대한 자세한 정보.