7) HPA 설정 가이드
Actuator 및 프로메테우스 설정 추가
설명
- HPA 구성을 위한 프로메테우스 설정 가이드
- 메모리 사용량 70%초과 시 POD 추가
ConfigMap 설정
- cloud-ekms-config
# 프로메테우스 앤드포인트 노출 포트 (기본 설정: 9090)
METRICS_PORT: 9090
# Metric 사용 여부 (기본 설정: true)
METRICS_ENABLED: true
# Metric 경로에 대한 인증 활성화 (기본 설정: false)
SECURITY_ACTUATOR_ENABLED: false
- cloud-skms-config
# 프로메테우스 앤드포인트 노출 포트 (기본 설정: 9090)
METRICS_PORT: 9090
# Metric 사용 여부 (기본 설정: true)
METRICS_ENABLED: true
# Metric 경로에 대한 인증 활성화 (기본 설정: false)
SECURITY_ACTUATOR_ENABLED: false
Service의 labels 및 metric port 추가
- cloud-ekms-service
apiVersion: v1
kind: Service
metadata:
labels:
app: cloud-ekms-service ### labels.app 정보 추가 ###
name: cloud-ekms-service
namespace: dev
spec:
type: ClusterIP
ports:
- name : ekms
port : 80
protocol: TCP
targetPort: 8080
- name : metric ### metric 포트 정보 추가 ###
port : 9090
protocol: TCP
targetPort: 9090
selector:
app: cloud-ekms-service
- cloud-skms-service
apiVersion: v1
kind: Service
metadata:
labels:
app: cloud-skms-service ### labels.app 정보 추가 ###
name: cloud-skms-service
namespace: dev
spec:
type: ClusterIP
ports:
- name : skms
port : 80
protocol: TCP
targetPort: 8080
- name : metric ### metric 포트 정보 추가 ###
port : 9090
protocol: TCP
targetPort: 9090
selector:
app: cloud-skms-service
쿠버네티스 설정
ServiceMonitor 추가
- cloud-ekms-service-monitor
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: cloud-ekms-service-monitor
namespace: dev
labels:
app: cloud-ekms-service-monitor
release: rancher-monitoring
spec:
selector:
matchLabels:
app: cloud-ekms-service
endpoints:
- interval: 30s
path: /sc-actuator/prometheus
port: metric
namespaceSelector:
matchNames:
- dev
- cloud-skms-service-monitor
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: cloud-skms-service-monitor
namespace: dev
labels:
app: cloud-skms-service-monitor
release: rancher-monitoring
spec:
selector:
matchLabels:
app: cloud-skms-service
endpoints:
- interval: 30s
path: /sc-actuator/prometheus
port: metric
namespaceSelector:
matchNames:
- dev
HPA 적용 : 메모리 사용량 70%초과 시 POD 추가
- cloud-ekms-service-hpa
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: cloud-ekms-service-hpa
namespace: dev
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: cloud-ekms-service
minReplicas: 1
maxReplicas: 5
metrics:
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 70
behavior:
scaleDown:
stabilizationWindowSeconds: 30
scaleUp:
stabilizationWindowSeconds: 30
- cloud-skms-service-hpa
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: cloud-skms-service-hpa
namespace: dev
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: cloud-skms-service
minReplicas: 1
maxReplicas: 5
metrics:
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 70
behavior:
scaleDown:
stabilizationWindowSeconds: 30
scaleUp:
stabilizationWindowSeconds: 30
- hpa 리소스 목록 조회 : kubectl get hpa -n dev
소스 적용 내용(개발자 확인 사항)
Spring Boot 디펜던시 추가
- build.gradle
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
implementation 'org.springframework.boot:spring-boot-starter-security'
ConfigMap 설정 추가
- application.yml
management:
#매트릭스에 추가적인 태그 설정 (prometheus 에서 매트릭스 수집할 때 애플리케이션 이름으로 구분 가능)
metrics:
export:
prometheus:
enabled: ${METRICS_ENABLED:true} #prometheus 매트릭스 수집 기능을 활성화
tags:
application: ${spring.application.name}
#엔드포인트 설정
endpoints:
enabled-by-default: false #모든 엔드포인트 비활성화
jmx:
exposure:
exclude: health #JMX를 통해 health 정보 노출하지 않도록 설정
web:
exposure:
include: metrics,health,info,prometheus #웹 환경에서 노출할 엔드포인트 지정
base-path: /sc-actuator #웹 엔드포인트가 /sc-actuator 경로 아래에 노출되도록 설정
#개별 엔드포인트 활성화 설정
endpoint:
info:
enabled: ${METRICS_ENABLED:true}
health:
enabled: ${METRICS_ENABLED:true}
prometheus:
enabled: ${METRICS_ENABLED:true}
metrics:
enabled: ${METRICS_ENABLED:true}
server:
port: ${METRICS_PORT:9090} #엔드포인트들이 노출되는 포트
security:
actuator:
enabled: ${SECURITY_ACTUATOR_ENABLED:false}
Metric 앤드포인트 인증 로직 및 활성화 옵션 추가
- 앤드 포인트 인증 로직 추가
- OAuth 서비스가 아닌 경우 actuator 엔드포인트의 보호는 JWT를 통해 설정 가능
- jwt 토큰 scope 의 ClientAppInfo.ReadWrite 권한이 있는 경우 인증 성공
- 환경 변수 SECURITY_ACTUATOR_ENABLED 사용해서 활성화 가능 (기본 설정: 비활성화)
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeHttpRequests(requests -> {
if (isActuatorEnabled)
requests.antMatchers("/sc-actuator/**").hasAuthority("ClientAppInfo.ReadWrite");
requests.anyRequest().permitAll();
})
.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}
매트릭 정보 조회
- 포트 포워딩
- kubectl port-forward -n dev svc/cloud-skms-service 9090:9090
- 앤드포인트 접속
{
"_links": {
"self": {
"href": "http://127.0.0.1:9090/sc-actuator",
"templated": false
},
"health-path": {
"href": "http://127.0.0.1:9090/sc-actuator/health/{*path}",
"templated": true
},
"health": {
"href": "http://127.0.0.1:9090/sc-actuator/health",
"templated": false
},
"info": {
"href": "http://127.0.0.1:9090/sc-actuator/info",
"templated": false
},
"prometheus": {
"href": "http://127.0.0.1:9090/sc-actuator/prometheus",
"templated": false
},
"metrics-requiredMetricName": {
"href": "http://127.0.0.1:9090/sc-actuator/metrics/{requiredMetricName}",
"templated": true
},
"metrics": {
"href": "http://127.0.0.1:9090/sc-actuator/metrics",
"templated": false
}
}
}
{
"names": [
"application.ready.time",
"application.started.time",
"cache.evictions",
"cache.gets",
"cache.local.disk.size",
"cache.local.heap.size",
"cache.local.offheap.size",
"cache.misses",
"cache.puts",
"cache.puts.added",
"cache.remoteSize",
"cache.removals",
"cache.size",
"cache.xa.commits",
"cache.xa.recoveries",
"cache.xa.rollbacks",
"disk.free",
"disk.total",
"executor.active",
"executor.completed",
"executor.pool.core",
"executor.pool.max",
"executor.pool.size",
"executor.queue.remaining",
"executor.queued",
"http.client.requests",
"http.server.requests",
"jvm.buffer.count",
"jvm.buffer.memory.used",
"jvm.buffer.total.capacity",
"jvm.classes.loaded",
"jvm.classes.unloaded",
"jvm.gc.live.data.size",
"jvm.gc.max.data.size",
"jvm.gc.memory.allocated",
"jvm.gc.memory.promoted",
"jvm.gc.overhead",
"jvm.gc.pause",
"jvm.memory.committed",
"jvm.memory.max",
"jvm.memory.usage.after.gc",
"jvm.memory.used",
"jvm.threads.daemon",
"jvm.threads.live",
"jvm.threads.peak",
"jvm.threads.states",
"logback.events",
"process.cpu.usage",
"process.files.max",
"process.files.open",
"process.start.time",
"process.uptime",
"rabbitmq.acknowledged",
"rabbitmq.acknowledged_published",
"rabbitmq.channels",
"rabbitmq.connections",
"rabbitmq.consumed",
"rabbitmq.failed_to_publish",
"rabbitmq.not_acknowledged_published",
"rabbitmq.published",
"rabbitmq.rejected",
"rabbitmq.unrouted_published",
"system.cpu.count",
"system.cpu.usage",
"system.load.average.1m",
"tomcat.sessions.active.current",
"tomcat.sessions.active.max",
"tomcat.sessions.alive.max",
"tomcat.sessions.created",
"tomcat.sessions.expired",
"tomcat.sessions.rejected"
]
}