본문 바로가기

POST/Tech

쿠버네티스 정책에 대해 누구나 알아야 할 14가지

 

 

쿠버네티스는 이제 클라우드 네이티브 배포 표준으로 자리잡았으며, 플랫폼 엔지니어와 개발자 모두 쿠버네티스의 복잡성을 이해를 필요로 합니다. 쿠버네티스는 많은 비즈니스 요구사항에 적합한 유연성을 제공하지만, 잠재적인 리스크도 포함하고 있으며 앱과 서비스를 개발하는 최선의 방법을 정확히 알지 못할 수도 있습니다. 쿠버네티스의 효율성, 신뢰성, 보안을 고려하고 개발자, 엔지니어라면 누구나 알아야할 14가지 정책에 대해 알아보겠습니다.

 

효율성

쿠버네티스는 노드 클러스터를 관리하며 CPU, 메모리, 스토리지를 포함하여 리소스가 제한되어 있습니다. 각 애플리케이션이 충분한 리소스를 배정받을 수 있도록 해야 합니다. 또한 리소스 사용량을 최적화하여 오버 프로비져닝을 피하고 비용 효율성을 개선하며 성능 제약없이 확장성을 보장할 수 있습니다. 그리고 각 리소스를 정확히 셋팅하는 것이 중요합니다.

 

1. CPU Request 미설정

CPU Request 를 설정하지 않을 경우 단일 포드(Pod)가 노드의 모든 CPU를 사용할 수 있습니다. 이런 상황은 다른 포드가 리소스를 사용할 수 없도록 만듭니다.

 

2. CPU Limit 미설정

CPU Limit 을 설정하는 것 역시 매우 중요합니다. 제한을 두지 않을 경우, 하나의 포드가 실제 필요로하는 것보다 과도하게 CPU를 소비하여 다른 포드가 필요로하는 CPU가 부족해 질 수 있습니다. 이로 인해 리소스 경합, 성능 저하 및 앱 속도 저하가 발생할 수 있습니다.

 

3. 메모리 Request 미설정

설정된 메모리가 너무 낮을 경우 애플리케이션의 신뢰성이 떨어집니다. 반면 메모리를 너무 높게 설정하면 사용하지 않는 메모리에 대한 불필요한 비용이 발생하여 클라우드 컴퓨팅 비용이 증가합니다. 쿠버네티스 스케줄러가 포드를 배치할 적절한 노드를 파악하기 어려워지며, 결과적으로 스케줄링 딜레이, 비효율적인 자원 배정 및 리소스 경합이 발생할 수 있습니다. 클러스터의 용량에 제한이 발생하여 애플리케이션의 효율적인 확장에 영향을 미칠 수도 있습니다.

 

4. 메모리 Limit 미설정

메모리의 제한을 두지 않으면 포드가 필요이상의 메모리 자원을 소비하게 되며 이는 다른 포드의 메모리 부족을 야기합니다. 이로인해 메모리 경합, 성능 저하, 애플리케이션 속도 저하 등의 문제가 발생하게 됩니다. 애플리케이션이 과도한 메모리 소모는 노드의 가용 메모리를 넘어서 OOM(out-of-memory) 에러를 일으켜 애플리케이션이 갑자기 중단될 수 있습니다.

 

신뢰성

신뢰성은 쿠버네티스 배포의 중요한 요소로 애플리케이션의 일관성, 성능, 장애 복원력을 보장합니다.

 

5. 라이브니스 프로브 (Liveness probes) 부족

라이브니스 프로브는 컨테이너의 동작 여부를 보여줍니다. 라이브니스 프로브가 실패 상태가 되면, 쿠버네티스는 컨테이너가 운영 상태로 복원되도록 신호를 자동으로 보냅니다. 라이브니스 프로브가 설정되지 않을 경우 기능을 하지 않는 포드가 계속 동작하게 되며 귀중한 자원을 불필요하게 낭비하며 애플리케이션 에러를 불러옵니다.

 

6. 레디니스 프로브 (Readiness probes) 미설정

레디니스 프로브는 애플리케이션이 “준비” 상태에 도달했음을 확인합니다. 레디니스 프로브는 포드가 완전히 준비가 되기 전에 트래픽을 받지 않도록 합니다. 레디니스 프로브 설정을 확인하는 정책은 신뢰성을 개선하는 중요한 요소중 하나입니다.

 

