Infograb logo
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에서 단일 조인 토큰으로 관리하려는 경우 유리할 수 있습니다. 이러한 서비스는 다음과 같습니다:

사전 요구 사항

  • 실행 중인 Teleport 클러스터 버전 17.0.0-dev 이상. Teleport를 시작하려면 가입하여 무료 평가판을 이용하거나 데모 환경 설정 방법을 확인하십시오.

  • tctl 관리자 도구와 tsh 클라이언트 도구.

    tctltsh 다운로드 방법에 대한 지침은 설치를 방문하십시오.

  • 연결이 가능한지 확인하기 위해 tsh login 으로 로그인한 다음, 현재 자격 증명을 사용하여 tctl 명령어를 실행할 수 있는지 확인하십시오. 예를 들어:
    tsh login --proxy=teleport.example.com --user=email@example.com
    tctl 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 8080
curl 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/tbot
kubectl 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

다음 단계

Teleport 원문 보기