Node Readiness Controller
문서 도구
Node Readiness Controller — 노드 수준 Readiness 관리
개요
Node Readiness Controller(NRC)는 2026년 2월 Kubernetes 공식 블로그에서 발표된 알파 기능(v0.1.1)으로, 노드 수준의 인프라 준비 상태를 선언적으로 관리하는 새로운 메커니즘입니다.
기존 Kubernetes의 노드 Ready 조건은 단순한 바이너리 상태(Ready/NotReady)만 제공하 여, CNI 플러그인 초기화, GPU 드라이버 로딩, 스토리지 드라이버 준비 등 복잡한 인프라 의존성을 정확히 반영하지 못했습니다. NRC는 이러한 한계를 해결하기 위해 커스텀 readiness gate를 선언적으로 정의할 수 있는 NodeReadinessRule CRD를 제공합니다.
핵심 가치:
- 세밀한 노드 상태 제어: 인프라 컴포넌트별 준비 상태를 독립적으로 관리
- 자동화된 Taint 관리: 조건이 충족되지 않으면 자동으로 NoSchedule Taint 적용
- 유연한 모니터링 모드: 부트스트랩 전용, 지속 모니터링, Dry-run 모드 지원
- 선택적 적용: nodeSelector로 특정 노드 그룹에만 규칙 적용
API 정보:
- API Group:
readiness.node.x-k8s.io/v1alpha1 - Kind:
NodeReadinessRule - 공식 문서: https://node-readiness-controller.sigs.k8s.io/
핵심 기능
Continuous 모드 - 지속 모니터링
노드 라이프사이클 전체에서 지정된 조건을 지속적으로 모니터링합니다. 인프라 컴포넌트가 런타임 중 실패할 경우 (예: GPU 드라이버 크래시) 즉시 Taint를 적용하여 새로운 Pod 스케줄링을 차단합니다.
사용 사례:
- GPU 드라이버 상태 모니터링
- 네트워크 플러그인 지속 헬스체크
- 스토리지 드라이버 가용성 확인
Bootstrap-only 모드 - 초기화 전용
노드 초기화 단계에서만 조건을 확인하고, 조건이 충족되면 모니터링을 중단합니다. 부트스트랩 이후에는 조건 변경에 반응하지 않습니다.
사용 사례:
- CNI 플러그인 초기 부트스트랩
- 컨테이너 이미지 프리풀 완료 확인
- 초기 보안 스캔 완료 대기
Dry-run 모드 - 안전한 검증
실제 Taint 적용 없이 규칙 동작을 시뮬레이션합니다. 프로덕션 배포 전 규칙 검증에 유용합니다.
사용 사례:
- 새로운 NodeReadinessRule 테스트
- 조건 변경 영향 분석
- 디버깅 및 문제 진단
nodeSelector - 타겟 노드 선택
라벨 기반으로 특정 노드 그룹에만 규칙을 적용합니다. GPU 노드와 범용 노드에 서로 다른 readiness 규칙을 적용할 수 있습니다.
YAML 예시
CNI 부트스트랩 - Bootstrap-only 모드
apiVersion: readiness.node.x-k8s.io/v1alpha1
kind: NodeReadinessRule
metadata:
name: network-readiness-rule
namespace: kube-system
spec:
# 확인할 노드 조건
conditions:
- type: "cniplugin.example.net/NetworkReady"
requiredStatus: "True"
# 조건 미충족 시 적용할 Taint
taint:
key: "readiness.k8s.io/acme.com/network-unavailable"
effect: "NoSchedule"
value: "pending"
# 부트스트랩 완료 후 모니터링 중단
enforcementMode: "bootstrap-only"
# 워커 노드에만 적용
nodeSelector:
matchLabels:
node-role.kubernetes.io/worker: ""
동작 흐름:
- 새 노드가 클러스터에 조인하면 NRC가 자동으로 Taint 적용
- CNI 플러그인이 초기화 완료 후
NetworkReady=True조건 설정 - NRC가 조건 확인 후 Taint 제거
- Pod 스케줄링 가능 (이후 CNI 상태 변경 무시)
GPU 노드 Continuous 모니터링
apiVersion: readiness.node.x-k8s.io/v1alpha1
kind: NodeReadinessRule
metadata:
name: gpu-driver-readiness
namespace: kube-system
spec:
conditions:
- type: "nvidia.com/gpu-driver-ready"
requiredStatus: "True"
taint:
key: "readiness.k8s.io/gpu-unavailable"
effect: "NoSchedule"
value: "driver-not-ready"
# 런타임 중에도 지속 모니터링
enforcementMode: "continuous"
# GPU 노드에만 적용
nodeSelector:
matchLabels:
nvidia.com/gpu.present: "true"
동작 흐름:
- GPU 노드 시작 시 Taint 자동 적용
- NVIDIA 드라이버 데몬이 GPU 초기화 완료 후 조건 설정
- NRC가 Taint 제거, AI 워크로드 스케줄링 가능
- 런타임 중 드라이버 크래시 발생 시:
- 조건이
False로 변경 - NRC가 즉시 Taint 재적용
- 기존 Pod는 유지, 신규 Pod 스케줄링 차단
- 조건이
EBS CSI 드라이버 준비 확인
apiVersion: readiness.node.x-k8s.io/v1alpha1
kind: NodeReadinessRule
metadata:
name: ebs-csi-readiness
namespace: kube-system
spec:
conditions:
- type: "ebs.csi.aws.com/VolumeAttachReady"
requiredStatus: "True"
taint:
key: "readiness.k8s.io/storage-unavailable"
effect: "NoSchedule"
value: "csi-not-ready"
enforcementMode: "bootstrap-only"
# 스토리지 워크로드 전용 노드에만 적용
nodeSelector:
matchLabels:
workload-type: "stateful"
Dry-run 모드 - 테스트 규칙
apiVersion: readiness.node.x-k8s.io/v1alpha1
kind: NodeReadinessRule
metadata:
name: test-custom-condition
namespace: kube-system
spec:
conditions:
- type: "example.com/CustomHealthCheck"
requiredStatus: "True"
taint:
key: "readiness.k8s.io/test-condition"
effect: "NoSchedule"
value: "testing"
# Taint 적용 없이 동작만 로깅
enforcementMode: "dry-run"
nodeSelector:
matchLabels:
environment: "staging"
EKS 적용 시나리오
VPC CNI 초기화 대기
문제: 노드가 클러스터에 조인한 직후 VPC CNI 플러그인이 완전히 초기화되기 전에 Pod이 스케줄링되면 네트워크 연결 실패가 발생합니다.
해결:
apiVersion: readiness.node.x-k8s.io/v1alpha1
kind: NodeReadinessRule
metadata:
name: vpc-cni-readiness
namespace: kube-system
spec:
conditions:
- type: "vpc.amazonaws.com/CNIReady"
requiredStatus: "True"
taint:
key: "node.eks.amazonaws.com/network-unavailable"
effect: "NoSchedule"
value: "vpc-cni-initializing"
enforcementMode: "bootstrap-only"
VPC CNI 데몬셋에서 조건 설정:
# aws-node DaemonSet의 init container
initContainers:
- name: set-node-condition
image: bitnami/kubectl:latest
command:
- /bin/sh
- -c
- |
# CNI 초기화 대기
until [ -f /host/etc/cni/net.d/10-aws.conflist ]; do
echo "Waiting for CNI config..."
sleep 2
done
# Node Condition 설정
kubectl patch node $NODE_NAME --type=json -p='[
{
"op": "add",
"path": "/status/conditions/-",
"value": {
"type": "vpc.amazonaws.com/CNIReady",
"status": "True",
"lastTransitionTime": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'",
"reason": "CNIInitialized",
"message": "VPC CNI is ready"
}
}
]'
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
GPU 노드 NVIDIA 드라이버 준비
문제: GPU 워크로드가 NVIDIA 드라이버 로딩 완료 전에 스케줄링되면 CUDA 초기화 실패로 Pod이 CrashLoopBackOff 상태에 빠집니다.
해결:
apiVersion: readiness.node.x-k8s.io/v1alpha1
kind: NodeReadinessRule
metadata:
name: nvidia-gpu-readiness
namespace: kube-system
spec:
conditions:
- type: "nvidia.com/gpu-driver-ready"
requiredStatus: "True"
- type: "nvidia.com/gpu-device-plugin-ready"
requiredStatus: "True"
taint:
key: "nvidia.com/gpu-not-ready"
effect: "NoSchedule"
value: "driver-loading"
enforcementMode: "continuous"
nodeSelector:
matchLabels:
node.kubernetes.io/instance-type: "g5.xlarge"
NVIDIA Device Plugin에서 조건 설정:
// NVIDIA Device Plugin의 헬스체크 로직
func updateNodeCondition(nodeName string) error {
// GPU 드라이버 상태 확인
version, err := nvml.SystemGetDriverVersion()
if err != nil {
return setCondition(nodeName, "nvidia.com/gpu-driver-ready", "False")
}
// Device Plugin 상태 확인
devices, err := nvml.DeviceGetCount()
if err != nil || devices == 0 {
return setCondition(nodeName, "nvidia.com/gpu-device-plugin-ready", "False")
}
// 모두 정상이면 True로 설정
setCondition(nodeName, "nvidia.com/gpu-driver-ready", "True")
setCondition(nodeName, "nvidia.com/gpu-device-plugin-ready", "True")
return nil
}