시작하기 전에

Kubernetes에서는 다음 기능을 통해 클러스터를 자동으로 확장하거나 축소되도록 할 수 있습니다.

Horizontal Pod Autoscaler는 현재 Pod이 사용 중인 자원에 따라서 필요한 Pod의 개수를 증가시키거나 감소시킵니다.

Cluster Autoscaler는 클러스터의 사용 가능한 자원과 Pod 요청하는 자원량을 비교 하여 Node를 증가시키거나 감소시킵니다.

두 가지 Autoscaler를 사용하면 클러스터 부하에 따라서 Pod, Node 개수를 자동으로 조절되도록 할 수 있습니다.

이 가이드에서는 Cluster Autoscaler에 대한 설명과 Kubernetes Service 에서 사용하는 방법에 대해서 설명합니다.

Cluster Autoscaler

자동 조절 방식

  • 사용자가 요청한 Pod의 자원량보다 현재 Cluster의 자원이 부족한 경우 노드 증가
  • 일정 시간 동안 특정 노드의 사용률이 저조한 경우 해당 노드 감소

Cluster Autoscaler는 현재 사용 중인 자원 기반으로 동작하지 않습니다. 따라서 Pod의 부하가 아무리 높더라도 요청한 자원량이 없다면 Node가 증가하지 않습니다.

노드 감소 예외

노드 사용률이 저조해도 해당 노드가 감소되지 않는 경우는 다음과 같습니다.

  • Controller(예: Deployment, StatefulSet 등)에 의해 제어되지 않는 경우
  • Local Storage가 설정되어 있는 경우
  • 다른 노드로 Pod가 이동할 수 없는 경우
  • Annotation "cluster-autoscaler.kubernetes.io/safe-to-evict": "false"이 설정되어 있는 경우

좀 더 자세한 예외 상황에 대해서는 링크를 참조하세요.

적용하기

클러스터 상세정보에서 설정을 원하는 노드풀을 선택하여 [수정] 버튼을 클릭합니다.

[설정] 을 클릭하고 원하는 최소, 최대 노드값을 지정하여 수정합니다.

해당 기능이 설정되어 있으면 수동으로 노드 갯수 를 변경할 수 없습니다.

수동으로 변경하고자 할 때는 해당 기능을 미설정으로 변경해야 합니다.

적용 범위는 클러스터가 아니라 노드풀입니다. 따라서 노드 증가 조건이 되더라도 설정이 된 노드풀에 대해서만 기능이 동작하게 됩니다.

기능 시작/정지가 적용되는 시간은 약 1분~5분 정도 걸릴 수 있습니다.

정상 동작 확인

설치가 제대로 완료되었다면 ConfigMap에서 현재 Cluster Autoscaler의 상태를 확인할 수 있습니다.

$ kubectl --kubeconfig $KUBE_CONFIG get cm cluster-autoscaler-status -o yaml -n kube-system

apiVersion: v1
data:
  status: |+
    Cluster-autoscaler status at 2019-09-03 08:59:53.84165088 +0000 UTC:
    Cluster-wide:
      Health:      Healthy (ready=1 unready=0 notStarted=0 longNotStarted=0 registered=1 longUnregistered=0)
                   LastProbeTime:      2019-09-03 08:59:53.70167178 +0000 UTC m=+23.846174142
                   LastTransitionTime: 2019-09-03 08:59:43.520248394 +0000 UTC m=+13.664750787
      ScaleUp:     NoActivity (ready=1 registered=1)
                   LastProbeTime:      2019-09-03 08:59:53.70167178 +0000 UTC m=+23.846174142
                   LastTransitionTime: 2019-09-03 08:59:43.520248394 +0000 UTC m=+13.664750787
      ScaleDown:   NoCandidates (candidates=0)
                   LastProbeTime:      2019-09-03 08:59:53.70167178 +0000 UTC m=+23.846174142
                   LastTransitionTime: 2019-09-03 08:59:43.520248394 +0000 UTC m=+13.664750787

    NodeGroups:
      Name:        k8s-default-group
      Health:      Healthy (ready=1 unready=0 notStarted=0 longNotStarted=0 registered=1 longUnregistered=0 cloudProviderTarget=1 (minSize=1, maxSize=5))
                   LastProbeTime:      2019-09-03 08:59:53.70167178 +0000 UTC m=+23.846174142
                   LastTransitionTime: 2019-09-03 08:59:43.520248394 +0000 UTC m=+13.664750787
      ScaleUp:     NoActivity (ready=1 cloudProviderTarget=1)
                   LastProbeTime:      2019-09-03 08:59:53.70167178 +0000 UTC m=+23.846174142
                   LastTransitionTime: 2019-09-03 08:59:43.520248394 +0000 UTC m=+13.664750787
      ScaleDown:   NoCandidates (candidates=0)
                   LastProbeTime:      2019-09-03 08:59:53.70167178 +0000 UTC m=+23.846174142
                   LastTransitionTime: 2019-09-03 08:59:43.520248394 +0000 UTC m=+13.664750787

kind: ConfigMap
metadata:
  annotations:
    cluster-autoscaler.kubernetes.io/last-updated: 2019-09-03 08:59:53.84165088 +0000
      UTC
  creationTimestamp: 2019-09-03T08:59:31Z
  name: cluster-autoscaler-status
  namespace: kube-system
  resourceVersion: "426558451"
  selfLink: /api/v1/namespaces/kube-system/configmaps/cluster-autoscaler-status
  uid: 248a8014-ce29-11e9-8a51-f220cd8c2e67

""에 대한 건이 검색되었습니다.

    ""에 대한 검색 결과가 없습니다.

    처리중...