테인트와 톨러레이션
테인트는 노드에 적용되고, 톨러레이션은 파드에 적용됩니다. 톨러레이션의 옵션에는 세 가지가 있습니다: NoSchedule, PreferNoSchedule, NoExecute입니다.
1. NoSchedule: 이 옵션이 설정된 노드에는 특정 조건을 만족하지 않는 파드가 스케줄링되지 않습니다. 즉, 노드에 설정된 테인트와 일치하지 않는 파드는 해당 노드에 배치될 수 없습니다.
2. PreferNoSchedule: 이 옵션은 노드가 파드를 가능한 한 스케줄링하지 않도록 선호하지만, 필수는 아닙니다. 즉, 특정 조건을 만족하지 않더라도 파드는 해당 노드에 스케줄링될 수 있습니다.
3. NoExecute: 이 옵션은 노드에서 실행 중인 파드가 특정 조건을 만족하지 않을 경우, 해당 파드를 강제로 제거합니다. 이로 인해 노드의 상태가 변경되면, 파드는 자동으로 다른 노드로 이동하게 되며, 이는 시스템의 안정성을 높이는 데 기여합니다.
노드 어피니티
노드 어피니티는 파드가 특정 노드에서 실행되도록 세부적으로 조건을 설정할 수 있는 기능으로, 파드에 적용됩니다. 노드 어피니티는 톨러레이션처럼 여러 옵션이 있으며, 강제성을 적용하거나 적용하지 않을 수 있습니다.
노드 어피니티의 주요 옵션에는 다음과 같은 것이 있습니다:
1. requiredDuringSchedulingIgnoredDuringExecution: 이 설정은 파드가 반드시 특정 조건을 만족하는 레이블을 가진 노드에 스케줄링되어야 함을 의미합니다. 스케줄링 후에는 해당 조건을 변경하더라도 파드는 실행을 계속할 수 있습니다.
2. preferredDuringSchedulingIgnoredDuringExecution: 이 옵션은 파드가 특정 조건을 가진 노드에 스케줄링되기를 선호하지만, 필수는 아닙니다. 따라서, 원하는 노드에 스케줄링되지 않을 경우 다른 노드에 배치될 수 있습니다.
3. requiredDuringSchedulingRequiredDuringExecution: 이 설정은 파드가 스케줄링될 때와 실행 중에도 반드시 특정 노드에서 실행되도록 강제합니다. 이 조건이 만족되지 않으면 파드는 해당 노드에 배치되지 않습니다.
노드 어피니티를 통해 파드를 특정 조건을 만족하는 레이블을 가진 노드에 강제적으로 스케줄링하거나, 특정 조건을 만족하지 않을 경우 다른 노드에 스케줄링하도록 유도할 수 있습니다. 또한, 실행 중인 파드가 특정 조건을 만족하지 않을 경우 파드를 노드에서 강제로 제거하는 가능성을 높일 수 있습니다.
시나리오
1. NoSchedule + requiredDuringSchedulingIgnoredDuringExecution
시나리오:
- 특정 노드에 필수적인 작업만을 배치하고 싶을 때.
- 예를 들어, 고성능의 GPU가 있는 노드에만 특정 파드를 배치해야 하며, 다른 파드는 해당 노드에 절대 배치되지 않도록 설정하고 싶을 때.
구성:
- 테인트: NoSchedule 테인트를 GPU 노드에 추가하여, GPU가 없는 파드가 배치되지 않도록 방지합니다.
- 톨러레이션: 해당 GPU를 사용하는 파드에만 NoSchedule 톨러레이션을 적용하여 GPU 노드에 스케줄링할 수 있게 합니다.
- 노드 어피니티: requiredDuringSchedulingIgnoredDuringExecution을 설정하여, 반드시 GPU가 있는 노드에만 스케줄링되도록 강제합니다.
2. PreferNoSchedule + preferredDuringSchedulingIgnoredDuringExecution
시나리오:
- 특정 노드를 선호하지만, 필요할 경우 다른 노드로도 배치가 가능해야 하는 상황.
- 예를 들어, 스토리지 속도가 빠른 SSD 노드에 파드를 배치하길 원하지만, SSD 노드가 부족할 경우 다른 일반 노드로도 배치할 수 있도록 합니다.
구성:
- 테인트: PreferNoSchedule 테인트를 SSD 노드에 적용하여, 다른 파드가 가능한 한 SSD 노드에 배치되지 않도록 합니다.
- 톨러레이션: 톨러레이션 없이 다른 노드에 배치될 수 있도록 하되, 필요 시에는 SSD 노드에도 배치될 수 있게 합니다.
- 노드 어피니티: preferredDuringSchedulingIgnoredDuringExecution을 사용하여 SSD 노드를 선호하지만, SSD 노드가 부족하면 일반 노드에도 배치되도록 설정합니다.
3. NoExecute + requiredDuringSchedulingRequiredDuringExecution
시나리오:
- 파드를 특정 노드에 배치하고, 해당 노드의 상태가 바뀌더라도 반드시 그 노드에서 실행되도록 유지하고 싶을 때.
- 예를 들어, 특정 파드가 보안적으로 민감한 데이터를 처리하며, 해당 데이터는 반드시 지정된 보안 노드에서만 처리되어야 하고, 노드의 상태가 변경되더라도 파드를 재배치하거나 종료시키지 않도록 해야 하는 경우.
구성:
- 테인트: NoExecute 테인트를 해당 보안 노드에 적용하여, 다른 파드가 들어오는 것을 막고, 지정된 파드만 실행되도록 합니다.
- 톨러레이션: NoExecute 톨러레이션을 적용하여 해당 보안 파드가 다른 노드로 축출되지 않도록 설정합니다.
- 노드 어피니티: requiredDuringSchedulingRequiredDuringExecution을 적용하여, 반드시 해당 보안 노드에서만 파드가 스케줄링 및 실행되도록 합니다.
4. NoSchedule + preferredDuringSchedulingRequiredDuringExecution
시나리오:
- 파드를 특정 노드에서 실행시키길 원하지만, 스케줄링 단계에서만 선호하는 노드를 사용하고, 실행 도중에는 반드시 지정된 노드에서 실행되게 하고 싶을 때.
- 예를 들어, 특정 파드를 고가용성이 필요한 노드에 배치하고 싶지만, 필요에 따라 초기 스케줄링은 덜 중요한 노드에서 할 수 있어야 합니다.
구성:
- 테인트: NoSchedule을 사용하여 스케줄링 단계에서 중요하지 않은 파드는 해당 노드에 배치되지 않도록 합니다.
- 톨러레이션: 톨러레이션 없이 일반 노드에도 배치될 수 있도록 하되, 실행 도중에는 특정 노드에서만 실행되도록 합니다.
- 노드 어피니티: preferredDuringSchedulingRequiredDuringExecution을 사용하여, 스케줄링 시점에서는 선호하는 노드에 배치하되, 실행 중에는 반드시 특정 노드에서만 실행되도록 합니다.
'DevOps > Kubernetes' 카테고리의 다른 글
파드가 노드에 배포되는 단계 (1) | 2024.10.15 |
---|---|
스태틱 파드와 데몬셋 (0) | 2024.10.15 |
Audit Policy 설정 방법 (1) | 2024.10.10 |
Cluster Role + RoleBinding / Role + ClusterRoleBinding (0) | 2024.10.10 |
Ingress 외에 Ingress Controller가 필요한 이유? (1) | 2024.10.09 |