수평형 포드 자동 확장을 사용하면 실시간 수요에 따라 클러스터의 기존 스테이트리스(Stateless) 워크로드에 대해 실행 중인 포드 수를 자동으로 조정할 수 있습니다. 자동 확장 처리는 부하가 증가하면 포드를 추가하고 수요가 감소하면 포드를 삭제하므로 수동 개입 없이 애플리케이션 가용성을 유지하고 리소스를 효율적으로 사용하며 비용을 제어할 수 있습니다. CPU 사용률과 같은 표준 리소스 측정항목 또는 HTTP 요청 비율과 같은 Prometheus의 커스텀 애플리케이션 측정항목을 기반으로 확장할 수 있습니다.
배포 확장하기
Kubernetes의 확장 기능을 사용하여 배포에서 실행되는 포드 수를 적절하게 확장합니다.
배포의 포드 자동 확장
Kubernetes는 수요가 변화할 때 배포를 수동으로 업데이트할 필요가 없도록 자동 확장을 제공합니다. 다음 단계를 완료하여 배포의 포드를 자동 확장합니다.
수평형 포드 자동 확장 처리가 CPU 비율을 적절하게 측정할 수 있도록 배포에 CPU 리소스 요청을 설정합니다.
배포에서 수평형 포드 자동 확장 처리를 설정합니다.
kubectl --kubeconfig CLUSTER_KUBECONFIG \ -n NAMESPACE \ autoscale deployment DEPLOYMENT_NAME \ --cpu-percent=CPU_PERCENT \ --min=MIN_NUMBER_REPLICAS \ --max=MAX_NUMBER_REPLICAS다음을 바꿉니다.
CLUSTER_KUBECONFIG: 클러스터의 kubeconfig 파일입니다.NAMESPACE: 네임스페이스입니다. 공유 클러스터의 경우 프로젝트 네임스페이스여야 합니다. 표준 클러스터의 경우 모든 네임스페이스가 될 수 있습니다.DEPLOYMENT_NAME: 자동 확장할 배포의 이름입니다.CPU_PERCENT: 모든 포드에서 요청할 대상 평균 CPU 사용률(백분율로 표시)입니다.MIN_NUMBER_REPLICAS: 자동 확장 처리에서 프로비저닝할 수 있는 포드 수의 하한값입니다.MAX_NUMBER_REPLICAS: 자동 확장 처리가 프로비저닝할 수 있는 포드 수의 상한값입니다.
수평형 포드 자동 확장 처리의 현재 상태를 확인합니다.
kubectl get hpa출력은 다음과 비슷합니다.
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE DEPLOYMENT_NAME Deployment/DEPLOYMENT_NAME/scale 0% / 50% 1 10 1 18s
배포의 포드를 수동으로 확장
배포를 수동으로 확장하려면 다음을 실행합니다.
kubectl --kubeconfig CLUSTER_KUBECONFIG \
-n NAMESPACE \
scale deployment DEPLOYMENT_NAME \
--replicas NUMBER_OF_REPLICAS
다음을 바꿉니다.
CLUSTER_KUBECONFIG: 클러스터의 kubeconfig 파일입니다.NAMESPACE: 네임스페이스입니다. 공유 클러스터의 경우 프로젝트 네임스페이스여야 합니다. 표준 클러스터의 경우 모든 네임스페이스가 될 수 있습니다.DEPLOYMENT_NAME: 자동 확장할 배포의 이름입니다.DEPLOYMENT_NAME: 배포에서 복제된Pod객체 수입니다.
자동 확장에 Prometheus의 커스텀 측정항목 사용
수평형 포드 자동 확장은 기본적으로 CPU 및 메모리 사용률과 같은 표준 리소스 측정항목을 사용합니다. 표준 측정항목은 일반적인 확장에 적합하지만 특수한 애플리케이션 부하에는 유용하지 않습니다.
Prometheus의 커스텀 측정항목과 함께 수평형 포드 자동 확장을 사용하면 HTTP 요청 비율, 큐 깊이, 처리 지연 시간과 같은 애플리케이션별 측정항목을 기반으로 워크로드를 확장할 수 있습니다. 클러스터는 Prometheus 모니터링 스택에서 이미 수집한 풍부한 데이터를 활용하여 실제 수요에 더 정확하게 대응할 수 있습니다.
수평형 포드 자동 확장과 함께 Prometheus를 사용하기 위한 기본 요건
이 기능을 사용 설정하기 전에 다음 조건을 충족해야 합니다.
기존 Prometheus 서버: Prometheus 서버가 이미 배포되어 있고 클러스터 내에서 네트워크에 액세스할 수 있어야 합니다(HPA 컨트롤러는 Prometheus 인스턴스 자체를 관리하지 않음). 자세한 내용은 Kubernetes에서 Prometheus 연산자를 배포하고 구성하는 방법을 참조하세요.
관리 권한: 클러스터 커스텀 리소스를 수정하는 데 필요한 권한이 있어야 합니다.
API 충돌 없음: 실행 전 검사에서 다른 구성요소가
custom.metrics.k8s.io에 대해 APIService를 이미 등록하지 않았는지 확인합니다. 충돌이 있으면 어댑터를 사용 설정할 수 없습니다.
Prometheus 사용 설정 및 구성
이 프로세스에는 측정항목 규칙을 정의하고 클러스터 구성을 업데이트하는 작업이 포함됩니다.
측정항목 규칙 ConfigMap을 하나 이상 만듭니다.
대상 클러스터 네임스페이스 내의 하나 이상의 ConfigMap에서 커스텀 측정항목에 대한 PromQL 기반 규칙을 정의합니다. 컨트롤러는 이러한 ConfigMap을 감시하고 병합하여 어댑터에 자동으로 적용합니다.
규칙 정의에 대한 자세한 내용은 kubernetes-sigs/prometheus-adapter의 측정항목 검색 및 표시 구성을 참조하세요.
다음 샘플은
data필드에http_requests_per_second에 대해 정의된 규칙이 있는 ConfigMap을 보여줍니다.apiVersion: v1 kind: ConfigMap metadata: name: my-app-rules namespace: <cluster-namespace> data: config.yaml: | rules: - seriesQuery: 'http_requests_total' resources: overrides: namespace_name: {resource: "namespace"} pod_name: {resource: "pod"} name: matches: "^(.*)_total$" as: "${1}_per_second" metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[5m])) by (<<.GroupBy>>)'Prometheus 서버에 상호 전송 계층 보안(mTLS)과 같은 인증이 필요한 경우 필요한 사용자 인증 정보가 포함된 kubeconfig 형식으로 Kubernetes 보안 비밀을 만듭니다.
다음 예시에서는 기본 인증을 지원하는 보안 비밀을 보여줍니다.
apiVersion: v1 kind: Secret metadata: name: prometheus-auth-secret namespace: <cluster-namespace> annotations: baremetal.cluster.gke.io/mark-source: "true" type: Opaque stringData: config: authentication-credentials클러스터 커스텀 리소스를 업데이트합니다.
클러스터 커스텀 리소스의
metadata에preview.baremetal.cluster.gke.io/metrics-adapter: "true"주석을 추가합니다.spec.metricsAdapter섹션을 추가하여 Prometheus URL을 정의하고 규칙 ConfigMap을 참조합니다.apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: <cluster-name> namespace: <cluster-namespace> annotations: preview.baremetal.cluster.gke.io/metrics-adapter: "true" spec: # ... other existing cluster configurations ... metricsAdapter: prometheus: url: "http://prometheus-k8s.monitoring.svc.cluster.local:9090" orgID: "production-environment" auth: configSecretRef: name: prometheus-auth-secret key: config # This is the key within the Secret's 'data' field rules: configMapKeyRefs: - name: my-app-rules key: config.yaml # This is the key within the ConfigMap's 'data' field # - name: base-system-rules # key: config.yamlPrometheus 인스턴스에 인증이 필요하지 않으면 클러스터 사양에서
metricsAdapter.prometheus.auth섹션을 생략할 수 있습니다.
업데이트된 클러스터 커스텀 리소스를 적용합니다.
컨트롤러는 Prometheus 어댑터를
kube-system네임스페이스에 자동으로 배포합니다.ConfigMaps
rules필드에 정의된 커스텀 측정항목을 타겟팅하는 HorizontalPodAutoscaler 리소스를 만들어 수평형 포드 자동 확장에 커스텀 측정항목을 사용합니다.이전 단계의 ConfigMap 샘플은
http_requests_per_second커스텀 측정항목을 정의했습니다. 이 측정항목을 사용하려면 HorizontalPodAutoscaler 리소스가 다음 예시와 비슷해야 합니다.apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: <name> namespace: <namespace> spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: <workload-name> minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metric: name: http_requests_per_second target: type: AverageValue averageValue: 10
Prometheus 사용 중지
수평형 포드 자동 확장과 함께 Prometheus 사용을 중지하려면 클러스터 커스텀 리소스에서 spec.metricsAdapter 섹션을 삭제합니다.