클러스터에서 Dynamic Resource Allocation 하드닝하기

클러스터에서 Dynamic Resource Allocation 하드닝하기 (Harden Dynamic Resource Allocation in Your Cluster)

이 페이지는 클러스터 관리자에게 Dynamic Resource Allocation(DRA)에 대한 인가를 하드닝하는 방법을 보여드려요. 특히 ResourceClaim 상태 업데이트에 대한 최소 권한(least-privilege) 접근에 초점을 맞춰요.

출처: 문서

본문

시작하기 전에 (Before you begin)

쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 구성돼 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 두 개 이상 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube로 만들거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있어요.

  • iximiuz Labs
  • Killercoda
  • KodeKloud

버전을 확인하려면 kubectl version을 입력하세요.

  • Dynamic Resource Allocation이 클러스터에 구성되어 있어야 해요.
  • RBAC 리소스를 편집하고 DRA 컴포넌트를 재시작하거나 롤아웃할 수 있어야 해요.

DRA 상태를 쓰는 컴포넌트 식별하기 (Identify DRA components that write status)

클러스터에서 어떤 정체성(보통 ServiceAccount)이 ResourceClaim 상태를 업데이트하는지 문서화하세요. 일반적인 기록자(writer)는 다음과 같아요.

  • kube-scheduler 또는 커스텀 할당 컨트롤러
  • 노드 로컬 DRA 드라이버
  • 다중 노드 DRA 상태 컨트롤러

합성 하위 리소스에 최소 권한 부여하기 (Grant least-privilege permissions for synthetic subresources)

Kubernetes v1.36부터 DRA 상태 업데이트는 resourceclaims/status에 더해 합성 하위 리소스 권한이 필요해요.

스케줄러와 할당 컨트롤러 권한 부여하기 (Grant scheduler and allocation-controller permissions)

바인딩 관련 업데이트를 허용하는 역할을 적용하세요.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: dra-binding-updater
rules:
  - apiGroups: ["resource.k8s.io"]
    resources: ["resourceclaims/status"]
    verbs: ["get", "patch", "update"]
  - apiGroups: ["resource.k8s.io"]
    resources: ["resourceclaims/binding"]
    verbs: ["patch", "update"]

노드 로컬 드라이버 권한 부여하기 (Grant node-local driver permissions)

노드 로컬 드라이버에는 노드 인지(node-aware) 동사를 사용하세요.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: dra-node-driver-status-updater
rules:
  - apiGroups: ["resource.k8s.io"]
    resources: ["resourceclaims/status"]
    verbs: ["get", "patch", "update"]
  - apiGroups: ["resource.k8s.io"]
    resources: ["resourceclaims/driver"]
    verbs: ["associated-node:patch", "associated-node:update"]
    resourceNames: ["dra.example.com"]

다중 노드 컨트롤러 권한은 필요할 때만 부여하기 (Grant multi-node controller permissions only when needed)

어떤 노드에서든 업데이트해야 하는 컴포넌트에만 arbitrary-node:*를 사용하세요.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: dra-multinode-status-updater
rules:
  - apiGroups: ["resource.k8s.io"]
    resources: ["resourceclaims/status"]
    verbs: ["get", "patch", "update"]
  - apiGroups: ["resource.k8s.io"]
    resources: ["resourceclaims/driver"]
    verbs: ["arbitrary-node:patch", "arbitrary-node:update"]
    resourceNames: ["dra.example.com"]

역할을 명시적 정체성에 바인딩하기 (Bind roles to explicit identities)

각 컴포넌트 정체성에 대해 ClusterRoleBinding 객체를 만들고, 관련 없는 DRA 컴포넌트 전반에서 광범위한 역할을 공유하지 마세요. 가능하면 resourceclaims/driver 규칙을 resourceNames로 제한해, 정체성이 자신이 운영하는 특정 DRA 드라이버의 상태만 쓸 수 있게 하세요.

검증하고 모니터링하기 (Validate and monitor)

  • 각 정체성이 필요한 동사와 하위 리소스만 가지는지 확인하세요.
  • 롤아웃 후 DRA 상태 업데이트가 동작하는지 확인하세요.
  • 거부된 resourceclaims/bindingresourceclaims/driver 요청에 대해 API 서버 감사 이벤트를 관찰하세요.

다음 단계 (What's next)

  • 하드닝 가이드 - Dynamic Resource Allocation
  • 클러스터 보안 설정하기
  • 인가

더 알아보기 (Learn more)