如何为Prometheus Pod添加基本身份验证

65次阅读
没有评论

问题描述

在部署Prometheus Pod时,尝试添加基本身份验证,但是在使用以下配置部署Pod时,出现错误:”Readiness probe failed: HTTP probe failed with statuscode: 401“。用户发现这是一个”配置基本身份验证”的问题,但可能有人已经成功解决了这个问题。用户已经按照Prometheus网站上的教程进行了尝试,但没有成功。
用户的部署配置如下:

- kind: ConfigMap
  apiVersion: v1
  metadata:
    name: prometheus-config
  data:
    prometheus.yml: |-
      global:
        scrape_interval: 30s
        scrape_timeout: 10s
        evaluation_interval: 10s
        external_labels:
          type: 'kubernetes'
      .................etc
    web.yml: |-
      basic_auth_users:
        admin: fsdsdfsdfdsfdsft565tfg45wasfsdgfddggs
- kind: DeploymentConfig
  apiVersion: v1
  metadata:
    generation: 1
    labels:
      app: tools
    name: prometheus
  spec:
    replicas: 1
    revisionHistoryLimit: 3
    selector:
      affinity:
        podAntiAffinity:
      containers:
        - args:
          - '--storage.tsdb.retention.size=7GB'
          - '--storage.tsdb.path=/prometheus'
          - '--config.file=/etc/prometheus/prometheus.yml'
          - '--web.config.file=/etc/prometheus/web.yml'
          - '--web.enable-lifecycle'
          command:
            - /bin/prometheus..................... etc

问题的关键在于,当启用用于存活性和就绪性探测的端点的基本身份验证时,Pod被终止。另一个问题是,当用户尝试使用命令curl -s -u admin htt://localhost:9090/metrics时,它要求输入密码,但没有显示任何内容。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据用户的描述,问题可能是由于基本身份验证导致的存活性和就绪性探测失败。为了解决这个问题,可以尝试使用exec类型的探测器,调用curlwget命令来替换HTTP探测器。
以下是一个示例配置文件,使用exec类型的探测器来调用curl命令进行探测:

- kind: DeploymentConfig
  apiVersion: v1
  metadata:
    generation: 1
    labels:
      app: tools
    name: prometheus
  spec:
    replicas: 1
    revisionHistoryLimit: 3
    selector:
      affinity:
        podAntiAffinity:
      containers:
        - args:
          - '--storage.tsdb.retention.size=7GB'
          - '--storage.tsdb.path=/prometheus'
          - '--config.file=/etc/prometheus/prometheus.yml'
          - '--web.config.file=/etc/prometheus/web.yml'
          - '--web.enable-lifecycle'
          readinessProbe:
            exec:
              command:
                - /bin/sh
                - -c
                - 'curl -s -u admin:password http://localhost:9090/metrics'
            initialDelaySeconds: 5
            periodSeconds: 10
          livenessProbe:
            exec:
              command:
                - /bin/sh
                - -c
                - 'curl -s -u admin:password http://localhost:9090/metrics'
            initialDelaySeconds: 10
            periodSeconds: 30

在上面的示例中,我们在DeploymentConfigcontainers部分添加了readinessProbelivenessProbe字段,并使用exec类型的探测器来调用curl命令进行探测。请注意,这里的用户名和密码应该与您的实际设置相匹配。

方案2

另一种解决方法是使用反向代理服务器(如Nginx)来处理基本身份验证。您可以在Nginx配置中添加基本身份验证,并将请求代理到Prometheus Pod。这样,您可以在Nginx中配置基本身份验证,并且不会影响到Prometheus Pod的存活性和就绪性探测。
以下是一个示例Nginx配置文件的片段,用于添加基本身份验证:

location / {
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
    proxy_pass http://prometheus_pod_ip:9090;
}

在上面的示例中,我们使用auth_basic指令来添加基本身份验证,并指定了一个密码文件/etc/nginx/.htpasswd。您需要使用htpasswd命令生成密码文件,并将用户名和密码添加到该文件中。然后,将请求代理到Prometheus Pod的IP地址和端口。
请注意,这种方法需要您在集群中运行一个Nginx反向代理服务器,并将请求正确地代理到Prometheus Pod。您还需要确保Nginx和Prometheus Pod之间的网络连接正常。

方案3

如果您使用的是Kubernetes集群,您还可以考虑使用Ingress资源来处理基本身份验证。Ingress资源可以在集群中公开服务,并提供基本身份验证功能。
以下是一个示例Ingress资源的片段,用于添加基本身份验证:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: prometheus-ingress
spec:
  rules:
    - host: prometheus.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: prometheus
                port:
                  number: 9090
  ingressClassName: nginx
  tls:
    - hosts:
        - prometheus.example.com
      secretName: prometheus-tls-secret
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: basic-auth-secret
    nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"

在上面的示例中,我们在Ingress资源的annotations部分添加了一些注释,用于指定基本身份验证的类型、密码文件和领域。您需要创建一个密码文件,并将其存储为Kubernetes的Secret资源。然后,将Ingress资源配置为使用该密码文件进行基本身份验证。
请注意,这种方法需要您在集群中运行一个Ingress控制器,并正确配置Ingress资源以使用基本身份验证。您还需要确保Ingress控制器和Prometheus Pod之间的网络连接正常。
以上是几种可能的解决方案,您可以根据您的实际需求选择适合您的方法。希望能帮助到您解决问题!

正文完