디바이스 테인트와 톨러레이션
디바이스 테인트와 톨러레이션 (device-taints)
이 페이지는 DRA의 디바이스 테인트(taints)와 톨러레이션(tolerations)을 설명해요. 드라이버와 관리자가 이 기능으로 특정 디바이스에서 Pod를 제외시키거나, 이미 사용 중인 디바이스에서 Pod를 축출(evict)할 수 있어요.
디바이스 테인트와 톨러레이션 (Device taints and tolerations)
기능 상태: 쿠버네티스 v1.37부터 안정(stable)
이 기능은 쿠버네티스 v1.37부터 안정 기능이에요. 처음에는 v1.33 릴리스에서 사용 가능했어요. 이제 이 기능·동작을 비활성화하거나 옵트아웃할 수 없어요(잠겨 있음). 관련 기능 게이트(DRADeviceTaints)에 값을 명시적으로 설정하면 쿠버네티스는 그 값을 무시하되 오류를 보고하지는 않아요.
디바이스 테인트는 노드 테인트와 비슷해요. 테인트는 문자열 키(key), 문자열 값(value), 효과(effect)를 가져요. 그 효과는 테인트된 디바이스를 사용하는 ResourceClaim과 그 ResourceClaim을 참조하는 모든 Pod에 적용돼요. "NoSchedule" 효과는 그런 Pod의 스케줄링을 막아요. 테인트된 디바이스는 ResourceClaim을 할당할 때 무시되는데, 그것을 사용하면 Pod 스케줄링을 막을 것이기 때문이에요.
"NoExecute" 효과는 "NoSchedule"을 포함하면서, 추가로 이미 스케줄된 모든 Pod의 축출을 유발해요. 이 축출은 kube-controller-manager의 디바이스 테인트 축출 컨트롤러가 관련 Pod를 삭제함으로써 구현돼요.
"None" 효과는 스케줄러와 축출 컨트롤러가 무시해요. DRA 드라이버는 이 효과를 사용해 관리자나 다른 컨트롤러에게 예외를 전달할 수 있어요. 예를 들어 디바이스의 성능 저하(health)를 알리는 데 쓰죠. 관리자는 DeviceTaintRules에서 Pod 축출의 드라이런(dry-run)을 하는 데도 사용할 수 있어요(더 아래에서 설명).
ResourceClaim은 테인트를 톨러레이트(tolerate)할 수 있어요. 테인트가 톨러레이트되면 그 효과는 적용되지 않아요. 빈 톨러레이션은 모든 테인트와 매칭돼요. 톨러레이션은 특정 효과로 제한하거나 특정 키/값 쌍과 매칭하도록 제한할 수 있어요. 톨러레이션은 특정 키가 존재하는지만 확인할 수도 있고, 값에 관계없이, 또는 특정 값을 확인할 수도 있어요. 이 매칭에 대한 자세한 내용은 노드 테인트 개념을 참고하세요.
테인트를 일정 기간 동안 톨러레이트하면 축출을 지연시킬 수 있어요. 그 지연은 테인트가 디바이스에 추가된 시점부터 시작되는데, 이 시각은 테인트의 필드에 기록돼요.
테인트는 위에서 설명한 것처럼 노드의 "모든" 디바이스를 할당하는 ResourceClaim에도 적용돼요. 모든 디바이스가 테인트되지 않았거나, 모든 테인트가 톨러레이트되어야 해요. 관리자 접근(admin access)으로 디바이스를 할당하는 것도 면제되지 않아요. 그 모드를 사용하는 관리자는 테인트된 디바이스에 접근하려면 모든 테인트를 명시적으로 톨러레이트해야 해요.
다음과 같은 방식으로, DeviceTaintRule API 종류를 사용해서 디바이스에 테인트를 추가할 수 있어요.
드라이버가 설정하는 테인트 (Taints set by the driver)
DRA 드라이버는 자신이 ResourceSlices에 게시하는 디바이스 정보에 테인트를 추가할 수 있어요. 드라이버가 테인트를 사용하는지, 키와 값이 무엇인지 알아보려면 DRA 드라이버의 문서를 참고하세요.
관리자가 설정하는 테인트 (Taints set by an admin)
기능 상태: 쿠버네티스 v1.37부터 안정(stable)
관리자는 DeviceTaintRule API 종류를 사용해 드라이버가 설정하지 않은 디바이스에도 테인트를 추가할 수 있어요.