7. 이미지 풀 정책

도커 이미지의 캐시된 버전에 의존하는 것은 보안 취약점에 노출될 수 있습니다. 포드에 pullPolicy: Always 가 지정되어 있는지 확인하는 것이 좋습니다. 이미지가 항상 원천 소스에서 호출 되도록하며 가장 최신 버전이 사용되도록 보장합니다. 이 정책을 통해 오래되거나 취약한 이미지가 실행될 위험을 줄여주며 애플리케이션 중단 혹은 예상치 못한 상황을 예방할 수 있습니다.

 

8. 배포시 누락된 복제본

배포는 애플리케이션의 안정성과 고가용성을 유지하기 위해 특정한 수의 복제본을 유지하도록 설계되었습니다. 복제본이 없으면 트래픽과 리퀘스트를 처리하는 능력이 제한됩니다. 정책을 통해 복제본 누락으로 인한 다운타임을 최소화하고 잠재적 서비스 중단을 최소화 할 수 있습니다.

 

9. Pod Disruption Budget (PDB, 포드중단예산) 누락

PDB (포드 중단 예산)은 배포, 업그레이드, 유지보수 작업중 중단될 수 있는 포드의 수의 제한을 정의합니다. PDB를 설정하여 애플리케이션의 중단을 방지하고, 계획된 유지보수 중에도 중요한 서비스가 계속 가능하도록 합니다.

 

보안

정책 보안 검사의 시행은 쿠버네티스 배포에 대한 무단접근, 취약점 및 잠재적 위협으로부터 보호합니다.

 

10. 보안이 취약한 기능

일부 리눅스 기능은 쿠버네티스 워크로드를 위해 활성화되어 있지만 대부분의 워크로드는 이 모든 기능을 필요로하지 않습니다. 이 디폴트 설정으로 인해 컨테이너가 의도하지 않은 범위를 벗어난 작업을 수행할 수 있으며 컨테이너를 보안 위험에 노출할 가능성이 높아집니다.

 

11. 쓰기 가능한 파일 시스템

쿠버네티스 워크로드는 readOnlyRootFilesystem을 true로 설정하지 않으며, 쿠버네티스 보안을 강화하려면 이 디폴트 설정을 변경해야 합니다. 이 설정은 컨테이너가 파일 시스템에 쓰기를 못하도록 막아 애플리케이션에 손상을 가하거나 외부 실팽파일을 디스크에 쓰는 것을 방지합니다.

 

12. 권한 확대 설정

컨테이너의 환경설정 시 권한 확대가 가능할 수 있습니다. 그러나, privilegeEscalationAllowed가 false 로 설정되어 있지 않을 경우, 보안 위협이나 사이버 공격에 노출될 수 있습니다.

 

13. 특권모드로 실행(Run as Privileged)

runAsPrivileged는 포드 내의 어떤 컨테이너든 특권 모드를 활성화할 수 있는지를 결정합니다. 기본적으로 컨테이너는 호스트의 어떤 장치도 액세스할 권한이 없지만, 특권을 가진 컨테이너는 호스트의 모든 장치에 액세스할 수 있습니다. 네트워크 스택을 조작하거나 장치에 액세스해야 하는 컨테이너가 아니라면 지나치게 많은 특권은 보안에 위협이 됩니다.

 

14. 루트 실행 (Run as Root Allowed)

컨테이너를 루트로 실행하는 것은 위험합니다. 루트로 실행 가능한 컨테이너의 수를 최소화하는 것은 쿠버네티스 보안을 강화하는 방법입니다.

 

쿠버네티스 모범관행 이해 및 적용

쿠버네티스의 효과적인 도입을 위한 중요한 요소는 쿠버네티스의 구성, 관리, 보안을 규정하는 정책을 마련하는 것입니다. 일관성, 예측가능성 및 반복성을 가능하게 하며 개발자와 플랫폼 엔지니어팀이 애플리케이션을 더 자주, 효율적으로 배포하도록 합니다.

 

 

원문보기: https://www.fairwinds.com/blog/14-kubernetes-policies-know

 

참고링크:

Kubernetes rightsizing: save money and improve performance

CNCF Cloud Native FinOps + Cloud Financeial Management Microsurvey