在 k8 集群之外使用 prometheus 监控 Kubernetes 集群


  • 我们有 kubernetes 集群,我有服务帐户"kube",命名空间"监控",创建了集群角色绑定来监控集群
  • 我们将普罗米修斯安装在集群外的 Linux 系统(本地)上,并使用"root"安装。
  • 当我尝试使用 https api 连接到 k8 集群时,使用ca.crt和用户token(由 kubernetes 管理员提供),它会抛出多个错误。

错误消息:

component="discovery manager scrape" msg="Cannot create service discovery" err="unable to use specified CA cert /root/prometheus/ca.crt" type=*kubernetes.SDConfig
component="discovery manager scrape" msg="Cannot create service discovery" err="unable to use specified CA cert /root/prometheus/ca.crt" type=*kubernetes.SDConfig

普罗米修斯配置:


- job_name: 'kubernetes-apiservers'
scheme: https
tls_config:
ca_file: /root/prometheus/ca.crt
bearer_token_file: /root/prometheus/user_token
kubernetes_sd_configs:
- role: endpoints
api_server: https://example.com:1234
bearer_token_file: /root/prometheus/user_token
tls_config:
ca_file: /root/prometheus/prometheus-2.12.0.linux-amd64/ca.crt
relabel_configs:
- source_labels: [monitoring, monitoring-sa, 6443]
action: keep
regex: default;kubernetes;https
- job_name: 'kubernetes-nodes'
scheme: https
tls_config:
ca_file: /root/prometheus/ca.crt
bearer_token_file: /root/prometheus/user_token
kubernetes_sd_configs:
- role: node
api_server: https://example.com:1234
bearer_token_file: /root/prometheus/user_token
tls_config:
ca_file: /root/prometheus/ca.crt
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: https://example.com:1234
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics

您面临的主要问题是:"unable to use specified CA cert /root/prometheus/ca.crt"

最近有人遇到了同样的问题: https://github.com/prometheus/prometheus/issues/6015#issuecomment-532058465

他通过重新安装新版本解决了这个问题。

版本2.13.1已出。尝试安装最新版本,它也可能解决您的问题。

您的ca.crt很可能仍然是base64格式,因为在描述机密时是这样编码的,如此处所述。

也许你的ca.crt有一些错误,检查你的ca证书文件,确保这个文件格式是这样的:

-----BEGIN CERTIFICATE-----
xxxxx
-----END CERTIFICATE-----

我认为您的ca.crt是通过kubectl get serviceaccount -o yaml获取的,但这是您的 kubernetes 集群的公钥,因此,如果您想获取令牌,您可以使用新Deployment在 yaml 文件中指定serviceAccountName,如下所示:

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: test
spec:
replicas: 1
template:
metadata:
labels:
app: test
version: v1
spec:
serviceAccountName: prometheus
containers:
- name: test
image: alpine
imagePullPolicy: Always
command: ["ping", "127.0.0.1"]
imagePullSecrets:
- name: harbor-secret
restartPolicy: Always

然后,将您的tokenca.crt置于/var/run/secrets/kubernetes.io/serviceaccount/之下。

最新更新