初始安装 Prometheus 监控k8s组件 target 状态显示失败的处理办法
当我们使用 Kubeadm 完成 Kubernetes 的搭建时,默认控制面的组件的 metrics 端点会监听在本机 127.0.0.1 接口上,这会导致 Prometheus
/ kube-Prometheus-stack
开局配置无法从自动发现的端点拉取到指标。
方法有如下两种:
- 在使用
kubeadm
初始安装集群时,更新相关配置 - 在 Kubernetes 集群安装后,更改相关配置文件完成配置
下面我们依次来讲上述的两种方式。
在初始配置 kubeadm 时,更改配置
大致步骤,先生成 kubeadm-config.yaml
配置文件,并编辑其配置文件,增加配置参数,最后 kubeadm init --config kubeadm-config.yaml
## generate kubeadm-config.yaml
>_ kubeadm config print init-defaults > kubeadm-config.yaml
## 配置控制面组件参数,默认只有 apiServer
## 在 kubeadm-config.yaml 中增加如下配置
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.25.0
controllerManager:
extraArgs:
bind-address: 0.0.0.0
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
metricsBindAddress: "0.0.0.0:10249"
## 最后安装或升级 Kubernetes 集群配置
>_ kubeadm init --config kubeadm-config.yaml
在 Kubernetes 集群安装完成后,进行各组件的配置更改
在现有 Kubernetes 集群中,修改对应组件的配置,修改后,静态容器会自动重载和重启
## controller-manager
## 更新 /etc/kubernetes/manifests/kube-controller-manager.yaml 静态pod配置文件中 bind-address 参数的值为 0.0.0.0
>_ sed -i 's/\(bind-address=\).*$/\10.0.0.0/' /etc/kubernetes/manifests/kube-controller-manager.yaml
## etcd
## 更新 /etc/kubernetes/manifests/etcd.yaml 静态pod配置文件中 listen-metrics-urls 参数的值为 http://0.0.0.0:2381
>_ sed -i 's/\(listen-metrics-urls=http:\/\/\).*\(:2381\)$/\10.0.0.0\2/' /etc/kubernetes/manifests/etcd.yaml
## kube-proxy
## 更新 kube-proxy 的 ConfigMap,为 metricsBindAddress 设定监听地址 0.0.0.0
>_ kubectl get cm -n kube-system kube-proxy -o yaml | sed 's/\(metricsBindAddress: \).*$/\1"0.0.0.0:10249"/' | kubectl replace -f - -n kube-system
>_ kubectl rollout restart -n kube-system daemonset kube-proxy
对于 kube-scheduler
组件,我们来梳理一下流程规则:
我们在安装 kube-prometheus-stack 时会代为创建三个 Service ,用于依次对应 Control Plane 控制平面的组件
我们来看 kube-scheduler
Service 的定义:
apiVersion: v1
kind: Service
metadata:
creationTimestamp: "2024-01-29T06:14:09Z"
labels:
app: kube-prometheus-stack-kube-scheduler
app.kubernetes.io/instance: kube-prometheus-stack
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/part-of: kube-prometheus-stack
app.kubernetes.io/version: 56.2.1
argocd.argoproj.io/instance: kube-prometheus-stack
chart: kube-prometheus-stack-56.2.1
heritage: Helm
jobLabel: kube-scheduler
release: kube-prometheus-stack
name: kube-prometheus-stack-kube-scheduler
namespace: kube-system
spec:
clusterIP: None
clusterIPs:
- None
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: http-metrics
port: 10251
protocol: TCP
targetPort: 10251 <---- 这里的端口与 Pod 的端口不一致,实际端口为 10259
selector:
component: kube-scheduler
sessionAffinity: None
type: ClusterIP
这个 Service 的端口与实际的 scheduler pod 端口不符,所以导致无法通过 ServiceMonitor 发现的 Endpoints 进行 target 采集。
到这里我们理清了问题原因,所以,我们需要修改 kube-prometheus-stack
的 values 定义,再重新使用 Helm 安装 prometheus 即可。
# values.yaml
.....
kubeScheduler:
service:
port: null
targetPort: 10259 <---- 修改为实际pod端口
serviceMonitor:
enabled: true
https: true <---- 使用 https 协议进行 scrap 指标拉取
insecureSkipVerify: true <---- 跳过集群内证书验证
.....