代码改变世界
[登录 · 注册]
  • k8s 安装 prometheus 过程记录
  • 开始以为只要安装 prometheus-operator 就行了。

    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 。

    $ kubectl get pods -n monitoring
    NAME                                  READY   STATUS    RESTARTS   AGE
    prometheus-operator-99dccdc56-qq5lm   1/1     Running   0          20m
    

    这时才发现真正要安装的是 kube-prometheus

    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 。

    $ 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 镜像。

    安装 prometheus 之前,运行 kubectl top 命令会报错 。

    $ kubectl top node
    Error from server (NotFound): the server could not find the requested resource (get services http:heapster:)
    

    这是由于没有安装 metrics-server ,在 kube-prometheus 的 readme 中有这样一段说明文字:

    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.

    从而知道 kube-prometheus 中包含了 resource metrics API server ,所以安装好 kube-prometheus 之后 kubectl top node 也能正常执行了。

    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 指标的问题

    参考资料
  • 上一篇:从相亲的角度理解 K8S 的 Node Affinity, Taints 与 Tolerations
    下一篇:ASP.NET Core 获取主机名时的 "Decoded string is not a valid IDN name" 错误
  • 【推广】 阿里云小站-上云优惠聚集地(新老客户同享)更有每天限时秒杀!
    【推广】 云服务器低至0.95折 1核2G ECS云服务器8.1元/月
    【推广】 阿里云老用户升级四重礼遇享6.5折限时折扣!
  • 原文:https://www.cnblogs.com/dudu/p/12146344.html
走看看 - 开发者的网上家园