노드 선언 기능
노드 선언 기능 (Node Declared Features)
기능 상태: Kubernetes v1.37부터 Stable. 이것은 쿠버네티스의 안정적인 기능이며 v1.37부터 그랬어요. 처음에는 v1.35 릴리스에서 사용할 수 있었어요. 더 이상 이 기능이나 동작을 비활성화하거나 거부할 수 없어요(잠겨 있음). 관련 기능 게이트인 NodeDeclaredFeatures에 값을 명시적으로 설정하면 쿠버네티스는 이를 무시하지만 오류는 보고하지 않아요.
쿠버네티스 노드는 선언 기능(declared features)을 사용해 새롭거나 기능 게이트로 잠긴 특정 기능의 가용성을 보고해요. 컨트롤 플레인 컴포넌트는 이 정보를 사용해 더 나은 결정을 내려요. kube-scheduler는 NodeDeclaredFeatures 플러그인을 통해 파드가 요구하는 기능을 명시적으로 지원하는 노드에만 파드가 배치되도록 보장해요. 또한 NodeDeclaredFeatureValidator 승인 컨트롤러는 노드의 선언 기능에 대해 파드 업데이트를 검증해요.
이 메커니즘은 버전 편차(version skew)를 관리하고 클러스터 안정성을 개선하는 데 도움을 줘요. 특히 클러스터 업그레이드 중이거나 노드마다 활성화된 기능이 다를 수 있는 혼합 버전 환경에서 그렇죠. 이것은 새로운 노드 레벨 기능을 도입하는 쿠버네티스 기능 개발자를 위한 것이며 백그라운드에서 작동해요. 파드를 배포하는 애플리케이션 개발자는 이 프레임워크에 직접 상호작용할 필요가 없어요.
출처: 문서
본문
동작 방식 (How it works)
선언 기능은 노드가 Node 객체의 .status.declaredFeatures 필드에 나열하는 문자열이에요. 각 선언 가능한 기능은 아직 쿠버네티스 기능 단계를 거쳐 성숙해 나가고 있는 노드 레벨 기능을 식별해요.
- Kubelet 기능 보고 (Kubelet Feature Reporting): 시작 시 각 노드의 kubelet이 현재 활성화된 관리되는 쿠버네티스 기능을 감지하고 이를 Node의
.status.declaredFeatures필드에 보고해요. 활발히 개발 중인 기능만 이 필드에 포함돼요. - 스케줄러 필터링 (Scheduler Filtering): 기본 kube-scheduler는
NodeDeclaredFeatures플러그인을 사용해요. 이 플러그인은:PreFilter단계에서PodSpec을 확인해 파드가 요구하는 노드 기능 집합을 추론해요.Filter단계에서 노드의.status.declaredFeatures에 나열된 기능이 파드에 대해 추론된 요구 사항을 충족하는지 확인해요. 파드는 필요한 기능이 없는 노드에는 스케줄링되지 않아요.- 커스텀 스케줄러도
.status.declaredFeatures필드를 사용해 비슷한 제약을 강제할 수 있어요.
- 승인 제어 (Admission Control):
NodeDeclaredFeatureValidator승인 컨트롤러는 파드가 바인딩된 노드가 선언하지 않은 기능을 요구하는 파드를 거부할 수 있어요. 이는 파드 업데이트 중 문제를 방지해요. - Kubelet 승인 (Kubelet Admission): 최종 안전장치로, kubelet은 파드를 실행하기 전에 파드의 기능 요구 사항을 노드에서 사용 가능한 기능과 다시 확인하고, 필요한 기능이 없으면 파드를 거부해요.
- GA 이후 정리 (Post-GA Cleanup): 기능이 클러스터의 모든 노드에서 사용 가능해지면(기능이 GA로 성숙하고 컨트롤 플레인과 노드 간의 지원되는 버전 편차가 지나간 후), 노드는 기능 선언을 중단해요. 이는 각 선언 기능에 최대 버전(
MaxVersion)을 설정해 달성돼요. 이 버전보다 새로운 kubelet은.status.declaredFeatures에 기능을 나열하지 않고, 스케줄러와 승인 컨트롤러는 그 기능을 보편적으로 사용 가능한 것으로 취급하고 더 이상 확인하지 않아요. 이 기능은 결국 표준 GA 이후 기능 정리의 일부로 선언 기능 집합에서 제거돼요.
선언 기능의 예시 (Example of a declared feature)
RestartAllContainersOnContainerExits 선언 기능은 노드가 파드의 모든 컨테이너의 제자리(in-place) 재시작을 지원함을 나타내요. kubelet에 RestartAllContainersOnContainerExits 기능 게이트가 활성화되면, kubelet은 Node의 상태에 이 기능을 선언해요.
apiVersion: v1
kind: Node
metadata:
name: example-node
status:
declaredFeatures:
- RestartAllContainersOnContainerExits
컨테이너 중 하나가 RestartAllContainers 액션이 있는 재시작 규칙을 지정하면 파드가 이 기능을 요구해요.
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: main
image: registry.k8s.io/busybox:1.27.2
restartPolicy: Never # 규칙이 지정되면 컨테이너 재시작 정책을 지정해야 함
restartPolicyRules: # 종료 코드 42에서 파드 전체를 제자리에서 재시작
- action: RestartAllContainers
exitCodes:
operator: In
values: [42]
이 파드를 스케줄링할 때 kube-scheduler는 .status.declaredFeatures에 RestartAllContainersOnContainerExits를 나열한 노드만 고려해요. 일부 노드만 그 기능 게이트가 활성화된 클러스터(예: 클러스터 업그레이드 도중)에서는, 이 때문에 재시작 규칙을 무시할 kubelet이 있는 노드에 파드가 할당되는 것을 방지할 수 있어요.
선언 기능은 실행 중인 파드의 업데이트도 제한해요. 예를 들어 InPlacePodVerticalScalingInitContainers 선언 기능은 노드가 init 컨테이너의 리소스를 제자리에서 크기 조정하는 것을 지원함을 나타내요. 실행 중인 파드의 init 컨테이너 크기를 조정하려는 시도가 있으면, 그 파드를 실행하는 노드가 이 기능을 선언하지 않는 한 NodeDeclaredFeatureValidator 승인 컨트롤러가 업데이트를 거부해요.
다음 단계 (What's next)
NodeDeclaredFeatureValidator승인 컨트롤러에 대해 읽기- 자세한 내용은 KEP 읽기: KEP-5328: Node Declared Features