部署一个应用
metrics-app.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: metrics-app
name: metrics-app
spec:
replicas: 3
selector:
matchLabels:
app: metrics-app
template:
metadata:
labels:
app: metrics-app
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "80"
prometheus.io/path: "/metrics"
spec:
containers:
- image: lizhenliang/metrics-app
name: metrics-app
ports:
- name: web
containerPort: 80
resources:
requests:
cpu: 200m
memory: 256Mi
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 5
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: metrics-app
labels:
app: metrics-app
spec:
ports:
- name: web
port: 80
targetPort: 80
selector:
app: metrics-app
该metrics-app暴露了一个Prometheus指标接口,可以通过访问service看到,http_requests_per_second
就是 QPS(每秒请求数) 指标数据:
[root ~]# curl 10.106.34.139/metrics
# HELP http_requests_total The amount of requests in total
# TYPE http_requests_total counter
http_requests_total 579981
# HELP http_requests_per_second The amount of requests per second the latest ten seconds
# TYPE http_requests_per_second gauge
http_requests_per_second 0.5
用SeviceMonitor暴露自定义指标
SeviceMonitor_test.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: monitor-metrics-app
namespace: default
labels:
app: metrics-app #Prometheus所选择的标签
spec:
namespaceSelector: #监控的pod所在名称空间
matchNames:
- default
selector: #选择监控endpoint的标签
matchLabels:
app: metrics-app
endpoints:
- port: web #service中对应的端口名称
使用这个命令获取数据
kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/http_requests_per_second | jq .
{
"kind": "MetricValueList",
"apiVersion": "custom.metrics.k8s.io/v1beta1",
"metadata": {
"selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/%2A/http_requests_per_second"
},
"items": [
{
"describedObject": {
"kind": "Pod",
"namespace": "default",
"name": "metrics-app-5d464b6b8b-6lnjw",
"apiVersion": "/v1"
},
"metricName": "http_requests_per_second",
"timestamp": "2021-11-05T03:20:55Z",
"value": "600m",
"selector": null
},
{
"describedObject": {
"kind": "Pod",
"namespace": "default",
"name": "metrics-app-5d464b6b8b-kbrfc",
"apiVersion": "/v1"
},
"metricName": "http_requests_per_second",
"timestamp": "2021-11-05T03:20:55Z",
"value": "600m",
"selector": null
},
{
"describedObject": {
"kind": "Pod",
"namespace": "default",
"name": "metrics-app-5d464b6b8b-xclgr",
"apiVersion": "/v1"
},
"metricName": "http_requests_per_second",
"timestamp": "2021-11-05T03:20:55Z",
"value": "500m",
"selector": null
}
]
}
创建HPA策略:
# vi app-hpa-v2.yml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: metrics-app-hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: metrics-app
minReplicas: 1
maxReplicas: 10
metrics:
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 800m # 800m 即0.8个/秒
成功
[root@k8s-master01 hpa]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
metrics-app-hpa Deployment/metrics-app 566m/800m 1 10 3 14d
压测
yum -y install httpd-tools
ab -n 100000 -c 100 http://10.1.181.193/metrics
查看HPA状态:
kubectl get hpa
kubectl describe hpa metrics-app-hpa