studybook
  • Introduction
  • 실무 하며 깨닫는 부분 정리
    • 옵션에 대해서
    • 코드 작성의 순서
    • 자바 프로그램에 문제가 생겼다면
    • 장애 대처법
  • Logstash, Beats 정리
  • Zookeeper 정리
  • Message Queue 정리
    • RabbitMQ 삽질
  • Java 관련 정리
    • Java Primitive Wrapper class
    • Java NIO
    • Java8 Double colon operator
    • Effective Java
      • 4장
      • 5장
      • 6장 - Enum, Annotation
      • 7장 - Method
      • 8장 - 프로그래밍 일반
      • 9장 - Exception
    • Java8 Lambda expression
    • JDBC
    • Linux에서 WatchService 이상동작
  • Spring 관련 정리
    • Spring Bean init, destroy 순서
    • Spring Async Controller
    • Spring Executable jar 웹 개발 및 배포
    • Spring Boot Font 배포 에러
    • Spring AOP
      • Spring AOP로 모든 Request 로그 남기기
    • Spring Cache
    • Spring Cloud
      • Consul로 spring 설정 관리하기
    • Spring Test
      • Spring Test DirtiesContext
      • Spring Test MockBean, SpyBean
      • Spring Test Dynamic @Scheduled
    • Spring JDBC
    • Spring Validation
    • Spring Transaction Management
      • Spring with JTA 삽질
    • Spring에서 효율적으로 Static resource 관리하기
    • Zuul을 사용해서 Spring Reverse proxy 만들기
    • Spring Security
    • 스프링 어노테이션이 안 먹힐 때 의심해볼만한 것
    • Spring Data
    • Spring Webflux
      • Tobi 강연
  • 코드 리팩토링
    • 한번에 하나씩
  • 지속적 통합 (CI)
    • Jenkins pipeline 삽질기
  • Log Aggregator 정리
    • Flume 테스트
    • Fluentd 테스트
  • Web Socket 정리
  • Akka
    • Actor 모델
    • Supervision
  • IE 8 대응 정리
  • 함수형 프로그래밍
    • 모나드
  • Netty
    • Netty 기본 예제
    • Netty 주요 특징
    • Netty 부트스트랩
    • Netty 채널 파이프라인, 코덱
    • Netty 이벤트 모델
    • Netty 바이트 버퍼
  • 스칼라 관련 정리
    • Maven으로 컴파일하기
    • Scala def 괄호 여부의 차이
    • 스칼라 function, method 차이점
    • ScalaTest와 Spring 연동하기
    • Programming in Scala
  • J2S 컨퍼런스
  • Android
    • 테스트
    • NDK
  • DDOS
  • HTTP
  • HttpClient
  • Container
    • Image 개요
    • cri-o
    • kata containers
    • Open Container Initiative Image
    • Buildkit
  • Github pages
  • Static Website
  • Webhook
  • Service Discovery Tools
    • Etcd
    • Eureka
    • Consul
      • ACL
    • 비교
  • React
    • JSX
    • React Element
    • Components, Props
    • State, Lifecycle
    • Handling Event
    • Flux
  • Vagrant
    • SSH 접속
  • Linux
    • Systemd
    • Alternatives
  • Messaging protocols
    • XMPP
    • AMQP
  • Windows
    • Windows10 내장 우분투에 ssh 클라이언트로 접속하기
    • Windows10 Hyper-V와 Virtual Box가 충돌을 일으켰을 때
    • Hyper-V 기반 docker에서 Shared Drives 설정 실패할 때
    • 윈도우 개발환경 설정
    • Docker desktop 없이 docker 환경 세팅하기
    • UWP 앱을 항상 관리자권한으로 실행하는 바로가기 만들기
  • Spring camp 2017
    • Project Reactive
    • 이벤트 소싱
    • CQRS
  • Spring webflux
  • 리액티브 프로그래밍
  • Linux Settings
    • 홈서버 백업 및 복구기
    • 홈서버 트러블슈팅
  • Kubernetes
    • k3s 설치 및 삽질
    • pod resources
    • Argo workflow
    • 트러블 슈팅
      • Kubernetes namespace의 phase가 Terminating에서 멈춰있을 때
    • 쿠버네티스 마스터
    • Knative
    • Knative Pipeline
    • Aggrerated API server
    • Accessing the API
      • Authenticating
  • Sonarqube
  • HTTP/2
  • Go
    • Go Module
    • Go dependency injection
    • Go Error handling
    • Go in Action
      • 3장 패키지
      • 4장 배열, 슬라이스, 맵
      • 5장 GO의 타입 시스템
      • 6장 동시성
      • 7장 동시성 패턴
      • 8장 표준 라이브러리
      • 9장 테스트와 벤치마킹
    • Go Channel 사용법
  • Cloud Native
