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과 동일한 플랫폼에서 단일 가입 토큰으로 tbot을 관리하려고 할 경우 유익할 수 있습니다. 이러한 서비스는 다음과 같습니다:

필수 조건

  • 실행 중인 Teleport 클러스터 버전 이상. Teleport를 시작하려면, 가입하기 위해 무료 평가판에 등록하거나 데모 환경 설정하기를 참조하세요.

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

    tctltsh 다운로드에 대한 지침은 설치를 방문하세요.

  • 당신의 Teleport 클러스터에 연결할 수 있는지 확인하려면, tsh login으로 로그인한 다음 현재 자격 증명을 사용하여 tctl 명령어를 실행할 수 있는지 확인하십시오. 예를 들어:
    tsh login --proxy=teleport.example.com --user=email@example.com
    tctl status

    클러스터 teleport.example.com

    버전 16.2.0

    CA 핀 sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678

    클러스터에 연결하고 tctl status 명령어를 실행할 수 있다면, 현재 자격 증명을 사용하여 작업대에서 후속 tctl 명령어를 실행할 수 있습니다. 자신의 Teleport 클러스터를 호스팅하는 경우, Teleport 인증 서비스를 호스팅하는 컴퓨터에서 전체 권한으로 tctl 명령어를 실행할 수도 있습니다.
  • Token Request Projection을 지원하는 Kubernetes 클러스터(Kubernetes 1.20에서 일반 사용 가능 기능으로 졸업).
  • kubectltbot을 배포할 클러스터 내에서 자원을 생성할 수 있도록 인증되었습니다.

이 가이드의 예제에서는 Kubernetes 클러스터의 default 네임스페이스에 tbot 배포를 설치합니다. default에 대한 참조는 사용하려는 네임스페이스로 조정하십시오.

1단계/5. Kubernetes RBAC 준비

Machine ID를 위해 Kubernetes 클러스터를 준비하려면 여러 Kubernetes RBAC 리소스를 생성해야 합니다.

ServiceAccount가 생성되어 나중에 tbot을 실행할 포드에 할당됩니다. 이는 Teleport 클러스터에 가입할 수 있도록 허용할 수 있는 정적 신원을 생성하며, Kubernetes 권한을 할당할 수 있는 신원을 제공합니다.

Namespace 내 비밀을 읽고 쓸 수 있는 권한을 부여하는 Role이 생성된 후 ServiceAccount에 RoleBinding을 사용하여 할당됩니다. 이를 통해 tbot 포드가 비밀에 자격 증명을 읽고 쓸 수 있습니다.

k8s-rbac.yaml이라는 파일을 생성하십시오:

# 이 ServiceAccount는 `tbot` 포드에 명확한 신원을 제공합니다.
# 이는 Teleport Auth Server에 의해 검증될 수 있습니다.
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 생성

다음으로, 봇을 생성해야 합니다. 봇은 기계 또는 기계 그룹에 대한 Teleport 아이덴티티입니다. 사용자와 마찬가지로, 봇은 액세스할 수 있는 내용을 정의하는 일련의 역할과 특성을 가지고 있습니다.

bot.yaml을 생성하세요:

kind: bot
version: v1
metadata:
  # name은 클러스터 내에서 봇의 고유 식별자입니다.
  name: example
spec:
  # roles는 봇에 부여할 역할의 목록입니다. 여기에 어떤 역할을 지정해야 할지 모르는 경우 걱정하지 마세요.
  # Access Guides가 이미 생성된 봇에 역할을 생성하고 할당하는 방법을 안내해 드립니다.
  roles: []

example을 봇에 대한 고유하고 설명적인 이름으로 교체하는 것을 잊지 마세요.

이 파일을 적용하려면 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:
  # 이름은 `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이 생성됩니다. 이는 포드에 마운트됩니다.

k8s-deployment-config.yaml을 생성하고, 이전에 생성한 토큰의 이름으로 token의 값을 교체하고 proxy_server의 값을 Teleport Proxy 서비스의 주소로 교체하십시오:

apiVersion: v1
kind: ConfigMap
metadata:
  name: tbot-config
  namespace: default
data:
  tbot.yaml: |
    version: v2
    onboarding:
      join_method: kubernetes
      # 토큰은 이전에 생성한 가입 토큰의 이름으로 설정해야 합니다.
      token: bot-kubernetes
    storage:
      # Kubernetes 가입 방법은 지속성이 필요하지 않기 때문에
      # 봇의 자체 상태를 위한 메모리 대상을 사용합니다.
      type: memory
    # 이 설정은 Teleport Proxy 서비스의 주소로 구성되어야 합니다.
    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:16.2.0
          args:
            - start
            - -c
            - /config/tbot.yaml
          env:
            # POD_NAMESPACE는 `kubernetes_secret` 목적지 유형이 올바르게 작동하기 위해 필요합니다.
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            # KUBERNETES_TOKEN_PATH는 가입에 사용할 서비스 계정 JWT의 경로를 지정합니다.
            # 이 경로는 볼륨 및 volumeMount의 구성에 따라 달라집니다.
            - 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 비밀 목적지 유형을 사용하십시오. 이는 생성된 아티팩트를 지정된 Kubernetes 비밀에 작성합니다. 예를 들어:

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:16.2.0
      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 원문 보기