开始觉得只要安装 prometheus-operator 就好了。html
git clone https://github.com/coreos/prometheus-operator.git cd prometheus-operator sed 's/namespace: default/namespace: monitoring/g' bundle.yaml | kubectl apply -f -
安装后发现只有一个 prometheus-operator pod 。node
$ kubectl get pods -n monitoring NAME READY STATUS RESTARTS AGE prometheus-operator-99dccdc56-qq5lm 1/1 Running 0 20m
这时才发现真正要安装的是 kube-prometheus 。python
git clone https://github.com/coreos/kube-prometheus.git cd kube-prometheus kubectl create -f manifests/setup && \ until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done && \ kubectl create -f manifests/
kube-prometheus 中包含了 prometheus 监控所用到的全部组件,固然也包含 prometheus-operator 。git
$ kubectl get pods -n monitoring NAME READY STATUS RESTARTS AGE alertmanager-main-0 2/2 Running 0 112m grafana-58dc7468d7-pv256 1/1 Running 0 112m kube-state-metrics-769f4fd4d5-4hfpk 3/3 Running 0 112m node-exporter-4grdx 2/2 Running 0 112m prometheus-adapter-5cd5798d96-6zq6f 1/1 Running 0 112m prometheus-k8s-0 3/3 Running 1 112m prometheus-operator-99dccdc56-vqq7m 1/1 Running 0 112m
注:若是在部署过程当中出现 ErrImagePull 错误,那是由于下载 docker 镜像超时了,能够登陆到对应的 node 手动 pull 镜像。github
安装 prometheus 以前,运行 kubectl top 命令会报错 。docker
$ kubectl top node Error from server (NotFound): the server could not find the requested resource (get services http:heapster:)
这是因为没有安装 metrics-server ,在 kube-prometheus 的 readme 中有这样一段说明文字:json
The kube-prometheus stack includes a resource metrics API server, so the metrics-server addon is not necessary. Ensure the metrics-server addon is disabled on minikube.centos
从而知道 kube-prometheus 中包含了 resource metrics API server ,因此安装好 kube-prometheus 以后 kubectl top node 也能正常执行了。api
kubectl top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% k8s-master0 1715m 85% 1001Mi 26% k8s-master1 347m 17% 972Mi 25% k8s-master2 286m 14% 1016Mi 26% k8s-node4 373m 9% 1550Mi 19%
安装好 prometheus 以后经过 kubectl port-forward 命令暴露端口,能够经过浏览器分别访问 Prometheus, Grafana, AlertManager 控制台了,控制台效果见 Kubernetes Monitoring with Prometheus 。浏览器
kubectl --namespace monitoring port-forward svc/prometheus-k8s 9090 --address 10.0.1.81 kubectl port-forward $(kubectl get pods --selector=app=grafana -n monitoring --output=jsonpath="{.items..metadata.name}") -n monitoring 3000 --address 10.0.1.81 kubectl port-forward -n monitoring alertmanager-main-0 9093 --address 10.0.1.81
注1:上面的 10.0.1.81 换成你的服务器 IP 地址,若是不指定 --address ,只能经过 localhost 访问。
注2:也能够经过修改 prometheus-service.yaml , grafana-service.yaml , alertmanager-service.yaml 配置文件暴露控制台端口。
到这里只是部署了 metrics api server ,只能获取到 CPU 与内存这2个核心指标,经过下面的命令能够看到这个 api service v1beta1.metrics.k8s.io :
kubectl get apiservices -n monitoring | grep metrics NAME SERVICE AVAILABLE AGE v1beta1.metrics.k8s.io monitoring/prometheus-adapter True 27h
经过下面的命令能够向已经部署的 metrics api 发请求。
kubectl get --raw "/apis/metrics.k8s.io/v1beta1" | jq .
接下来须要进一步安装 k8s-prometheus-adapter 以部署 custom metrics api server (walkthrough)。
首先从 github 上签出 k8s-prometheus-adapter 仓库
git clone https://github.com/DirectXMan12/k8s-prometheus-adapter.git cd k8s-prometheus-adapter
接着建立 CA 证书并将证书用 secret 保存
$ export PURPOSE=serving $ openssl req -x509 -sha256 -new -nodes -days 365 -newkey rsa:2048 -keyout ${PURPOSE}.key -out ${PURPOSE}.crt -subj "/CN=ca" $ echo '{"signing":{"default":{"expiry":"43800h","usages":["signing","key encipherment","'${PURPOSE}'"]}}}' > "${PURPOSE}-ca-config.json" $ kubectl -n monitoring create secret generic cm-adapter-serving-certs --from-file=./serving.crt --from-file=./serving.key
而后进入 deploy 文件夹,用下面的脚本进行部署:
for f in manifests/*.yaml do sed -i 's/namespace: custom-metrics/namespace: monitoring/g' $f | kubectl apply -f - done
该脚本是为了将 namespace 由 custom-metrics 替换为 monitoring ,由于以前部署 prometheus 时用的是 monitoring 命名空间。
部署完成后就能够看到 v1beta1.custom.metrics.k8s.io 这个 custom metrics api 。
$ kubectl get apiservices -n monitoring | grep metrics v1beta1.custom.metrics.k8s.io monitoring/custom-metrics-apiserver True 12h v1beta1.metrics.k8s.io monitoring/prometheus-adapter True 43h
用下面的命令请求这个 api :
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq . { "kind": "APIResourceList", "apiVersion": "v1", "groupVersion": "custom.metrics.k8s.io/v1beta1", "resources": [] }
发现 resources 为空,参考 github 上的 issue Resources list is empty at /apis/custom.metrics.k8s.io/v1beta1/ ,将 k8s-prometheus-adapter/deploy/manifests/custom-metrics-apiserver-deployment.yaml 中的 --prometheus-url=http://prometheus.prom.svc:9090/
改成 --prometheus-url=http://prometheus-k8s.monitoring.svc:9090/
,从新部署后解决。
kubectl apply -f custom-metrics-apiserver-deployment.yaml
后续:排查 Kubernetes HPA 经过 Prometheus 获取不到 http_requests 指标的问题