실습

Manual Scheduling

  1. Pod 생성

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
      nodeName: worker-1
    EOF
  2. Pod 상태 확인

    kubectl get pod nginx
  3. 위의 명령어를 실행하면 아래와 같은 결과를 확인할수 있습니다.

    NAME         READY   STATUS    RESTARTS   AGE
    nginx        0/1     Pending   0          4s
  4. 1분 정도 시간이 지난후에 Pod 상태를 확인

    kubectl get pod nginx
  5. 노드 목록 확인

    kubectl get node
  6. spec.nodeName에 위의 명령어의 결과로 나온 첫번째 노드 이름을 넣고 Pod를 생성

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
      nodeName: $(kubectl get node -o=jsonpath='{.items[0].metadata.name}')
    EOF
  7. Pod 상태 확인

    kubectl get pod nginx
  8. spec.nodeName을 명시하지 않고 Pod 생성

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: httpd
    spec:
      containers:
      - image: httpd
        name: httpd
    EOF
  9. spec.nodeName을 명시하지 않고 생성한 Pod에 발생한 Event 확인

    kubectl describe pod httpd
  10. spec.nodeName을 명시하고 생성한 Pod에 발생한 Event 확인

    kubectl describe pod nginx
  11. Pod 삭제

    kubectl delete pod nginx httpd

Node Selector

  1. Pod 생성

  2. Pod 상태 확인

  3. 위의 명령어를 실행하면 아래와 같은 결과를 확인할수 있습니다.

  4. 아래의 명령어를 사용해서 Pod가 배포되지 않는 이유를 찾으세요.

  5. Node에 부여된 Label 확인

  6. 두번째 노드에 키(Key)는 env 이고 값(Value)은 dev 인 Label 부여

  7. Node에 Label이 부여되었는지 확인

  8. Pending 상태였던 Pod가 배포됐는지 확인

  9. Pod에 발생한 Event 확인

  10. Node에 부여한 Label 삭제

  11. Node에 Label이 삭제되었는지 확인

  12. Pod 상태 확인

  13. Pod 삭제

Node Affinity

  1. Node에 부여된 Label 확인

  2. 각 Node의 가용영역 확인

  3. Pod 생성

  4. Pod가 배포된 노드 확인

  5. Node의 가용영역 확인

  6. 각각의 Pod가 어떤 절차에 의해서 각각의 Node에 스케쥴링 되었는지 확인

  7. Pod 삭제

  8. 아래의 YAML 파일에 명시된 spec.affinity가 의미하는 것을 설명하고 Pod 생성

  9. Pod가 배포된 노드 확인

  10. 각각의 Pod가 어떤 절차에 의해서 각각의 Node에 스케쥴링 되었는지 확인

  11. Pod 삭제

Pod Affinity

  1. Pod 생성

  2. 아래의 YAML 파일에 명시된 spec.template.spec.affinity가 의미하는 것을 설명하고 Deployment 생성

  3. Pod가 배포된 노드 확인

  4. Pod 삭제

  5. mod-security Pod가 삭제되어서 Deployment에 명시한 Affinity 규칙이 더 이상 성립되지 않습니다. 이 경우 어떤일이 발생하는지 설명하세요.

  6. Deployment 삭제

  7. 아래의 YAML 파일에 명시된 spec.template.spec.affinity가 의미하는 것을 설명하고 Deployment 생성

  8. Pod가 배포된 노드 확인

  9. 아래의 YAML 파일에 명시된 spec.template.spec.affinity가 의미하는 것을 설명하고 Deployment 생성

  10. Pod가 배포된 노드 확인

  11. 생성된 리소스 삭제

Spread Pod Across Cluster

  1. nodeSelector를 명시한 Pod 생성

  2. 각 Pod가 배포된 Node 확인

  3. 각 Node별로 배포된 Pod 갯수 확인

  4. nodeSelector를 명시하지 않은 Pod 생성

  5. 각 Pod가 배포된 Node 확인

  6. 각 Node별로 배포된 Pod 갯수 확인

  7. 위에서 nodeSelector를 명시하지 않고 생성한 Pod 삭제

  8. 각 Pod가 배포된 Node 확인

  9. 각 Node별로 배포된 Pod 갯수 확인

  10. Deployment 생성

  11. Deployment를 통해서 생성된 Pod들이 배포된 Node 확인

  12. EKS 설정창에서 Scheduler의 로깅을 활성화하면 CloudWatch를 통해서 아래와 같은 구성으로 kube-scheduler가 구동되는 것을 확인 가능

  13. Deployment 삭제

  14. 각 Node별로 배포된 Pod 갯수 확인

  15. podAntiAffinity를 명시하고 Pod 생성

  16. 위에서 생성한 Pod들이 배포된 Node 확인

  17. 위에서 생성한 Pod 삭제

  18. topologySpreadConstraints를 명시하고 Pod 생성

  19. 위에서 생성한 Pod들이 배포된 Node 확인

  20. 리소스 삭제

