DevOps/K8S

[K8S] Metric Server

kyoulho 2024. 10. 10. 21:24

Metrics Server는 Kubernetes 클러스터 내에서 자원 사용량을 집계하는 경량화된 서비스이다.  CPU나 메모리 사용량에 기반하여 파드의 수를 자동으로 조절하고 노드와 파드의 자원 사용량을 확인할 수 있다. Prometheus와 같은 복잡한 모니터링 솔루션과 달리, Metrics Server는 오토스케일링에 필요한 단기적인 메트릭 수집에 특화되어 있다.


Metric Server 설치

Metrics Server는 여러 가지 방법으로 설치할 수 있다. 가장 일반적인 설치 방법은 kubectl을 사용한 매니페스트 적용과 Helm 차트를 사용하는 방법이다.

kubectl 사용

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# 또는 다운 받아서 설정을 변경해 사용할 수 있다.
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
kubectl apply -f component.yml

# 설치 확인
kubectl get deployment metrics-server -n kube-system

Helm 사용

# Helm 저장소 추가
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm repo update

# Helm을 이용해 Metrics Server 설치
helm install metrics-server metrics-server/metrics-server --namespace kube-system

# 설치 확인
# Helm을 사용할 경우, values.yaml 파일을 사용해 설치 구성을 커스터마이징할 수 있다.
kubectl get deployment metrics-server -n kube-system

설정

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  strategy:
    rollingUpdate:
      maxUnavailable: 0
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      containers:
      - name: metrics-server
        image: registry.k8s.io/metrics-server/metrics-server:v0.7.2
        imagePullPolicy: IfNotPresent
        args:
          - --kubelet-insecure-tls  # kubelet TLS 검증 비활성화 (주의 필요)
          - --cert-dir=/tmp
          - --secure-port=4443
          - --kubelet-preferred-address-types=InternalIP
        ports:
          - containerPort: 4443
            name: https
            protocol: TCP
        livenessProbe:
          httpGet:
            path: /livez
            port: https
            scheme: HTTPS
          initialDelaySeconds: 20
          periodSeconds: 10
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /readyz
            port: https
            scheme: HTTPS
          initialDelaySeconds: 20
          periodSeconds: 10
          failureThreshold: 3
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:metrics-server
rules:
  - apiGroups: [""]
    resources: ["nodes/metrics"]
    verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
  - kind: ServiceAccount
    name: metrics-server
    namespace: kube-system
---
# Metric Server는 Kubernetes API에 통합되어야 한다. 이를 위해 APIService 객체가 필요하다.
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  name: v1beta1.metrics.k8s.io
spec:
  service:
    name: metrics-server
    namespace: kube-system
  group: metrics.k8s.io
  version: v1beta1
  insecureSkipTLSVerify: true
  groupPriorityMinimum: 100
  versionPriority: 100

확인

top 명령어를 실행하면, 현재 네임스페이스에 있는 모든 파드의 CPU 및 메모리 사용량을 출력한다.

kubectl top pods
# 출력 예시:
NAME            CPU(cores)   MEMORY(bytes)
nginx-1         100m         200Mi
nginx-2         150m         250Mi
nginx-3         50m          100Mi
  • CPU(cores)
    • 파드에서 사용 중인 CPU 코어의 양. 이 값은 “millicores”로 표현된다.
    • 1 CPU는 클러스터의 전체 CPU 코어 하나를 의미하며, 1000m은 1 CPU와 동일하다.
    • 예를 들어, 100m은 0.1 CPU를 의미하며, 파드가 클러스터의 CPU 자원의 10%를 사용하고 있음을 나타낸다.
    • 500m(0.5CPU)를 초과하거나 메모리 사용량이 1Gi를 초과하면 해당 파드가 예상보다 많은 자원을 사용하고 있음을 의미한다.
  • MEMORY(bytes)
    • 파드에서 소비 중인 메모리 사용량이다. 메모리 사용량은 바이트 단위로 표시됩니다.
    • 예를 들어, 200Mi는 200MB의 메모리를 의미한다.


HPA와 통합

Horizontal Pod Autoscaler(HPA)는 Kubernetes에서 애플리케이션의 리소스 사용량(주로 CPU 및 메모리)을 기반으로 오토스케일링하는 기능이다. HPA는 주기적으로 리소스(예: Deployment, StatefulSet 등)의 자원 사용량을 체크하고, 설정된 기준에 맞춰 스케일링 결정을 내린다.

HPA 설정 예시

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: multi-metric-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: multi-app
  minReplicas: 2
  maxReplicas: 10
metrics:
- type: Resource
  resource:
    name: cpu
    target:
      type: Utilization
      averageUtilization: 60
- type: Resource
  resource:
    name: memory
    target:
      type: Utilization
      averageUtilization: 75

HPA의 주요 고려 사항

메트릭 수집 및 스케일링 주기

HPA는 기본적으로 15초 간격으로 메트릭 데이터를 수집하고, 그에 따라 확장 또는 축소 결정을 내린다. 이 주기는 HPA 설정에 따라 조정할 수 있으며, 자원의 변화에 민감한 애플리케이션에서는 더 짧은 주기로 설정하는 것이 유리할 수 있습니다. 다만, 주기가 짧아질수록 확장 및 축소가 잦아져 클러스터의 불안정을 초래할 수 있으므로, 적절한 주기를 설정하는 것이 중요하다.

확장 안정화 기간

급격한 확장을 방지하기 위해 설정된 주기 동안 최소 파드 수를 유지하려고 한다. 파드가 빠르게 확장되거나 축소되는 것을 방지하기 위해 stabilizationWindowSeconds 설정을 통해 안정화 기간을 설정할 수 있다.

자원 요청과 HPA 연동

HPA는 파드의 자원 사용량을 모니터링하여 스케일링 결정을 내릴 때, 파드에 설정된 자원 요청(requests) 값을 기준으로 자원의 사용 비율을 평가한다. 만약 파드에 requests가 정의되지 않으면 HPA는 자원의 사용률을 계산할 수 없기 때문에 확장 또는 축소 결정을 내리지 못한다. 따라서 HPA와 연동할 파드는 반드시 CPU 및 메모리의 requests 값을 설정해야 한다.

resources:
  requests:
    cpu: "200m"         # 최소 200 millicores (0.2 CPU)
    memory: "300Mi"     # 최소 300Mi 메모리
  limits:
    cpu: "500m"         # 최대 500 millicores (0.5 CPU)
    memory: "500Mi"     # 최대 500Mi 메모리

만약 파드에 CPU 요청량이 200m로 설정되어 있고, 실제로 파드가 100m의 CPU를 사용한다면, HPA는 파드가 50%의 CPU를 사용 중이라고 계산한다. HPA 설정에서 평균 CPU 사용량이 60%를 넘으면 확장하도록 정의되어 있을 경우, 이 파드는 아직 확장되지 않지만 CPU 사용량이 120m(60%)를 초과하면 HPA는 파드를 확장하게 된다.

728x90

'DevOps > K8S' 카테고리의 다른 글

[K8S] 테인트와 톨러레이션  (0) 2024.10.14
[K8S] StatefulSet  (1) 2024.10.10
[K8S] MetalLB  (1) 2024.10.10
[K8S] 인그레스와 관련 리소스  (1) 2024.10.08
[k8s] DNS  (1) 2024.09.02