ํ์ฅ์ฑ์ ํด๋ผ์ฐ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ํต์ฌ ์๊ตฌ ์ฌํญ์
๋๋ค. Kubernetes๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ ํ ๋ฐฐํฌ๋ฅผ ์ํด ๋ณต์ ๋ณธ ์๋ฅผ ๋๋ฆฌ๋ ๊ฒ๋งํผ ๊ฐ๋จํ๊ฒ ์ ํ๋ฆฌ์ผ์ด์
์ ํ์ฅํ ์ ์์ต๋๋ค. ReplicaSet
โ ํ์ง๋ง ์ด๋ ์๋ ํ๋ก์ธ์ค์
๋๋ค.
Kubernetes๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ ์๋์ผ๋ก ํ์ฅํ ์ ์์ต๋๋ค(์: ๋ฐฐํฌ ๋๋ ReplicaSet
) Horizon Pod Autoscaler ์ฌ์์ ์ฌ์ฉํ์ฌ ์ ์ธ์ ์ธ ๋ฐฉ์์ผ๋ก ์ํ๋ฉ๋๋ค. ์๋ ์กฐ์ ์ ๊ธฐ๋ณธ ๊ธฐ์ค์ CPU ์ฌ์ฉ๋ ์งํ(๋ฆฌ์์ค ์งํ)์ด์ง๋ง ์ฌ์ฉ์ ์ง์ ์งํ์ ์ธ๋ถ ์ ๊ณต ์งํ๋ฅผ ํตํฉํ ์ ์์ต๋๋ค.
ํ
Pod์ ์ํ์ Auto Scaling ๋์ ์คํ ์์ค Kubernetes ์ฐ์ฐ์์ธ KEDA(Kubernetes Event Driven Auto Scaling)๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํฌ๋ก๋์ ๋ํ ์ํํ ์๋ ํฌ๊ธฐ ์กฐ์ (XNUMX์์/XNUMX๊น์ง ํฌํจ)์ ์ ๊ณตํ๊ธฐ ์ํด ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ ํฌ๋ ์๋ ํฌ๊ธฐ ์กฐ์ ๊ธฐ์ ํตํฉ๋ฉ๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋:
์์คํ ์ ๊ฐ๋ตํ ๊ฐ์
๋ค์ด์ด๊ทธ๋จ์ ๋ชจ๋ ์๋ ๋ฐฉ์์ ๋ํ ๊ฐ๋ตํ ์ค๋ช
์ ๋ณด์ฌ์ค๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ Prometheus ํ์์ผ๋ก HTTP ์ ์ค ํ์ ์ธก์ ํญ๋ชฉ์ ์ ๊ณตํฉ๋๋ค.
- Prometheus๋ ์ด๋ฌํ ์ธก์ ํญ๋ชฉ์ ์์งํ๋๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
- KEDA์ Prometheus ์ค์ผ์ผ๋ฌ๋ HTTP ์ ์ค ์์ ๋ฐ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋์ผ๋ก ํ์ฅํ๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
์ด์ ๊ฐ ์์์ ๋ํด ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
KEDA์ ํ๋ก๋ฉํ ์ฐ์ค
Prometheus๋ ์คํ ์์ค ์์คํ
๋ชจ๋ํฐ๋ง ๋ฐ ๊ฒฝ๊ณ ํดํท์
๋๋ค.
KEDA๋ ์ค์ผ์ผ๋ฌ ๊ฐ๋ ์ ์ง์ํฉ๋๋ค. ์ด๋ KEDA์ ์ธ๋ถ ์์คํ ์ฌ์ด์ ๊ฐ๊ต ์ญํ ์ ํฉ๋๋ค. ์ค์ผ์ผ๋ฌ ๊ตฌํ์ ๊ฐ ๋์ ์์คํ ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ์ฌ๊ธฐ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ KEDA๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์๋ ์ค์ผ์ผ๋ง์ ์ ์ดํฉ๋๋ค.
์ค์ผ์ผ๋ฌ๋ Kafka, Redis, Prometheus์ ๊ฐ์ ์ฌ๋ฌ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ง์ํฉ๋๋ค. ์ฆ, KEDA๋ฅผ ์ฌ์ฉํ๋ฉด Prometheus ์ธก์ ํญ๋ชฉ์ ๊ธฐ์ค์ผ๋ก Kubernetes ๋ฐฐํฌ๋ฅผ ์๋์ผ๋ก ํ์ฅํ ์ ์์ต๋๋ค.
์ํ ์ ์ฉ
Golang ํ ์คํธ ์ ํ๋ฆฌ์ผ์ด์ ์ HTTP๋ฅผ ํตํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ๊ณ ๋ ๊ฐ์ง ์ค์ํ ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค.
- Prometheus Go ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ณ์ธกํ๊ณ ์ ์ค ํ์๊ฐ ํฌํจ๋ http_requests ์งํ๋ฅผ ์ ๊ณตํฉ๋๋ค. Prometheus ์ธก์ ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์๋ ์๋ํฌ์ธํธ๋ URI์ ์์ต๋๋ค.
/metrics
.var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "http_requests", Help: "number of http requests", })
- ์์ฒญ์ ๋ํ ์๋ต์ผ๋ก
GET
์ ํ๋ฆฌ์ผ์ด์ ์ ํค ๊ฐ์ ์ฆ๊ฐ์ํต๋๋ค(access_count
) Redis์์. ์ด๋ HTTP ํธ๋ค๋ฌ์ ์ผ๋ถ๋ก ์์ ์ ์ํํ๊ณ Prometheus ์ธก์ ํญ๋ชฉ์ ํ์ธํ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋๋ค. ์ธก์ ํญ๋ชฉ ๊ฐ์ ๊ฐ๊ณผ ๋์ผํด์ผ ํฉ๋๋ค.access_count
๋ ๋์ค์์.func main() { http.Handle("/metrics", promhttp.Handler()) http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { defer httpRequestsCounter.Inc() count, err := client.Incr(redisCounterName).Result() if err != nil { fmt.Println("Unable to increment redis counter", err) os.Exit(1) } resp := "Accessed on " + time.Now().String() + "nAccess count " + strconv.Itoa(int(count)) w.Write([]byte(resp)) }) http.ListenAndServe(":8080", nil) }
์ ํ๋ฆฌ์ผ์ด์
์ ๋ค์์ ํตํด Kubernetes์ ๋ฐฐํฌ๋ฉ๋๋ค. Deployment
. ์๋น์ค๋ ์์ฑ๋ฉ๋๋ค ClusterIP
, ์ด๋ฅผ ํตํด Prometheus ์๋ฒ๋ ์ ํ๋ฆฌ์ผ์ด์
์ธก์ ํญ๋ชฉ์ ์ป์ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์
ํ๋ก๋ฉํ ์ฐ์ค ์๋ฒ
Prometheus ๋ฐฐํฌ ๋งค๋ํ์คํธ๋ ๋ค์์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
ConfigMap
โ Prometheus ๊ตฌ์ฑ์ ์ ์กํฉ๋๋ค.Deployment
โ Kubernetes ํด๋ฌ์คํฐ์ Prometheus๋ฅผ ๋ฐฐํฌํ๋ ๊ฒฝ์ฐClusterIP
โ UI Prometheus์ ์ก์ธ์คํ๊ธฐ ์ํ ์๋น์คClusterRole
,ClusterRoleBinding
ะธServiceAccount
โ Kubernetes์์ ์๋น์ค ์๋ ๊ฐ์ง(์๋ ๊ฒ์)์ฉ์ ๋๋ค.
์ฌ๊ธฐ์
KEDA ํ๋ก๋ฉํ ์ฐ์ค ScaledObject
์ค์ผ์ผ๋ฌ๋ ์ธก์ ํญ๋ชฉ์ ๊ฐ์ ธ์์ผ ํ๋ ์ธ๋ถ ์์คํ
๊ณผ KEDA ์ฌ์ด์ ๋ธ๋ฆฌ์ง ์ญํ ์ ํฉ๋๋ค. ScaledObject
๋ฐฐํฌ๋ฅผ ์ด๋ฒคํธ ์์ค(์ด ๊ฒฝ์ฐ Prometheus)์ ๋๊ธฐํํ๊ธฐ ์ํด ๋ฐฐํฌํด์ผ ํ๋ ์ฌ์ฉ์ ์ง์ ๋ฆฌ์์ค์
๋๋ค.
ScaledObject
๋ฐฐํฌ ํ์ฅ ์ ๋ณด, ์ด๋ฒคํธ ์์ค ๋ฉํ๋ฐ์ดํฐ(์: ์ฐ๊ฒฐ ๋น๋ฐ, ๋๊ธฐ์ด ์ด๋ฆ), ํด๋ง ๊ฐ๊ฒฉ, ๋ณต๊ตฌ ๊ธฐ๊ฐ ๋ฐ ๊ธฐํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ฉ๋๋ค. ๋ฐฐํฌ๋ฅผ ํ์ฅํ๊ธฐ ์ํด ํด๋น ์๋ ํฌ๊ธฐ ์กฐ์ ๋ฆฌ์์ค(HPA ์ ์)๊ฐ ์์ฑ๋ฉ๋๋ค.
๊ฐ์ฒด์ผ ๋ ScaledObject
์ญ์ ๋๋ฉด ํด๋น HPA ์ ์๊ฐ ์ง์์ง๋๋ค.
์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ScaledObject
์ด ์์์๋ ์ค์ผ์ผ๋ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. Prometheus
:
apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
name: prometheus-scaledobject
namespace: default
labels:
deploymentName: go-prom-app
spec:
scaleTargetRef:
deploymentName: go-prom-app
pollingInterval: 15
cooldownPeriod: 30
minReplicaCount: 1
maxReplicaCount: 10
triggers:
- type: prometheus
metadata:
serverAddress:
http://prometheus-service.default.svc.cluster.local:9090
metricName: access_frequency
threshold: '3'
query: sum(rate(http_requests[2m]))
๋ค์ ์ฌํญ์ ๊ณ ๋ คํ์ญ์์ค.
- ๊ทธ๋ ๋ค์์ ๊ฐ๋ฆฌํจ๋ค.
Deployment
์ด๋ฆ์ผ๋กgo-prom-app
. - ํธ๋ฆฌ๊ฑฐ ์ ํ -
Prometheus
. Prometheus ์๋ฒ ์ฃผ์๋ ์ธก์ ํญ๋ชฉ ์ด๋ฆ, ์๊ณ๊ฐ ๋ฐPromQL ์ฟผ๋ฆฌ , ์ด๋ ์ฌ์ฉ๋ ๊ฒ์ ๋๋ค. PromQL ์ฟผ๋ฆฌ -sum(rate(http_requests[2m]))
. - ์ ๋ฐ๋ฅด๋ฉด
pollingInterval
,KEDA๋ XNUMX์ด๋ง๋ค ํ๋ก๋ฉํ ์ฐ์ค์๊ฒ ํ์ ์ ์์ฒญํฉ๋๋ค. (minReplicaCount
), ์ต๋ Pod ์๋ ๋ค์์ ์ด๊ณผํ์ง ์์ต๋๋ค.maxReplicaCount
(์ด ์์์๋ - XNUMX).
์ค์น ๊ฐ๋ฅ minReplicaCount
XNUMX๊ณผ ๊ฐ์ต๋๋ค. ์ด ๊ฒฝ์ฐ KEDA๋ XNUMX๋XNUMX ๋ฐฐํฌ๋ฅผ ํ์ฑํํ ๋ค์ ์ถ๊ฐ ์๋ ํ์ฅ์ ์ํด HPA๋ฅผ ๊ณต๊ฐํฉ๋๋ค. ์ญ์, ์ฆ XNUMX์์ XNUMX์ผ๋ก ํฌ๊ธฐ ์กฐ์ ๋ ๊ฐ๋ฅํฉ๋๋ค. ์ด ์์์๋ ์ด๊ฒ์ด ์ฃผ๋ฌธํ ์์คํ
์ด ์๋๋ผ HTTP ์๋น์ค์ด๊ธฐ ๋๋ฌธ์ XNUMX์ ์ ํํ์ง ์์์ต๋๋ค.
์๋ ํ์ฅ์ ๋ง๋ฒ
์๊ณ๊ฐ์ ๋ฐฐํฌ๋ฅผ ํ์ฅํ๊ธฐ ์ํ ํธ๋ฆฌ๊ฑฐ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์์์๋ PromQL ์ฟผ๋ฆฌ sum(rate (http_requests [2m]))
์ง๋ XNUMX๋ถ ๋์ ์ธก์ ๋ ์ง๊ณ๋ HTTP ์์ฒญ ๋น์จ(์ด๋น ์์ฒญ ์)์ ๋ฐํํฉ๋๋ค.
์๊ณ๊ฐ์ด XNUMX์ด๋ฏ๋ก ๊ฐ์ด XNUMX๊ฐ ๋ฏธ๋ง์ธ ๋์ XNUMX๊ฐ ๋ฏธ๋ง์ด ๋๋ค๋ ์๋ฏธ์
๋๋ค. sum(rate (http_requests [2m]))
XNUMX๊ฐ ๋ฏธ๋ง. ๊ฐ์ด ์ฆ๊ฐํ๋ฉด ๋งค๋ฒ ํ์๊ฐ ์ถ๊ฐ๋ฉ๋๋ค. sum(rate (http_requests [2m]))
12๊ฐ ์ฆ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๊ฐ์ด 14~XNUMX์ด๋ฉด Pod ์๋ XNUMX๊ฐ์
๋๋ค.
์ด์ ์ค์ ํด ๋ณด๊ฒ ์ต๋๋ค!
์ฌ์ ์ค์
Kubernetes ํด๋ฌ์คํฐ์ ๊ตฌ์ฑ๋ ์ ํธ๋ฆฌํฐ๋ง ์์ผ๋ฉด ๋ฉ๋๋ค. kubectl
. ์ด ์์์๋ ํด๋ฌ์คํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. minikube
, ํ์ง๋ง ๋ค๋ฅธ ๊ฒ์ ๊ฐ์ ธ๊ฐ ์ ์์ต๋๋ค. ํด๋ฌ์คํฐ๋ฅผ ์ค์นํ๋ ค๋ฉด
Mac์ ์ต์ ๋ฒ์ ์ ์ค์นํ์ธ์:
curl -Lo minikube
https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
&& chmod +x minikube
sudo mkdir -p /usr/local/bin/
sudo install minikube /usr/local/bin/
์ธํธ
Mac์ ์ต์ ๋ฒ์ ์ ์ค์นํ์ธ์:
curl -LO
"https://storage.googleapis.com/kubernetes-release/release/$(curl -s
https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl version
KEDA ์ค์น
KEDA๋ฅผ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ฐฐํฌํ ์ ์์ผ๋ฉฐ ๊ทธ ๋ฐฉ๋ฒ์ ๋ค์ ๋ชฉ๋ก์ ๋์ ์์ต๋๋ค.
kubectl apply -f
https://raw.githubusercontent.com/kedacore/keda/master/deploy/KedaScaleController.yaml
KEDA์ ๊ทธ ๊ตฌ์ฑ์์๋ ๋ค์์คํ์ด์ค์ ์ค์น๋ฉ๋๋ค. keda
. ํ์ธํ ๋ช
๋ น:
kubectl get pods -n keda
KEDA Operator๊ฐ ์์๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ ๋ค์์ผ๋ก ์ด๋ํฉ๋๋ค. Running State
. ๊ทธ ํ์ ๊ณ์ํ์ญ์์ค.
Helm์ ์ฌ์ฉํ์ฌ Redis ์ค์น
Helm์ด ์ค์น๋์ด ์์ง ์์ผ๋ฉด ๋ค์์ ์ฌ์ฉํ์ญ์์ค.
brew install kubernetes-helm
helm init --history-max 200
helm init
๋ก์ปฌ ๋ช
๋ น์ค ์ธํฐํ์ด์ค๋ฅผ ์ด๊ธฐํํ๊ณ ์ค์น๋ ์ํํฉ๋๋ค. Tiller
Kubernetes ํด๋ฌ์คํฐ์.
kubectl get pods -n kube-system | grep tiller
Tiller ํฌ๋๊ฐ ์คํ ์ค ์ํ๋ก ๋ค์ด๊ฐ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
๋ฒ์ญ๊ฐ์ ์ชฝ์ง: ์์ฑ์๋ Tiller ์๋ฒ ๊ตฌ์ฑ ์์๋ฅผ ์ค์นํด์ผ ํ๋ Helm@2๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด์ Helm@3์ด ์ ํฉํ๋ฏ๋ก ์๋ฒ ๋ถ๋ถ์ด ํ์ํ์ง ์์ต๋๋ค.
Helm์ ์ค์นํ ํ Redis๋ฅผ ์์ํ๋ ค๋ฉด ํ๋์ ๋ช ๋ น์ผ๋ก ์ถฉ๋ถํฉ๋๋ค.
helm install --name redis-server --set cluster.enabled=false --set
usePassword=false stable/redis
Redis๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์๋์๋์ง ํ์ธํฉ๋๋ค.
kubectl get pods/redis-server-master-0
Redis๊ฐ ์ํ๊ฐ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค. Running
.
์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ
๋ฐฐํฌ ๋ช ๋ น:
kubectl apply -f go-app.yaml
//output
deployment.apps/go-prom-app created
service/go-prom-app-service created
๋ชจ๋ ๊ฒ์ด ์์๋์๋์ง ํ์ธํ์ธ์.
kubectl get pods -l=app=go-prom-app
Redis๊ฐ ์ํ์ ๋ค์ด๊ฐ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค. Running
.
Prometheus ์๋ฒ ๋ฐฐํฌ
Prometheus ๋งค๋ํ์คํธ๋ ๋ค์์ ์ฌ์ฉํฉ๋๋ค.
kubernetes_sd_configs:
- role: service
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_run]
regex: go-prom-app-service
action: keep
๋ฐฐ์นํ๋ค, ํ๊ฒฌํ๋ค:
kubectl apply -f prometheus.yaml
//output
clusterrole.rbac.authorization.k8s.io/prometheus created
serviceaccount/default configured
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
configmap/prom-conf created
deployment.extensions/prometheus-deployment created
service/prometheus-service created
๋ชจ๋ ๊ฒ์ด ์์๋์๋์ง ํ์ธํ์ธ์.
kubectl get pods -l=app=prometheus-server
ํ๋ก๋ฉํ
์ฐ์ค๊ฐ ์ํ๊ฐ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ธ์ Running
.
์ฌ์ฉ kubectl port-forward
Prometheus ์ฌ์ฉ์ ์ธํฐํ์ด์ค(๋๋ API ์๋ฒ)์ ์ก์ธ์คํ๋ ค๋ฉด
kubectl port-forward service/prometheus-service 9090
KEDA ์๋ ํ์ฅ ๊ตฌ์ฑ ๋ฐฐํฌ
์์ฑํ๋ ๋ช
๋ น ScaledObject
:
kubectl apply -f keda-prometheus-scaledobject.yaml
KEDA ์ด์์ ๋ก๊ทธ๋ฅผ ํ์ธํ์ธ์.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
time="2019-10-15T09:38:28Z" level=info msg="Watching ScaledObject:
default/prometheus-scaledobject"
time="2019-10-15T09:38:28Z" level=info msg="Created HPA with
namespace default and name keda-hpa-go-prom-app"
์์ฉํ๋ก๊ทธ๋จ์์ ํ์ธํ์ธ์. ํ๋์ ์ธ์คํด์ค๊ฐ ์คํ ์ค์ด์ด์ผ ํฉ๋๋ค. minReplicaCount
1๊ณผ ๊ฐ์:
kubectl get pods -l=app=go-prom-app
HPA ๋ฆฌ์์ค๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋์๋์ง ํ์ธํฉ๋๋ค.
kubectl get hpa
๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด ํ์๋ฉ๋๋ค.
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
์ํ ํ์ธ: ์ ํ๋ฆฌ์ผ์ด์ ์ก์ธ์ค
์ ํ๋ฆฌ์ผ์ด์ ์ REST ์๋ํฌ์ธํธ์ ์ก์ธ์คํ๋ ค๋ฉด ๋ค์์ ์คํํ์ธ์.
kubectl port-forward service/go-prom-app-service 8080
์ด์ ์ฃผ์๋ฅผ ์ฌ์ฉํ์ฌ Go ์ฑ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
curl http://localhost:8080/test
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
์ด ์์ ์์ Redis๋ ํ์ธํด๋ณด์ธ์. ๋น์ ์ ๊ทธ ์ด์ ๋ฅผ ๋ณผ ์ ์์ต๋๋ค access_count
1๋ก ์ฆ๊ฐ:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
์ธก์ ํญ๋ชฉ ๊ฐ์ด ๋ค์๊ณผ ๊ฐ์์ง ํ์ธํ์ธ์. http_requests
๋๊ฐ๋ค:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
๋ถํ ์์ฑ
์ฐ๋ฆฌ๋ ์ฌ์ฉํ ๊ฒ์ด๋ค
curl -o hey https://storage.googleapis.com/hey-release/hey_darwin_amd64
&& chmod a+x hey
๋ค์ ์ ํธ๋ฆฌํฐ๋ฅผ ๋ค์ด๋ก๋ํ ์๋ ์์ต๋๋ค.
์คํํ์ธ์:
./hey http://localhost:8080/test
๊ธฐ๋ณธ์ ์ผ๋ก ์ ํธ๋ฆฌํฐ๋ 200๊ฐ์ ์์ฒญ์ ๋ณด๋ ๋๋ค. Prometheus ์ธก์ ํญ๋ชฉ๊ณผ Redis๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 201
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
201
PromQL ์ฟผ๋ฆฌ์์ ๋ฐํ๋ ์ค์ ์งํ ๊ฐ์ ํ์ธํฉ๋๋ค.
curl -g
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'
//output
{"status":"success","data":{"resultType":"vector","result":[{"metric":{},"value":[1571734214.228,"1.686057971014493"]}]}}
์ด ๊ฒฝ์ฐ ์ค์ ๊ฒฐ๊ณผ๋ 1,686057971014493
ํ๋์ ํ์๋ฉ๋๋ค. value
. ์ฐ๋ฆฌ๊ฐ ์ค์ ํ ์๊ณ๊ฐ์ 3์ด๋ฏ๋ก ์ด๋ ํ์ฅ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
๋ ๋ง์ ๋ถํ!
์ ํฐ๋ฏธ๋์์ ์ ํ๋ฆฌ์ผ์ด์ Pod ์๋ฅผ ๋ชจ๋ํฐ๋งํฉ๋๋ค.
kubectl get pods -l=app=go-prom-app -w
๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋ถํ๋ฅผ ๋๋ ค๋ณด๊ฒ ์ต๋๋ค.
./hey -n 2000 http://localhost:8080/test
์ ์ ํ HPA๊ฐ ๋ฐฐํฌ๋ฅผ ํ์ฅํ๊ณ ์ ํฌ๋๋ฅผ ์์ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. HPA๋ฅผ ํ์ธํ์ฌ ๋ค์ ์ฌํญ์ ํ์ธํ์ธ์.
kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 1830m/3 (avg) 1 10 6 4m22s
๋ก๋๊ฐ ์ผ๊ด๋์ง ์์ผ๋ฉด ํ๋์ Pod๋ง ์คํ๋๋ ์ง์ ๊น์ง ๋ฐฐํฌ๊ฐ ์ค์ด๋ญ๋๋ค. ์ค์ ์ธก์ ํญ๋ชฉ(PromQL ์ฟผ๋ฆฌ์์ ๋ฐํ๋จ)์ ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ธ์.
curl -g
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'
์ฒญ์
//Delete KEDA
kubectl delete namespace keda
//Delete the app, Prometheus server and KEDA scaled object
kubectl delete -f .
//Delete Redis
helm del --purge redis-server
๊ฒฐ๋ก
KEDA๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ๋ถ ์งํ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Kubernetes ๋ฐฐํฌ๋ฅผ ์๋์ผ๋ก ํ์ฅํ ์ ์์ต๋๋ค(XNUMX๋ถํฐ). ์๋ฅผ ๋ค์ด Prometheus ์งํ, Redis์ ๋๊ธฐ์ด ๊ธธ์ด, Kafka ์ฃผ์ ์ ์๋น์ ๋๊ธฐ ์๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
KEDA๋ ์ธ๋ถ ์์ค์ ํตํฉ๋๋ฉฐ Metrics Server๋ฅผ ํตํด ์ํํ ํฌ๋ ์๋ ์ค์ผ์ผ๋ฌ(Horizontal Pod Autoscaler)์ ํด๋น ๋ฉํธ๋ฆญ์ ์ ๊ณตํฉ๋๋ค.
ํ์ด์ ๋น๋๋ค!
๊ทธ ๋ฐ์ ์ฝ์ ๋ด์ฉ:
ํ๋ก๋์ ํ๊ฒฝ์์ ์ปจํ ์ด๋ ๋ฐ Kubernetes๋ฅผ ์คํํ๊ธฐ ์ํ ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก .Kubernetes๋ฅผ ์ํ 90๊ฐ ์ด์์ ์ ์ฉํ ๋๊ตฌ: ๋ฐฐํฌ, ๊ด๋ฆฌ, ๋ชจ๋ํฐ๋ง, ๋ณด์ ๋ฑ .Telegram์ Kubernetes ์ฃผ๋ณ ์ฑ๋ .
์ถ์ฒ : habr.com