ืกืงืึทืืึทืืืืืื ืืื ืึท ืฉืืืกื ืคืึธืืขืจืื ื ืคึฟืึทืจ ืืืึธืืงื ืึทืคึผืืึทืงืืืฉืึทื ื. ืืื Kubernetes, ืกืงืืืืื ื ืึท ืึทืคึผืืึทืงืืืฉืึทื ืืื ืืื ืคึผืฉืื ืืื ืื ืงืจืืกืื ื ืื ื ืืืขืจ ืคืื ืจืขืคึผืืึทืงืึทื ืคึฟืึทืจ ืื ืฆืื ืขืืขื ืืืคึผืืืืืึทื ื ืึธืืขืจ ReplicaSet
- ืึธืืขืจ ืืึธืก ืืื ืึท ืืึทื ืืึทื ืคึผืจืึธืฆืขืก.
Kubernetes ืึทืืึทืื ืึทืคึผืืึทืงืืืฉืึทื ื ืฆื ืืืื ืืืืืึธืืึทืืืฉ ืกืงืืืื (ื"ื ืคึผืึธืืก ืืื ืึท ืืืคึผืืืืืึทื ื ืึธืืขืจ ReplicaSet
) ืืื ืึท ืืขืงืืึทืจืึทืืืืืข ืฉืืืืืขืจ ื ืืฆื ืื ืืึธืจืืืึธื ืืึทื ืคึผืึธื ืึทืืืึธืกืงืึทืืขืจ ืืึทืฉืจืืึทืืื ื. ืื ืคืขืืืงืืึทื ืงืจืืืขืจืืึธื ืคึฟืึทืจ ืึธืืึทืืึทืืืง ืกืงืืืืื ื ืืื ืงืคึผื ืืึทื ืืฅ ืืขืืจืืงืก (ืจืืกืึธืจืก ืืขืืจืืงืก), ืึธืืขืจ ืืืจ ืงืขื ืขื ืืืกืฉืืืืขื ืื ืื ืืื ืืืกืืืืื ืืง ืฆืืืขืฉืืขืื ืืขืืจืืงืก.
ืงืึธืืขืงืืืื
ืึทื ืฉืืึธื ืืึธืจืืืึธื ืืึทื ืึทืืืึธืกืงืึทืืื ื ืคืื ืคึผืึธืืก, Kubernetes Event Driven Autoscaling (KEDA) ืืื ืืขื ืืฆื, ืึทื ืึธืคึฟื ืืงืืจ Kubernetes ืึธืคึผืขืจืึทืืึธืจ. ืขืก ืื ืืึทืืจืืืฅ ืืขืืืืจื ืืื ืืึธืจืืืึธื ืืึทื ืคึผืึธื ืึทืืืึธืกืงืึทืืขืจ ืฆื ืฆืืฉืืขืื ืกืืืืึทืก ืึทืืืึธืกืงืึทืืื ื (ืึทืจืืึทื ืืขืจืขืื ื ืฆื / ืคึฟืื ื ืื) ืคึฟืึทืจ ืืขืฉืขืขื ืืฉ-ืืขืืจืืื ืืืขืจืงืืึธืืื. ืงืึธื ืื ืืืฆื ืืื
ืงืืจืฅ ืืืืขืจืืืืง ืคืื ืื ืกืืกืืขื
ืื ืืืึทืืจืึทืืข ืืืืืื ืึท ืงืืจืฅ ืืึทืฉืจืืึทืืื ื ืคืื ืืื ืึทืืฅ ืึทืจืืขื:
- ืื ืึทืคึผืืึทืงืืืฉืึทื ืืื HTTP ืืื ืฆืืืื ืืขืืจืืงืก ืืื ืคึผืจืึธืืขืืืขืืก ืคึฟืึธืจืืึทื.
- ืคึผืจืึธืืขืืืขืืก ืืื ืงืึทื ืคืืืืขืจื ืฆื ืืึทืืืขื ืื ืืขืืจืืงืก.
- ืื ืคึผืจืึธืืขืืืขืืก ืกืงืึทืืขืจ ืืื KEDA ืืื ืงืึทื ืคืืืืขืจื ืฆื ืืืืืึธืืึทืืืฉ ืืืึธื ืื ืึทืคึผืืึทืงืืืฉืึทื ืืืืืจื ืืืืฃ ืื ื ืืืขืจ ืคืื ืืืืคึผ ืืืฅ.
ืืืฆื ืืื ืืืขื ืืึธืื ืืืจ ืืื ืืขืืึทื ืืืขืื ืืขืืขืจ ืขืืขืืขื ื.
KEDA ืืื ืคึผืจืึธืืขืืืขืืก
ืคึผืจืึธืืขืืืขืืก ืืื ืึทื ืึธืคึฟื ืืงืืจ ืกืืกืืขื ืืึธื ืืืึธืจืื ื ืืื ืึทืืขืจืืื ื ืืึธืึธืืงืื, ืืืื
KEDA ืฉืืืฆื ืืขื ืืึทืืจืืฃ ืคืื ืึท ืกืงืึทืืขืจ - ืขืก ืึทืงื ืืื ืึท ืืจืืง ืฆืืืืฉื KEDA ืืื ืื ืคืื ืืจืืืกื ืืืง ืกืืกืืขื. ืื ืกืงืึทืืขืจ ืืืคึผืืึทืืขื ืืืืฉืึทื ืืื ืกืคึผืขืฆืืคืืฉ ืฆื ืืขืืขืจ ืฆืื ืกืืกืืขื ืืื ืขืงืกืืจืึทืงื ืืึทืื ืคืื ืขืก. KEDA ืืขืจื ืึธื ื ืืฆื ืืื ืฆื ืงืึธื ืืจืึธืืืจื ืึธืืึทืืึทืืืง ืกืงืืืืื ื.
ืกืงืึทืืขืจื ืฉืืืฆื ืงืืืคื ืืึทืื ืงืืืืื, ืืืฉื, Kafka, Redis, Prometheus. ืืึธืก ืืื, KEDA ืงืขื ืขื ืืืขืจื ืืขื ืืฆื ืฆื ืืืืืึธืืึทืืืฉ ืืืึธื Kubernetes ืืืคึผืืืืืึทื ืฅ ื ืืฆื ืคึผืจืึธืืขืืืขืืก ืืขืืจืืงืก ืืื ืงืจืืืืืจืืึท.
ืืขืกื ืึทืคึผืืึทืงืืืฉืึทื
ืื Golang ืคึผืจืืืืจื ืึทืคึผืืึทืงืืืฉืึทื ืืื ืึทืงืกืขืก ืืืจื ืืืืคึผ ืืื ืคึผืขืจืคืึธืจืื ืฆืืืื ืืืืืืืง ืคืึทื ืืงืฉืึทื ื:
- ื ืืฆื ืื Prometheus Go ืงืืืขื ื ืืืืืืึธืืขืง ืฆื ืื ืกืืจืืืขื ื ืื ืึทืคึผืืึทืงืืืฉืึทื ืืื ืฆืืฉืืขืื ืื http_requests ืืขืืจืืง, ืืืึธืก ืึผืืื ืึท ืฉืืึธืื ืฆืืืื. ืื ืขื ืืคึผืืื ื ืืื ืคึผืจืึธืืขืืืขืืก ืืขืืจืืงืก ืืขื ืขื ืื ืืืฆื ืืื ืืืื ืืื ืื URI
/metrics
.var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "http_requests", Help: "number of http requests", })
- ืืื ืขื ืืคืขืจ ืฆื ืึท ืืงืฉื
GET
ืื ืึทืคึผืืึทืงืืืฉืึทื ืื ืงืจืึทืืึทื ืฅ ืื ืืืขืจื ืคืื ืื ืฉืืืกื (access_count
) ืืื ืจืขืืืก. ืืึธืก ืืื ืึทื ืืจืื ื ืืืขื ืฆื ืืึธื ืื ืึทืจืืขื ืืื ืึท ืืืื ืคืื ืึท ืืืืคึผ ืืึทื ืืืขืจ ืืื ืืืื ืงืึธื ืืจืึธืืืจื ืคึผืจืึธืืขืืืขืืก ืืขืืจืืงืก. ืื ืืขืืจืืง ืืืขืจื ืืืื ืืืื ืื ืืขืืืข ืืื ืื ืืืขืจื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
, ืขืก ืึทืืึทืื ืื ืคึผืจืึธืืขืืืขืืก ืกืขืจืืืขืจ ืฆื ืืึทืงืืืขื ืึทืคึผืืึทืงืืืฉืึทื ืืขืืจืืงืก.
ืืึธ
ืคึผืจืึธืืขืืืขืืก ืกืขืจืืืืจืขืจ
ืื ืคึผืจืึธืืขืืืขืืก ืืืคึผืืืืืึทื ื ืืึทื ืึทืคืขืกืืื ืืืฉืืืื ืคืื:
ConfigMap
- ืฆื ืึทืจืืืขืจืคืืจื ืื ืคึผืจืึธืืขืืืขืืก ืงืึทื ืคืืืืขืจืืืฉืึทื;Deployment
- ืคึฟืึทืจ ืืืคึผืืืืื ื ืคึผืจืึธืืขืืืขืืก ืืื ืึท ืงืืืขืจื ืขืืขืก ืงื ืืื;ClusterIP
- ืกืขืจืืืืก ืคึฟืึทืจ ืึทืงืกืขืก ืฆื UI Prometheus;ClusterRole
,ClusterRoleBinding
ะธServiceAccount
- ืคึฟืึทืจ ืึทืืืึธ-ืืืืขืงืฉืึทื ืคืื ืกืขืจืืืืกืขืก ืืื Kubernetes (ืึธืืึทืืึทืืืง ืืคืืขืงืื ื).
ืืึธ
KEDA Prometheus 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
. ืื ืคึผืจืึธืืขืืืขืืก ืกืขืจืืืขืจ ืึทืืจืขืก ืืื ืืขืจืืื ื ืฆืืืืืขื ืืื ืื ืืขืืจืืง ื ืึธืืขื, ืฉืืืขื ืืืืคึผืจืึธืืงื ืึธื ืคึฟืจืขื , ืืืึธืก ืืืขื ืืืื ืืขืืืืื ื. ืคึผืจืึธืืงื ืึธื ืคึฟืจืขื -sum(rate(http_requests[2m]))
. - ืืืื
pollingInterval
,ืงืขืืึท ืืขืื ืึท ืฆืื ืคืื ืคึผืจืึธืืขืืืขืืก ืืขืืขืจ ืคืืคืฆื ืกืขืงืื ืืขืก. ืืคึผืืืช ืืืื ืืื ืืขืจ (minReplicaCount
), ืืื ืื ืืึทืงืกืืืื ื ืืืขืจ ืคืื ืคึผืึธืืก ืืื ื ืืฉื ืืงืกืืmaxReplicaCount
(ืืื ืืขื ืืืึทืฉืคึผืื - ืฆืขื).
ืงืขื ืขื ืื ืกืืึทืืืจื minReplicaCount
ืืืืื ืฆื ื ืื. ืืื ืืขื ืคืึทื, KEDA ืึทืงืืึทืืืืืฅ ืื ื ืื-ืฆื-ืืืื ืืืคึผืืืืืึทื ื ืืื ืืขืืึธืื ืืงืกืคึผืึธืืื ืื HPA ืคึฟืึทืจ ืืืืึทืืขืจ ืึธืืึทืืึทืืืง ืกืงืืืืื ื. ืืขืจ ืคืึทืจืงืขืจื ืกืืจ ืืื ืืืื ืืขืืืขื, ืืึธืก ืืื, ืกืงืืืืื ื ืคืื ืืืื ืฆื ื ืื. ืืื ืืขื ืืืึทืฉืคึผืื, ืืืจ ืืึธืื ื ืืฉื ืืืืกืงืืืึทืื ื ืื ืืืืึทื ืืึธืก ืืื ืึท ืืืืคึผ ืืื ืกื ืืื ื ืืฉื ืึทื ืืืืฃ-ืคืึธืืขืจืื ื ืกืืกืืขื.
ืื ืืึทืืืฉ ืืื ืึทืืืึธืกืงืึทืืื ื
ืื ืฉืืืขื ืืื ืืขื ืืฆื ืืื ืึท ืฆืื ืื ืฆื ืืืึธื ืื ืืืคึผืืืืืึทื ื. ืืื ืืื ืืืขืจ ืืืึทืฉืคึผืื, ืื PromQL ืึธื ืคึฟืจืขื sum(rate (http_requests [2m]))
ืงืขืจื ืื ืืขืืืื ืืึทื ืืืืคึผ ืืขืื ืงืืจืก (ืจืืงืืืขืก ืคึผืขืจ ืกืขืงืื ืืข), ืืขืืืกืื ืืื ืื ืืขืฆืืข ืฆืืืื ืืื ืื.
ืืื ื ืื ืฉืืืขื ืืืขืจื ืืื ืืจืื, ืขืก ืืืื ืึทื ืขืก ืืืขื ืืืื ืืืื ืขืจ ืืื ืืขืจ ืื ืืืขืจื sum(rate (http_requests [2m]))
ืืืืื ืืงืขืจ ืืื ืืจืืึท. ืืืื ืื ืืืขืจื ืื ืงืจืืกืื, ืึทื ื ืึธื ืกืึทื ืืื ืืืกืืฃ ืืขืืขืจ ืืึธื sum(rate (http_requests [2m]))
ืื ืงืจืืกืื ืืืจื ืืจืืึท. ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืืืื ืื ืืืขืจื ืืื 12-14, ืื ื ืืืขืจ ืคืื ืคึผืึธืืก ืืื ืคืืจ.
ืืืฆื ืืึธืื ืก ืคึผืจืืืืจื ืืึทืฉืืขืืืงื ืขืก!
ืคืึทืจ-ืืึทืฉืืขืืืงื
ืึทืืข ืืืจ ืืึทืจืคึฟื ืืื ืึท ืงืืืขืจื ืขืืขืก ืงื ืืื ืืื ืึท ืงืึทื ืคืืืืขืจื ื ืืฆื kubectl
. ืืขื ืืืึทืฉืคึผืื ื ืืฆื ืึท ืงื ืืื minikube
, ืึธืืขืจ ืืืจ ืงืขื ืขื ื ืขืืขื ืงืืื ืื ืืขืจืข. ืฆื ืื ืกืืึทืืืจื ืึท ืงื ืืื ืขืก ืืื
ืื ืกืืึทืืืจื ืื ืืขืฆืืข ืืืขืจืกืืข ืืืืฃ ืืขืง:
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/
ืฉืืขืื
ืื ืกืืึทืืืจื ืื ืืขืฆืืข ืืืขืจืกืืข ืืืืฃ ืืขืง:
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 ืึธืคึผืขืจืึทืืึธืจ ืฆื ืึธื ืืืืื ืืื ืืืื ืฆื Running State
. ืืื ื ืึธื ืืขื, ืคืึธืจืืขืฆื.
ืื ืกืืึธืืื ื Redis ื ืืฆื ืืขืื
ืืืื ืืืจ ืืึธื ื ืื ืืึธืื ืืขืื ืืื ืกืืึทืืืจื, ื ืืฆื ืืขื
brew install kubernetes-helm
helm init --history-max 200
helm init
ืื ืืฉืึทืืืืืื ืื ืืืืข ืืึทืคึฟืขืื ืฉืืจื ืฆืืืื ื ืืื ืืืื ืื ืกืืึธืื Tiller
ืฆื ืื ืงืืืขืจื ืขืืขืก ืงื ืืื.
kubectl get pods -n kube-system | grep tiller
ืืืึทืจืื ืืื ืื ืืืืขืจ ืคึผืึธื ืึทืจืืึทื ืื ืคืืืกื ืืืง ืฉืืึทื.
ืืืืขืจืืขืฆืขืจ'ืก ื ืึธืืืฅ: ืืขืจ ืืืืจ ื ืืฆื ืืขืื @ 2, ืืืึธืก ืจืืงืืืืืขืจื ืื ืืืืืขืจ ืกืขืจืืืขืจ ืงืึธืืคึผืึธื ืขื ื ืฆื ืืืื ืืื ืกืืึทืืืจื. ืืืฆื ืืขืื @ 3 ืืื ืืึทืืืึทืืืง, ืขืก ืืื ื ืืฉื ืืึทืจืคื ืึท ืกืขืจืืืขืจ ืืืื.
ื ืึธื ืื ืกืืึธืืื ื ืืขืื, ืืืื ืืึทืคึฟืขื ืืื ืืขื ืื ืฆื ืึธื ืืืืื 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
.
ืืืคึผืืืืื ื ืึท ืคึผืจืึธืืขืืืขืืก ืกืขืจืืืืจืขืจ
ืื ืคึผืจืึธืืขืืืขืืก ืืึทื ืึทืคืขืกืืื ื ืืฆื
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
ืฆื ืึทืงืกืขืก ืื ืคึผืจืึธืืขืืืขืืก ืืึทื ืืฆืขืจ ืฆืืืื ื (ืึธืืขืจ ืึทืคึผื ืกืขืจืืืขืจ) ืืื
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
ืืืึทืืึทืืืื ืื ืืืขืจื ืคืื ืื ืคืึทืงืืืฉ ืืขืืจืืง (ืฆืืจืืงืืขืงืืืขื ืืืจื ืื ืคึผืจืึธืืงื ืึธื ืคึฟืจืขื):
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.
ืืขืจ ืืึทืกืข!
ืืื ืื ื ืืึทืข ืืืึธืงืืึทื, ืืึธื ืืืึธืจ ืื ื ืืืขืจ ืคืื ืึทืคึผืืึทืงืืืฉืึทื ืคึผืึธืืก:
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
ืืืื ืื ืืึทืกืข ืืื ืกืชืืจื, ืื ืืืคึผืืืืืึทื ื ืืืขื ืืืื ืจืืืืกื ืฆื ืื ืคืื ื ืืื ืืืืื ืืืื ืคึผืึธื ืืื ืคืืืกื ืืืง. ืืืื ืืืจ ืืืืื ืฆื ืงืึธื ืืจืึธืืืจื ืื ืคืึทืงืืืฉ ืืขืืจืืง (ืฆืืจืืงืืขืงืืืขื ืืืจื ืื ืคึผืจืึธืืงื ืึธื ืคึฟืจืขื), ื ืืฆื ืื ืืึทืคึฟืขื:
curl -g
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'
Cleanup
//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 ืึทืืึทืื ืืืจ ืฆื ืืืืืึธืืึทืืืฉ ืืืึธื ืืืื ืงืืืขืจื ืขืืขืก ืืืคึผืืืืืึทื ืฅ (ืฆื / ืคึฟืื ื ืื) ืืืืืจื ืืืืฃ ืืึทืื ืคืื ืคืื ืืจืืืกื ืืืง ืืขืืจืืงืก. ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืืืืืจื ืืืืฃ ืคึผืจืึธืืขืืืขืืก ืืขืืจืืงืก, ืจืื ืืขื ื ืืื Redis, ืงืึทื ืกืืืขืจ ืืืืืึทื ืกื ืืื ืงืึทืคืงืึท ืืขืืข.
KEDA ืื ืืึทืืจืืืฅ ืืื ืึท ืคืื ืืจืืืกื ืืืง ืืงืืจ ืืื ืืืื ืืื ืืืึทื ืืขืืจืืงืก ืืืจื ืืขืืจืืงืก ืกืขืจืืืืจืขืจ ืฆื ืืึธืจืืืึธื ืืึทื ืคึผืึธื ืึทืืืึธืกืงืึทืืขืจ.
ืืื ืืืืง!
ืืืึธืก ืึทื ืืขืจืฉ ืฆื ืืืืขื ืขื:
ืืขืกืืขืจ ืคึผืจืึทืงืืืกืื ืืื ืืขืกืืขืจ ืคึผืจืึทืงืืืกืื ืคึฟืึทืจ ืคืืืกื ืืืง ืงืึทื ืืืื ืขืจื ืืื ืงืืืขืจื ืขืืขืก ืืื ืคึผืจืึธืืืงืฆืืข ืื ืืืืืจืึทื ืืึทื ืฅ .90+ ื ืืฆืืง ืืืฉืืจืื ืคึฟืึทืจ Kubernetes: ืืืคึผืืืืืึทื ื, ืคืึทืจืืืึทืืืื ื, ืืึธื ืืืึธืจืื ื, ืืืืขืจืืืื ืืื ืืขืจ .ืืื ืืืขืจ ืงืึทื ืึทื ืึทืจืื Kubernetes ืืื ืืขืืขืืจืึทื .
ืืงืืจ: www.habr.com