Scalability ááẠcloud á¡ááá®áá±ážááŸááºážáá»á¬ážá¡ááœáẠá¡áááááá¯á¡ááºáá»ááºáá
áºáá¯ááŒá
áºáááºá Kubernetes ááŒáá·áºá á¡ááá®áá±ážááŸááºážáá
áºáá¯á¡á¬áž áá»á²á·ááœááºááŒááºážááẠááá·áºáá»á±á¬áºáá±á¬á¡áá¯á¶ážáá»ááŸá¯á¡ááœáẠááá¯á·ááá¯áẠáá¯á¶áá°ááœá¬ážá¡áá±á¡ááœááºááᯠááá¯ážááŒáŸáá·áºááŒááºážáá²á·ááá¯á· ááá¯ážááŸááºážáá«áááºá ReplicaSet
- áá«áá±ááá·áº áá«áᬠmanual process ááŒá
áºáá«áááºá
Kubernetes ááẠá¡ááá®áá±ážááŸááºážáá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬áẠá
áá±ážáá»ááẠááœáá·áºááŒá¯ááẠ(ááá¯ááá¯áááºááŸá¬ ááŒáá·áºáá»ááºááŸá¯áá
áºáá¯ááœáẠPods ááá¯á·ááá¯áẠReplicaSet
) Horizontal Pod Autoscaler áááºááŸááºáá»ááºááᯠá¡áá¯á¶ážááŒá¯á ááŒá±ááŒá¬ááá·áºáá¯á¶á
á¶á á¡ááá¯á¡áá»á±á¬áẠá¡ááá¯ááºážá¡áá¬á¡ááœáẠáá°áááºážá
á¶áááºááŸááºáá»ááºááŸá¬ CPU á¡áá¯á¶ážááŒá¯ááŸá¯ áááºááá
áºáá»á¬áž (á¡áááºážá¡ááŒá
Ạáááºááá
áºáá»á¬áž) ááŒá
áºáá±á¬áºáááºáž á
áááºááŒáá¯ááºááŸáá·áº ááŒááºáá០áá±ážáá¬ážááá·áº áááºááá
áºáá»á¬ážááᯠáá±á«ááºážá
ááºááá¯ááºáááºá
á¡ááœá²á·
pods áá»á¬ážááᯠá¡áá»á¬ážááá¯áẠá¡ááá¯á¡áá»á±á¬áẠá¡ááœááºá¡á
á¬áž áá»á²á·ááŒááºážá¡á
á¬áž Kubernetes Event Driven Autoscaling (KEDA) ááᯠá¡áá¯á¶ážááŒá¯ááŒá®áž open source Kubernetes á¡á±á¬áºááá±áᬠáá
áºáᯠááŒá
áºáááºá áááºážááẠá¡ááŒá
áºá¡áá»ááº-áá±á¬ááºážááŸááºáá±á¬ á¡áá¯ááºáá¬áááºáá»á¬ážá¡ááœáẠáá»á±á¬ááœá±á·ááŸá¯áááŸááá±á¬ á¡á±á¬áºááá¯á
áá±ážáá»áááºááŸáááŒááºáž (áá¯áá០áá¯áá¡áá) áá¶á·ááá¯ážáá±ážáááºá¡ááœáẠáááºážááẠáá°áááºážá¡ááá¯ááºáž áá±á«ááºážá
ááºáá¬ážáááºá áá¯ááºááŸá¬ áááá¯ááºáá«áááºá
á áá áºáá¡áá»ááºážáá»á¯ááº
áá¯á¶ááŒááºážááœáẠá¡áá¬á¡á¬ážáá¯á¶ážá¡áá¯ááºáá¯ááºáá¯á¶á¡ááŒá±á¬ááºáž á¡ááá¯áá»á¯á¶ážáá±á¬áºááŒáá»ááºááᯠááŒáááº-
- á¡ááá®áá±ážááŸááºážááẠPrometheus áá±á¬áºáááºááœáẠHTTP hit count áááºááá áºáá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáááºá
- Prometheus ááẠá€áááºááá áºáá»á¬ážááᯠá á¯áá±á¬ááºážááẠááŒááºáááºáá¬ážáááºá
- KEDA ááŸá Prometheus scaler ááᯠHTTP hits á¡áá±á¡ááœááºáá±á«áºáá°áááºá á¡ááá®áá±ážááŸááºážááᯠá¡ááá¯á¡áá»á±á¬áẠáá»áááºááŸáááẠá á®á ááºáá¬ážáá«áááºá
á¡áᯠáá« áááºážááᯠá¡á áááºá¡ááá¯ááºážáá áºáá¯á á®á¡ááŒá±á¬ááºáž á¡áá±ážá áááºááŒá±á¬ááŒáááºá
KEDA ááŸáá·áº Prometheus
Prometheus ááẠááœáá·áºáááºážáá±á¬ áááºážááŒá
Ạá
áá
Ạá
á±á¬áá·áºááŒáá·áºááŒááºážááŸáá·áº ááááá±ážááŒááºáž áááááᬠá¡á
áááºá¡ááá¯ááºážá
KEDA ááẠá áá±ážá ááºáá áºáá¯á ááá±á¬ááá¬ážááᯠáá¶á·ááá¯ážáá±ážááẠ- áááºážááẠKEDA ááŸáá·áº ááŒááºáá áá áºááŒá¬ážááœáẠáá¶áá¬ážáá áºáá¯á¡ááŒá Ạáá¯ááºáá±á¬ááºáááºá á¡ááá¯ááºážá¡áᬠá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááẠáá áºááŸááºá áá áºáá áºáá¯á á®á¡ááœáẠáá®ážááá·áºááŒá áºááŒá®áž áááºážááŸáá±áá¬ááᯠáá¯ááºáá°áááºá ááá¯á·áá±á¬áẠKEDA ááẠáááºážááá¯á·ááᯠá¡ááá¯á¡áá»á±á¬áẠá¡ááá¯ááºážá¡áá¬ááᯠááááºážáá»á¯ááºááẠáááºážááá¯á·ááᯠá¡áá¯á¶ážááŒá¯áááºá
Scalers ááẠáá±áá¬áááºážááŒá áºáá»á¬ážá áœá¬ááᯠáá¶á·ááá¯ážáá±ážáááºá á¥ááá¬á Kafkaá Redisá Prometheusá ááá¯ááá¯áááºááŸá¬á Prometheus áááºááá áºáá»á¬ážááᯠá á¶ááŸá¯ááºážá¡ááŒá Ạá¡áá¯á¶ážááŒá¯á Kubernetes ááŒáá·áºáá»ááºááŸá¯áá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬áẠááá¯ááºážáá¬ááẠKEDA ááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
á ááºážáááºáá»áŸá±á¬ááºááœáŸá¬
Golang á ááºážáááºááŒááºážá¡ááá®áá±ážááŸááºážááẠHTTP ááŸáá áºááá·áºáááºáá±á¬ááºááœáá·áºáá±ážááŒá®áž á¡áá±ážááŒá®ážáá±á¬áá¯ááºáá±á¬ááºáá»ááºááŸá áºáá¯ááᯠáá¯ááºáá±á¬ááºáááº-
- á¡ááá®áá±ážááŸááºážááᯠáááááá¬áááºáá¬ááá¬ááŸáá·áº hit á¡áá±á¡ááœááºáá«ááŸááá±á¬ http_requests áááºááá
áºááᯠáá¶á·ááá¯ážááẠPrometheus Go áá¯á¶ážá
áœá²áá° á
á¬ááŒáá·áºááá¯ááºááᯠá¡áá¯á¶ážááŒá¯áááºá 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
Redis ááœááº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 áá¬áá¬
Prometheus ááŒáá·áºáá»ááºááŸá¯ááœáẠá¡á±á¬ááºáá«ááá¯á· áá«áááºáá«áááºá
ConfigMap
- Prometheus config ááá¯ááœáŸá²ááŒá±á¬ááºážáááº;Deployment
- Kubernetes á¡á á¯á¡áá±ážááœáẠPrometheus ááᯠá¡áá¯á¶ážááŒá¯áááºá¡ááœááºáClusterIP
- UI Prometheus ááá¯á·áááºáá±á¬ááºááœáá·áºá¡ááœáẠáááºáá±á¬ááºááŸá¯áClusterRole
,ClusterRoleBinding
ОServiceAccount
Kubernetes (á¡ááá¯á¡áá»á±á¬ááºááŸá¬ááœá±ááœá±á·ááŸáááŸá¯) ááœáẠáááºáá±á¬ááºááŸá¯áá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬ááºááŸá¬ááœá±ááŒááºážá¡ááœááºá
áá®ááŸá¬
KEDA Prometheus ScaledObject
á
áá±ážáááááá¬ááẠKEDA ááŸáá·áº ááŒááºáá
áá
áºááŒá¬ážááœáẠáá±á«ááºážáá°ážá¡ááŒá
Ạáá¯ááºáá±á¬ááºáááºá ScaledObject
á€ááá
á¹á
ááœáẠPrometheus ááẠá¡á
á®á¡á
ááºá¡áááºážá¡ááŒá
áºááŸáá·áº ááŒáá·áºáá»ááºááŸá¯ááᯠáááŒáá¯ááºáááºážáá¯ááºáá±á¬ááºááẠá
áááºááŒáá¯ááºáááºážááŒá
áºáá
áºáá¯ááŒá
áºáááºá
ScaledObject
ááŒáá·áºáá»ááºáá»á²á·ááœááºááŒááºážááá¯ááºáᬠá¡áá»ááºá¡áááºá ááŒá
áºáááºá¡áááºážá¡ááŒá
Ạáááºáá¬áá±áᬠ(á¥ááᬠáá»áááºáááºááŸá¯áá»áŸáá¯á·ááŸááºáá»ááºáá»á¬ážá áááºážá
á®á¡áááº)á áá²áá¯á¶ááŒá¬ážáá¬áá ááŒááºáááºááá°áá±ážáá¬áááŸáá·áº á¡ááŒá¬ážáá±áá¬áá»á¬áž áá«áááºáá«áááºá áááºážááẠááŒáá·áºáá»ááºááŸá¯á¡ááá¯ááºážá¡áá¬ááᯠááá¯ááºážáá¬áááºá¡ááœáẠáááºááá¯ááºáᬠautoscaling resource (HPA definition) ááᯠááŒá
áºá
á±áááºá
á¡áá¬ááá¹áá¯áá
áºáᯠ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
. - Trigger á¡áá»áá¯ážá¡á
á¬áž -
Prometheus
. Prometheus áá¬áá¬ááááºá á¬ááᯠáááºááá áºá¡áááºá á¡ááá·áºáááºááŸááºáá»ááºáá»á¬ážááŸáá·áº á¡áá°áá±á¬áºááŒáá¬ážáááºáPromQL áá±ážááŒááºážááŸá¯ á¡áá¯á¶ážááŒá¯ááá·áºá PromQL áá±ážááŒááºážáá»áẠ-sum(rate(http_requests[2m]))
. - á¡ááá¯ááºáž
pollingInterval
KEDA ááẠááá·áºáá«ážá áá¹ááá·áºááá¯ááºáž Prometheus áá¶á០áá áºááŸááºáá áºáá¯ááᯠáá±á¬ááºážááá¯áááºá á¡áááºážáá¯á¶áž (á¡á±á¬ááº)áminReplicaCount
) ááŸáá·áº á¡áá»á¬ážáá¯á¶áž pods á¡áá±á¡ááœááºááẠááá»á±á¬áºááœááºáá«ámaxReplicaCount
(á€á¥ááá¬-áááº)á
áááºáááºááá¯ááºáááºá minReplicaCount
áá¯áááŸáá·áº áá®áá»áŸáááºá á€ááá
á¹á
ááœááºá KEDA ááẠáá¯áááŸáá
áºáá¯ááá¯á· ááŒáá·áºáá»ááºááŸá¯ááᯠá¡áááºááœááºážááŒá®áž áá±á¬ááºááẠá¡ááá¯á¡áá»á±á¬áẠá¡ááá¯ááºážá¡áá¬á¡ááœáẠHPA ááᯠáá±á¬áºáá¯ááºáááºá ááŒá±á¬ááºážááŒááºá¡á
á®á¡á
á¥áºááẠáá
áºáá¯á០áá¯áá¡áá áá»á²á·ááœááºááŒááºážáááºáž ááŒá
áºááá¯ááºáááºá á¥ááá¬ááœááºá áááºážááẠHTTP áááºáá±á¬ááºááŸá¯ááŒá
áºááŒá®áž ááá¯á¡ááºááá±á¬ááºá
áá
áºááá¯ááºáá±á¬ááŒá±á¬áá·áº áá¯áááᯠáá»áœááºá¯ááºááá¯á·áááœá±ážáá»ááºáá²á·áá«á
á¡ááá¯á¡áá»á±á¬áẠáá»á²á·ááœááºááŒááºážá¡ááœááºážá០ááŸá±á¬áºááá¬
ááŒáá·áºáá»ááºááŸá¯á¡á¬áž á¡ááá¯ááºážá¡áá¬áá
áºáá¯á¡ááŒá
Ạá¡áá¯á¶ážááŒá¯ááẠáá¶áá«ážáá¯á¶ááᯠá¡á
áá»áá¯ážáá
áºáá¯á¡ááŒá
Ạá¡áá¯á¶ážááŒá¯áááºá áá»áœááºá¯ááºááá¯á·áá¥ááá¬ááœáẠPromQL áá±ážááŒááºážáá»áẠsum(rate (http_requests [2m]))
áá±á¬ááºáá¯á¶ážááŸá
áºáááá
áºá¡ááœááºáž ááá¯ááºážáá¬áá¬ážáá±á¬ HTTP áá±á¬ááºážááá¯ááŸá¯ááŸá¯ááºáž (áá
áºá
áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»ááºáá»á¬áž) ááᯠááŒááºáá±ážáááºá
threshold value ááẠXNUMX ááŒá
áºááŒá®ážá áááºážááẠáááºááá¯ážáá±á
ááºááœáẠáá
áºáá¯ááŸááááºáᯠááá¯ááá¯áááºá sum(rate (http_requests [2m]))
áá¯á¶ážáá¯á¶á¡á±á¬ááºá áááºááá¯ážáá»á¬ážáá¬áá«áá áá
áºááŒáááºá
á®ááœáẠáá±á¬ááºáááºá¡ááœá²áá
áºáᯠáááºááá·áºáá«áááºá sum(rate (http_requests [2m]))
áá¯á¶ážáá»áá¯ážááá¯ážáá¬áááºá á¥ááá¬á¡á¬ážááŒáá·áºá áááºááá¯ážááẠ12 á០14 ááŒá
áºáá«á pods á¡áá±á¡ááœááºááẠáá±ážáá¯ááŒá
áºáááºá
á¡áá¯áá² á áá¯ááºááŒáá·áºáá¡á±á¬ááºá
ááŒáá¯áááºááŒááºáááºááŒááºážá
áááºááá¯á¡ááºááá»áŸááŸá¬ 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 ááŸáá·áº áááºážá á¡á
áááºá¡ááá¯ááºážáá»á¬ážááᯠnamespace ááœáẠááá·áºááœááºážáá¬ážáááºá keda
. á
á
áºáá±ážááẠá¡áááá·áº
kubectl get pods -n keda
KEDA á¡á±á¬áºááá±áᬠá
áááºááẠá
á±á¬áá·áºááŒá®áž ááœá¬ážáá«á Running State
. ááá¯á·áá±á¬áẠáááºáááºáá¯ááºáá±á¬ááºáá«á
Helm ááᯠá¡áá¯á¶ážááŒá¯á Redis ááᯠááá·áºááœááºážááŒááºážá
Helm ááááºáááºáá¬ážáá«á áááºážááá¯áá¯á¶ážáá«á
brew install kubernetes-helm
helm init --history-max 200
helm init
local command line interface ááᯠá¡á
ááŒá¯ááŒá®áž install áá¯ááºáááºá Tiller
Kubernetes á¡á
á¯á¡áá±ážááá¯á·
kubectl get pods -n kube-system | grep tiller
Tiller pod ááẠRunning state ááá¯á·áááºááẠá á±á¬áá·áºáá«á
áá¬áá¬ááŒááºáá°áááŸááºáá»ááº- á á¬áá±ážáá°ááẠTiller áá¬áá¬á¡á áááºá¡ááá¯ááºážááᯠááá·áºááœááºážááẠááá¯á¡ááºááá·áº Helm@2 ááᯠá¡áá¯á¶ážááŒá¯áááºá ááᯠHelm@3 ááẠáá®áá»á±á¬áºáááºá áááºážááẠáá¬áá¬á¡ááá¯ááºáž áááá¯á¡ááºáá«á
Helm ááá¯ááá·áºááœááºážááŒá®ážáá±á¬ááºá Redis ááá¯á áááºááẠcommand áá áºáá¯áááºáá¯á¶áá±á¬ááºáááºá
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 manifest ááá¯á¡áá¯á¶ážááŒá¯áááºá
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
Prometheus á¡ááŒá±á¡áá±ááá¯á
á±á¬áá·áºáá«á Running
.
á¡áá¯á¶ážááŒá¯áá« kubectl port-forward
Prometheus á¡áá¯á¶ážááŒá¯áá° á¡ááºáá¬áá±á·á
Ạ(ááá¯á·ááá¯áẠAPI áá¬áá¬) ááœáẠáááºáá±á¬ááºááŒáá·áºááŸá¯áááº
kubectl port-forward service/prometheus-service 9090
KEDA Autoscaling Configuration ááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá
áááºáá®ážáááºá¡áááá·áº 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
ááá·áºá¡ááœáẠutility ááᯠáá±á«ááºážáá¯ááºáá¯ááºááá¯ááºáááºá
áááºážááá¯áá¯ááºáá±á¬ááºáá«
./hey http://localhost:8080/test
áá¯á¶ááŸááºá¡á¬ážááŒáá·áºá utility ááẠáá±á¬ááºážááá¯áá»áẠ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 ááŒá
áºáá±á¬ááŒá±á¬áá·áº á¡ááá¯ááºážá¡áá¬áá»á²á·ááẠááá¯á¶áá±á¬ááºáá«á
áááºááá¯.
terminal á¡áá áºááœááºá application pods á¡áá±á¡ááœááºááᯠá á±á¬áá·áºááŒáá·áºáá«-
kubectl get pods -l=app=go-prom-app -w
command ááá¯á¡áá¯á¶ážááŒá¯á load ááá¯ááá¯ážááŒáŸáá·áºááŒáá«á áá¯á·á
./hey -n 2000 http://localhost:8080/test
ááá¡ááŒá¬ááœááºá HPA ááẠááŒáá·áºáá»ááºáá»á²á·ááœááºááŒááºážááŸáá·áº pods á¡áá áºáá»á¬ážááᯠá áááºááŒááºážá¡á¬áž áááºááœá±á·áááá·áºáááºá áá±áá»á¬á á±ááẠáááºá 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 query ááŸááŒááºáá±ážáááº)á ááá¯á·áá±á¬áẠcommand ááá¯áá¯á¶ážáá«-
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 ááŒáá·áºáá»ááºááŸá¯áá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬áẠá¡ááá¯ááºážá¡áᬠ(ááá¯á·/á០áá¯áá¡áá) áá¯ááºááá¯ááºá á±áááºááŒá áºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá Prometheus áááºááá áºáá»á¬ážá Redis ááŸá áááºážá á®á¡ááŸááºá Kafka áá±á«ááºážá ááºááŸá á á¬ážáá¯á¶ážáá° áá¯á¶á·ááŒááºááŸá¯á¡áá±á«áº á¡ááŒá±áá¶áááºá
KEDA ááẠááŒááºáá¡áááºážá¡ááŒá áºáá áºáá¯ááŸáá·áº áá±á«ááºážá ááºááŒá®áž áááºážá áááºááá áºáá¬áá¬ááŸáá áºááá·áº á¡áá»á¬ážááá¯áẠPod Autoscaler ááá¯á· áááºážá áááºááá áºáá»á¬ážááᯠáá±á¬ááºáá¶á·áá±ážáááºá
áá¶áá±á¬ááºážáá«á á±!
áá±á¬ááºáááºáááºá áá¬áá»á¬áž
áá¯ááºáá¯ááºááŸá¯áááºáááºážáá»ááºááŸá ááœááºááááºáá¬áá»á¬ážááŸáá·áº Kubernetes áááºáááºááŒááºážá¡ááœáẠá¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áºáá»á¬ážááŸáá·áº á¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áºáá»á¬áž .Kubernetes á¡ááœáẠá¡áá¯á¶ážáááºáá±á¬ áááááᬠ90+- ááŒáá·áºáá»ááºááŒááºážá á á®áá¶ááá·áºááœá²ááŒááºážá á á±á¬áá·áºááŒáá·áºááŒááºážá áá¯á¶ááŒá¯á¶áá±ážááŸáá·áº á¡ááŒá¬ážá¡áá¬áá»á¬áž .Telegram ááŸá Kubernetes áááºážáá»ááºááœáẠáá»áœááºá¯ááºááá¯á·ááá»ááºááẠ.
source: www.habr.com