ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [따배쿠] Pod - Pod에 Resource 할당하기 (CPU/memory requests, limits)
    kubernetes 2024. 12. 3. 10:15

    Pod Resource 요청 및 제한

    • Resource Requests
      • 파드를 실행하기 위한 최소 리소스 양 요청
    • Resource Limits
      • 파드가 사용할 수 있는 최대 리소스 양 제한
      •  Memory limit을 초과해서 사용하는 파드는 종료(kill)되며 다시 스케줄링 된다.
      • 해당 기능을 통해 파드가 과도한 리소스를 사용하는 것을 방지
    • 컨테이너 별로 Resource 설정도 가능하다.

     

    특징

     

    • 리소스 관리
      • 요청과 제한을 설정함으로써, 쿠버네티스는 클러스터의 리소스를 효율적으로 관리할 수 있습니다. 요청이 설정된 리소스는 스케줄링 시 고려되며, 제한은 Pod가 과도한 리소스를 사용하지 않도록 합니다.
    • 안정성
      • 요청과 제한을 통해 클러스터의 안정성을 높일 수 있습니다. 예를 들어, 특정 Pod가 갑자기 많은 리소스를 소모할 경우, 다른 Pod에 영향을 미치지 않도록 제한을 설정할 수 있습니다.

     

    작동 방식

     

    • Pod 생성을 위한 yaml 파일 작성 시, Resource의 request와 limits를 지정한 뒤 Create 합니다.
    • 쿠버네티스 스케줄러는 각 노드의 가용 리소스를 확인하고, Pod의 요청량이 해당 노드의 가용 리소스와 일치하는지 평가합니다.
    • 요청량이 노드의 가용 리소스보다 작거나 같으면, Pod는 해당 노드에 배치됩니다. 만약 모든 노드가 요청량을 수용할 수 없다면, Pod는 Pending 상태가 됩니다.

     

    예시

     

    1. Resource requests만 설정하기

     

    # pod-nginx-resources.yaml 파일 작성

    root@master:~/Getting-Start-Kubernetes/5# vi pod-nginx-resources.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod-env
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14
        ports:
        - containerPort: 80
          protocol: TCP
        env:
        - name: MYVAR
          value: "testvalue"
        resources:
          requests:
            memory: 500Mi
            cpu: 200m

     

    nginx-container의 최소 memory가 500mi, cpu는 200m를 가지게 배포해줘 !

     

    # 생성 및 확인

    root@master:~/Getting-Start-Kubernetes/5# kubectl create -f pod-nginx-resources.yaml
    pod/nginx-pod-env created
    root@master:~/Getting-Start-Kubernetes/5# kubectl describe pod nginx-pod-env
    Name:             nginx-pod-env
    Namespace:        default
    Priority:         0
    Service Account:  default
    Node:             node1/10.100.0.101
    Start Time:       Tue, 03 Dec 2024 01:18:07 +0000
    Labels:           <none>
    Annotations:      cni.projectcalico.org/containerID: cf8307f690c0a81e877578af4e4566dd5ace9ead68671e8d73fbe3e77c3fd2ef
                      cni.projectcalico.org/podIP: 192.168.166.157/32
                      cni.projectcalico.org/podIPs: 192.168.166.157/32
    Status:           Running
    IP:               192.168.166.157
    IPs:
      IP:  192.168.166.157
    Containers:
      nginx-container:
        Container ID:   containerd://0b417795ebc01ff444332a01c56c14efcf4e43727a3ef3d2aaa4d40a918e8393
        Image:          nginx:1.14
        Image ID:       docker.io/library/nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
        Port:           80/TCP
        Host Port:      0/TCP
        State:          Running
          Started:      Tue, 03 Dec 2024 01:18:08 +0000
        Ready:          True
        Restart Count:  0
        Requests:
          cpu:        1
          memory:     500Mi
        Environment:  <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-nhkxh (ro)
    Conditions:
      Type                        Status
      PodReadyToStartContainers   True
      Initialized                 True
      Ready                       True
      ContainersReady             True
      PodScheduled                True
    Volumes:
      kube-api-access-nhkxh:
        Type:                    Projected (a volume that contains injected data from multiple sources)
        TokenExpirationSeconds:  3607
        ConfigMapName:           kube-root-ca.crt
        ConfigMapOptional:       <nil>
        DownwardAPI:             true
    QoS Class:                   Burstable
    Node-Selectors:              <none>
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:
      Type    Reason     Age   From               Message
      ----    ------     ----  ----               -------
      Normal  Scheduled  43s   default-scheduler  Successfully assigned default/nginx-pod-env to node1
      Normal  Pulled     42s   kubelet            Container image "nginx:1.14" already present on machine
      Normal  Created    42s   kubelet            Created container nginx-container
      Normal  Started    42s   kubelet            Started container nginx-container

     

     

    2. Resource limits만 설정하기

     

    # pod-nginx-resources.yaml 파일 작성

    root@master:~/Getting-Start-Kubernetes/5# vi pod-nginx-resources.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod-env
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14
        ports:
        - containerPort: 80
          protocol: TCP
        resources:
          limits:
            memory: 500Mi
            cpu: 1

     

    nginx-container의 최대 memory가 500mi, cpu는 1 코어 개수를 가지게 배포해줘 !

     

    # 생성 및 확인

    root@master:~/Getting-Start-Kubernetes/5# kubectl create -f pod-nginx-resources.yaml
    pod/nginx-pod-env created
    root@master:~/Getting-Start-Kubernetes/5# kubectl describe pod nginx-pod-env
    Name:             nginx-pod-env
    Namespace:        default
    Priority:         0
    Service Account:  default
    Node:             node1/10.100.0.101
    Start Time:       Tue, 03 Dec 2024 01:22:40 +0000
    Labels:           <none>
    Annotations:      cni.projectcalico.org/containerID: acc2c3469785ae28e11327d227ea514ee1a8ec620e65063244e03ac91d013371
                      cni.projectcalico.org/podIP: 192.168.166.158/32
                      cni.projectcalico.org/podIPs: 192.168.166.158/32
    Status:           Running
    IP:               192.168.166.158
    IPs:
      IP:  192.168.166.158
    Containers:
      nginx-container:
        Container ID:   containerd://38e51906429a0ad5bca2073572dcd254cbd326baf058ba0ce168553dfa01b949
        Image:          nginx:1.14
        Image ID:       docker.io/library/nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
        Port:           80/TCP
        Host Port:      0/TCP
        State:          Running
          Started:      Tue, 03 Dec 2024 01:22:41 +0000
        Ready:          True
        Restart Count:  0
        Limits:
          cpu:     1
          memory:  500Mi
        Requests:
          cpu:        1
          memory:     500Mi

     

    resource limits만 설정했는데도, requests도 limit 값과 동일하게 생성 

     

    3. Pending 상태 확인

     

    # pod-nginx-resources.yaml 파일 작성

    root@master:~/Getting-Start-Kubernetes/5# vi pod-nginx-resources.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod-env
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14
        ports:
        - containerPort: 80
          protocol: TCP
        resources:
          requests:
            memory: 500Mi
            cpu: 2

     

    # 생성 및 확인

    root@master:~/Getting-Start-Kubernetes/5# kubectl create -f pod-nginx-resources.yaml
    pod/nginx-pod-env created
    root@master:~/Getting-Start-Kubernetes/5# kubectl get pods -o wide
    NAME            READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
    nginx-pod-env   0/1     Pending   0          9s    <none>   <none>   <none>           <none>

     

    정상적으로 생성되지 않고 pending 상태인 것을 확인 가능

    즉, 모든 node에서 CPU 2코어만큼 여유가 있지 않고, 그에 따라 모든 노드에 생성할 수가 없다.

    (현재 실습 환경인 node1, node2는 모두 2Core로 배포되어있다. 그러나 OS / kubelet 등등이 차지하고 있는 CPU도 있기때문에 CPU가 모자라 배포가 안된다.)

     

     

    4. Resource requests와 limits 정상적으로 셋팅 후, 배포

     


    # pod-nginx-resources.yaml 파일 작성

    root@master:~/Getting-Start-Kubernetes/5# vi pod-nginx-resources.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod-env
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14
        ports:
        - containerPort: 80
          protocol: TCP
        resources:
          requests:
            memory: 500Mi
            cpu: 200m
          limits:
            memory: 1Gi
            cpu : 1

     


    # 생성 및 확인

    root@master:~/Getting-Start-Kubernetes/5# kubectl create -f pod-nginx-resources.yaml
    pod/nginx-pod-env created
    pod/nginx-pod-env created
    root@master:~/Getting-Start-Kubernetes/5# kubectl get pods -o wide
    NAME            READY   STATUS    RESTARTS   AGE   IP                NODE    NOMINATED NODE   READINESS GATES
    nginx-pod-env   1/1     Running   0          6s    192.168.166.159   node1   <none>           <none>
    root@master:~/Getting-Start-Kubernetes/5# kubectl describe pod nginx-pod-env
    Name:             nginx-pod-env
    Namespace:        default
    Priority:         0
    Service Account:  default
    Node:             node1/10.100.0.101
    Start Time:       Tue, 03 Dec 2024 01:43:42 +0000
    Labels:           <none>
    Annotations:      cni.projectcalico.org/containerID: bf2328273b3450d73d4c471a0457dd726af1f4b94a971b54e627229e6e2bdddf
                      cni.projectcalico.org/podIP: 192.168.166.159/32
                      cni.projectcalico.org/podIPs: 192.168.166.159/32
    Status:           Running
    IP:               192.168.166.159
    IPs:
      IP:  192.168.166.159
    Containers:
      nginx-container:
        Container ID:   containerd://44056ce3f9c81f362b84f6825e498dccbc54f4cb5f0fa608c1900d241512c685
        Image:          nginx:1.14
        Image ID:       docker.io/library/nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
        Port:           80/TCP
        Host Port:      0/TCP
        State:          Running
          Started:      Tue, 03 Dec 2024 01:43:43 +0000
        Ready:          True
        Restart Count:  0
        Limits:
          cpu:     1
          memory:  1Gi
        Requests:
          cpu:        200m
          memory:     500Mi

     

    정상적으로 배포된 것을 확인 가능

     

     

    기타

    • CPU는 보통 m(밀리 코어)로 표현하거나, 코어 개수로 표현한다.
      • cpu : 200m / cpu : 1
    • Memory는 보통 Mi(메비 바이트), Ki(키비 바이트), Gi(기비 바이트) 로 표현한다.
      • memory : 250Mi / memory : 250Ki / memory : Gi
    • 1MB = 1000KB
    • 1Mi(B) = 1024KiB

    참고 영상

     

    https://www.youtube.com/watch?v=lxCtyWPsb-0

     

     

Designed by Tistory.