ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [K8S] Reserve Compute Resources
    Kubernetes 2024. 3. 7. 19:32

    Node Capacity

    출처 :kubernetes.io

    • Node의 자원 분배
      • allocatable : 노드에서 컨테이너가 사용할 수 있는 실제 리소스 양
      • kube-reserved : Kubernetes 시스템 구성 요소들이 사용하는 리소스 양
        (ex. kubelet, kube-scheduler,  kube-proxy 등의 서비스들이 동작하는 데 필요한 리소스 양)
      • system-reserved : 노드 전체에서 시스템 프로세스 및 기타 운영 시스템 자원이 사용하는 양
      • eviction-threshold : 배치 제한 임계값
        ( = 노드에서 허용 가능한 리소스 부족의 임계값 )
    • POD는 해당 Node에 allocatable만 사용 가능하다.
    • Reserve Compute Resources : Kubernetes에서 특정 어플리케이션이나 컨테이너에 필요한 리소스를 미리 예약(또는 보장)함으로써, 그 어플리케이션이나 컨테이너가 필요로 하는 리소스를 안정적으로 확보하기 위함.

     

     

     

     

     

    Reserve 최소값 계산하기

    계산 사이트 : Kubernetes instance calculator (learnk8s.io)

     

    Kubernetes instance calculator

    Explore the best instance types for your Kubernetes cluster interactively.

    learnk8s.io

     

     

    • Cloud 기준 reserve 값

     

     

     

    계산 예제 ( AWS-t3.2xlarge 기준 (CPU : 8C / MEM : 32G)

    • CPU
      • eviction-threshold : 0.0vCPU (~0%)
      • allocatable : 7.7vCPU (96.3%)
      • kube-reserved : 0.1vCPU (1.3%)
      • system-reserved : 0.1vCPU (1.3%)

     

    • MEMORY
      • eviction-threshold  : 100MiB (~0.3%)
      • allocatable  : 31.72MiB (94.5%)
      • kube-reserved  : 1.43MiB (4.5%)
      • system-reserved  : 100MiB (0.3%)

     

     

     

     

     

    TEST

    • 현재 node resource 확인
      • Capacity : 노드에서 사용 가능한 전체 리소스 양
      • Allocatable : 시스템 및 노드 운영체제에 의해 예약된 일부 리소스(kube-reserved, system-reserved, eviction-threshold)를 제외한 실제로 Pod에 할당 가능한 리소스 양
    kubectl describe node <node-name>

     

     

    • kubelet 환경 설정 파일 수정
      • /etc/kubernetes/kubelet.env
    KUBE_LOG_LEVEL="--v=2"
    KUBELET_ADDRESS="--node-ip=192.168.0.100"
    KUBELET_HOSTNAME="--hostname-override=test-01"
    
    
    
    KUBELET_ARGS="--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
    --config=/etc/kubernetes/kubelet-config.yaml \
    --kubeconfig=/etc/kubernetes/kubelet.conf \
    --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock \
    --runtime-cgroups=/system.slice/docker.service \
    --kube-reserved=cpu=100m,memory=1.5Gi,ephemeral-storage=1Gi \
    --system-reserved=cpu=100m,memory=1Gi,ephemeral-storage=1Gi \
    --eviction-hard=memory.available<100Mi,nodefs.available<10% \
    "
    KUBELET_CLOUDPROVIDER=""
    
    PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

    ephemeral-storage : 노드의 로컬 디스크 공간

    nodefs.available<10% : 노드 파일 시스템에서 사용 가능한 공간이 전체 공간의 10% 미만인 경우를 나타내는 조건

     

     

    • 적용
    systemctl restart kubelet

     

     

    • 확인
    kubectl describe node <node-name>

     

     

     

    • test pod 배포
      • test01.yaml, test02.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: alpine-pod
    spec:
      containers:
      - name: alpine-container
        image: alpine
        command: ["sleep", "3600"]
        resources:
          requests:
            memory: "14110Mi"
            cpu: "3900m"
          limits:
            memory: "28220Mi"
            cpu: "7800m"
    kubectl apply -f test01.yaml
    kubectl apply -f test02.yaml

     

     

    • test 결과
      • 예약한 리소스가 넘어가서 pending 상태

     

     

     

     

     

     

     

    Reference

Designed by Tistory.