Requests & Limits

  1. Pod 생성

  2. Pod 상태 확인

  3. 위의 명령어를 실행하면 아래와 같은 결과를 확인할수 있습니다.

  4. 아래의 명령어를 사용해서 Pod가 배포되지 않는 이유를 찾으세요.

  5. 노드의 상태의 상세값들을 확인

  6. 위에서 확인한 값들중에서 allocatable.cpu가 무엇을 의미하는지 확인 - https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable

  7. 노드별로 할당 가용한 CPU 리소스를 확인

  8. Pending 상태인 Pod를 삭제

  9. 노드에 할당 가용한 최대 CPU 값을 spec.container.resources.requests.cpu에 넣고 Pod 생성

  10. Pod가 배포되는지 확인하고 만약 배포되지 않는다면 그 이유를 확인

  11. Pod 삭제

  12. 하나의 노드에 키(Key)는 env 이고 값(Value)은 dev 인 Label 부여

  13. Node에 Label이 부여되었는지 확인

  14. Pod 생성

  15. Pod가 생성됐는지 확인

  16. Metric Server 설치

  17. Pod들의 CPU 사용량 확인

  18. 노드별로 할당 가용한 Memory 리소스 확인

  19. Pod 재생성

  20. Pod가 생성되었는지 확인

  21. Metrics Server가 60초 마다 지표를 수집하기 때문에 2-3분 정도 대기 - https://github.com/kubernetes-sigs/metrics-server/blob/master/FAQ.md#how-often-metrics-are-scraped

  22. Pod들의 메모리 사용량 확인

  23. Pod가 배포된 Node에 발생한 Event 확인

  24. Pod의 상태가 OOMKilled가 될때까지 2-3분간 대기

  25. Pod 상태 확인

  26. 상태가 Running이 아닌 Pod가 있으면 원인을 확인

  27. 각 Pod별 QoS 클래스 확인

  28. Pod가 배포된 Node에 발생한 Event 확인

  29. 새로운 터미널을 열고 Pod가 배포된 Node의 인스턴스 ID를 확인하고 환경변수로 지정

  30. Pod가 배포된 Node로 Session Manager 연결

  31. Session Manager 종료

  32. 리소스 삭제

Taints & Tolerations

  1. Pod 생성

  2. Pod가 배포된 Node 확인

  3. Node 목록 확인

  4. 첫번째 Node에 Taint 부여

  5. Node에 부여된 Taint 확인

  6. Pod 재생성

  7. Pod가 배포된 Node 확인

  8. 첫번째 Node에 부여한 Taint 삭제

  9. Node에 부여된 Taint 확인

  10. 두번째 Node에 Taint 부여

  11. Node에 부여된 Taint 확인

  12. Pod 삭제

  13. Deployment 생성

  14. 위에서 생성한 Deployment를 통해서 생성된 Pod가 배포된 Node 확인

  15. Deployment 재생성

  16. 위에서 재생성한 Deployment를 통해서 생성된 Pod가 배포된 Node 확인

  17. Node에 Taint가 부여되어 있고 PodSpec에 Toleration이 설정되어 있을 경우에 어떤 절차를 통해서 Pod가 Node에 스케쥴링 되는지 확인

  18. 두번째 Node에 부여한 Taint 삭제

  19. Node에 부여된 Taint 확인

  20. Deployment 생성

  21. 위에서 재생성한 Deployment를 통해서 생성된 Pod가 배포된 Node 확인

  22. 첫번째 Node에 Taint 부여

  23. 첫번째 Node에 Label 부여

  24. Node에 부여된 Taint 확인

  25. Taint가 부여된 Node에 배포되었던 Pod가 삭제되고 다른 Node에 새로운 Pod가 생겼는지 확인 - 리소스가 부족할 경우 Pending 상태가 될수도 있음

  26. nodeSelector를 명시한 Pod 생성

  27. Pod가 생성되는지 확인

  28. Pod가 생성되지 않으면 그 이유를 확인

  29. Pod에 toleration 명시 - 60초 동안만 toleration 유지

  30. Pod가 생성되는지 확인

  31. 60초가 지난 후에도 Pod가 존재하는지 확인

  32. 노드에 부여한 Taint 삭제

  33. 생성된 Pod들이 Taint가 삭제된 Node로 옮겨가거나 Pending 상태의 Pod들이 Taint가 삭제된 Node에 생성되는지 확인

  34. Deployment 삭제

Descheduler

  1. Cluster Autoscaler 가 실행중인 경우에는 해당 실습이 정상적으로 수행되지 않을수도 있으니 아래의 명령어로 Cluster Autoscaler 정지

  2. Deployment 생성

  3. 생성된 Pod 확인

  4. 첫번째 Node에 있는 Pod를 다른 Node로 강제 이동

  5. 재배포된 Pod 확인

  6. Node에 부여된 Taint 확인 - 3번 명령어에서 명시된 Node에 node.kubernetes.io/unschedulable:NoSchedule Taint가 부여됨

  7. Taint 제거

  8. Node에 부여된 Taint 확인

  9. Descheduler 실행

  10. Descheduler Job 상태 확인

  11. Descheduler Job 로그 확인

  12. 재배포된 Pod 확인

  13. Descheduler Job 삭제

  14. Deployment 삭제

  15. Node에 부여된 Label 확인

  16. 하나의 노드에 키(Key)는 env 이고 값(Value)은 test 인 Label 부여

  17. Label이 정상적으로 부여 됐는지 확인

  18. Deployment 생성

  19. 생성된 Pod가 env=test Label을 부여한 노드에 배포 됐는지 확인

  20. 15번에서 env=test Label을 부여한 노드에서 해당 Label 삭제

  21. Label이 정상적으로 삭제 되었는지 확인

  22. 기존에 생성된 Pod에 변경사항이 있는지 확인

  23. 다른 노드에 키(Key)는 env 이고 값(Value)은 test 인 Label 부여

  24. Label이 정상적으로 부여 됐는지 확인

  25. 기존에 생성된 Pod에 변경사항이 있는지 확인

  26. Descheduler 실행

  27. Descheduler Job 상태 확인

  28. Descheduler Job 로그 확인

  29. Pod 상태 확인

  30. 리소스 삭제

Last updated