Kubernetes 이야기

Keda와 Prometheus를 이용한 Scale in/out 본문

Kubernetes/devops

Keda와 Prometheus를 이용한 Scale in/out

kmaster 2022. 4. 28. 17:27
반응형

KEDA와 Prometheus를 사용하면 사용자 요청을 기반으로 애플리케이션의 확장/축소를 할 수 있다.

 

KEDA는 Azure Queue, Kafka, RabbitMQ, Redis, NATS 등 20여가지가 넘는 다양한 메시지 이벤트를 이용하여 Scale in/out을 할 수 있도록 지원한다. 그러나 HTTP 요청 이벤트 기반의 확장은 지원하지 않아서 Prometheus를 이용한 확장을 사용한다.

 

https://dev.to/anirudhgarg_99/scale-up-and-down-a-http-triggered-function-app-in-kubernetes-using-keda-4m42

 

Nginx 설치

 

helm install ingress-controller stable/nginx-ingress \     
    --namespace ingress-nginx \
    --set controller.metrics.enabled=true \
    --set controller.podAnnotations."prometheus\.io/scrape"="true" \
    --set controller.podAnnotations."prometheus\.io/port"="10254"

 

KEDA 배포

 

https://kmaster.tistory.com/57

 

Kubernetes의 Replica를 0으로 확장 (KEDA)

Kubernetes를 테스트 또는 운영 Cluster를 사용하다보면 replicas를 0으로 세팅하고자 하는 경우가 발생한다. 운영기는 인프라의 비용을 감소시키기 위해서 필요할 수 있고, 테스트 클러스터는 테스트

kmaster.tistory.com

 

앱 배포

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sampleapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sampleapp
  template:
    metadata:
      labels:
        app: sampleapp
    spec:
      containers:
      - name: sampleapp
        image: nginx
        ports:
        - containerPort: 80
        imagePullPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: sampleapp
spec:
  type: ClusterIP
  selector:
    app: sampleapp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
  name: ingress-sampleapp
spec:
  rules:
  - host: sampleapp.10.20.200.121.nip.io
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: sampleapp
            port:
              number: 80

 

호출해 보면 아래와 같다.

KEDA 설정

 

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: prometheus-scaledobject
  labels:
    deploymentName: sampleapp
spec:
  scaleTargetRef:
    name: sampleapp
  pollingInterval: 15
  cooldownPeriod:  30
  minReplicaCount: 1
  maxReplicaCount: 10
  triggers:
  - type: prometheus
    metadata:
      serverAddress: http://prometheus-operator-prometheus.ingress-nginx.svc.cluster.local:9090
      metricName: access_frequency
      threshold: '100'
      query: sum(rate(nginx_ingress_controller_request_size_count{exported_service="sampleapp"}[1m]))

 

위의 설정은 1분 평균 요청 수를 기반으로 scale을 조정하지만 nginx_ingress_nginx_connections_active 등 다양한 조건으로 scale을 할 수 있다.

 

 

반응형

'Kubernetes > devops' 카테고리의 다른 글

GitOps and Flux  (0) 2022.05.07
Argo Event  (0) 2022.05.03
Kubernetes의 Replica를 0으로 확장 (KEDA)  (0) 2022.04.27
OWASP ZAP 을 Kubernetes 환경에서 사용하기  (0) 2022.04.02
code-server로 개발하기  (0) 2022.03.30
Comments