클러스터에서 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/binding과resourceclaims/driver요청에 대해 API 서버 감사 이벤트를 관찰하세요.
다음 단계 (What's next)
- 하드닝 가이드 - Dynamic Resource Allocation
- 클러스터 보안 설정하기
- 인가