Powered by GitBook
On this page
  • CPU resources
  • Memory resources
  1. Kubernetes

pod resources

pod의 resources에는 node의 리소스자원을 할당받기위한 설정이 들어감. 이 때, resources에 하부 설정에는 requests, limits 두가지가 존재함. 각 리소스 종류마다 실질적으로 동작하는 방식은 다르지만 대체적으로 이 두 하부 설정은 아래와 같은 개념임.

  1. requests: pod container가 성공적으로 실행되기 위해서 반드시 확보해야하는 리소스 값. pod이 처음에 스케쥴링될 때 스케쥴러가 이 값을 사용해서 node를 선택함. request 값의 총합은 node에서 사용가능한 리소스의 값보다 커질 수 없음

  2. limits: pod container가 차지할 수 있는 리소스의 최대값. 이 값을 넘어가면 pod이 evict되거나 컨테이너가 OOM kill 당할 수 있음. limits는 무제한으로 늘어날 수 있음.

CPU resources

Compressible Resource Guarantees : 어떤 상황에서도 pod이나 container 정리되지는 않음.

Memory resources

Incompressible Resource Guarantees : 특정 상황에서는 pod이나 container를 일부 정리하는 방향으로 동작

메모리의 requests는 kubelet과 스케쥴러에 의해 동작하고 limits는 cgroup에 의해 동작하게 됨. memory resources의 설정에 따라 pod container가 OOMKilled 상태에 빠질 수 있음.

OOMKilled

  1. node에 메모리 부족

    1. eviction

      1. memory eviction signal (node.status.capacity[memory] - node.stats.memory.workingSet) 값이 eviction thresholds를 넘었을 경우 MemoryPressure 라는 node condition이 발생하는데 이 때 일부 pod을 정리함.

      2. 만약 메모리 사용량이 cAdvisor 가 수집하는 간격보다 더 가파르게 증가했을 경우 MemoryPressure 가 발생하지 않고 바로 OOMKiller에 의해 정리될 수 있음.

      3. kubelet이 pod을 정리할 때는 다음 순서를 따라 정리함.

        1. pod의 메모리 사용량이 requests를 초과하는지

        2. pod priority

        3. pod의 메모리 사용량이 requests를 제일 많이 초과하는 것

    2. OOMKiller

      1. memory limits의 총합은 node의 실제 메모리 양보다 커질 수 있음. 따라서 node에 메모리가 부족한 상황이 발생할 수 있음. 보통은 kubelet에서 eviction 등을 통해서 메모리를 다시 확보하려고 하지만 그걸로 역부족인 경우 OOMKiller를 통해 정리하게 됨. 이 경우, 컨테이너의 메모리 사용량이 requests < 메모리 사용량 < limits 인 임의의 컨테이너가 OOM으로 종료될 수 있음.

      2. 종료 순서는 컨테이너 pod의 status.qosClass 에 따라 결정됨. Best-Effort > Burstable > Guaranteed 순서로 정리됨. 프로세스를 정리하는 것은 global OOMKiller에 의해 정리되는데 qoaClass에 따라 각각 oom_score_adj 값을 다르게 주는 식으로 구현되어있음.

        1. 모든 컨테이너, 모든 resource에 대해서 limits가 존재하고, requests가 아예 없거나 limits와 동일할 경우 Guaranteed : oom_score_adj: -998

        2. 일부 컨테이너, 일부 resource에 대해서만 limits와 requests가 존재하거나 limits와 requests가 다를 경우 Burstable: oom_score_adj: min(999, max(2, 1000 - 10*(node의 전체 메모리 양에서 pod container의 request가 차지하는 비율 %)))

        3. resources 설정이 아예 존재하지 않을 경우 Best-Effort: oom_score_adj: 1000

  2. memory limits 초과

    1. 노드에 얼마나 많은 메모리가 남아있던지 거기에 상관없이 pod container의 메모리 사용량이 limits를 초과하면 container의 프로세스가 OOMKilled로 종료될 수 있음.

    2. cgroup OOMKiller에 의해서 종료됨. PID 1이 아닌 프로세스가 너무 많은 메모리를 차지하는 경우 container가 OOMKilled 상태지만 exit code 0으로 정상종료되는 일이 발생할 수도 있음.

    3. docker run의 --memory 옵션과와 같은 동작

    4. cgroup의 memory.limit_in_bytes 값을 설정

Previousk3s 설치 및 삽질NextArgo workflow

Last updated 3 years ago