将Prometheus连接到Kubernetes时,“连接:连接被拒绝”

时间:2018-09-19 19:41:37

标签: docker kubernetes yaml prometheus

我是Prometheus的新手,而Kubernetes则相对较新,请多多包涵。我正在尝试测试Prometheus,并尝试了两种不同的方法。

  1. 将Prometheus作为kubernetes之外的docker容器运行。为此,我创建了这个Dockerfile:

    FROM prom/prometheus
    ADD prometheus.yml /etc/prometheus/
    

    和这个Yaml文件:

    global:
      scrape_interval: 15s
      external_labels:
        monitor: 'codelab-monitor'
    scrape_configs:
    - job_name: 'kubernetes-apiservers'
      scheme: http
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      kubernetes_sd_configs:
      - role: endpoints
        api_server: localhost:443
    

    当我运行它时,我得到:

    Failed to list *v1.Pod: Get http://localhost:443/api/v1/pods?limit=500&resourceVersion=0: dial tcp 127.0.0.1:443: connect: connection refused"
    Failed to list *v1.Service: Get http://localhost:443/api/v1/pods?limit=500&resourceVersion=0: dial tcp 127.0.0.1:443: connect: connection refused"
    Failed to list *v1.Endpoints: Get http://localhost:443/api/v1/pods?limit=500&resourceVersion=0: dial tcp 127.0.0.1:443: connect: connection refused"
    

    循环播放。当我转到localhost:9090时,Prometheus将加载,但没有数据。

  2. 我认为将Prometheus部署为Kubernetes部署可能会有所帮助,所以我制作了这个Yaml并进行了部署。

    kind: Deployment
    apiVersion: extensions/v1beta1
    metadata:
      name: prometheus-monitor
    spec:
      selector:
        matchLabels:
          app: prometheus
      template:
        metadata:
          labels:
            app: prometheus
        spec:
          containers:
          - name: prometheus-monitor
            image: prom/prometheus
            # args:
            #   - '-config.file=/etc/prometheus/prometheus.yaml'
            imagePullPolicy: IfNotPresent
            ports:
            - name: webui
              containerPort: 9090
    

    部署成功,但是如果我转到localhost:9090,则会得到“ ERR_SOCKET_NOT_CONNECTED”。 (我的端口已转发)

有人可以告诉我in进出out出Kubernetes的优势以及如何解决至少其中一个问题吗?

此外,我的配置文件被抑制,因为它给出了错误,一旦能够加载Prometheus,我将进行调查。

2 个答案:

答案 0 :(得分:2)

部署容器时,Kubernetes不会将端口映射到群集的外部。

您还必须创建一个服务(可以在同一文件中),以使其可从您的工作站使用(将其添加到prometheus yaml):

---
apiVersion: v1
kind: Service
metadata:
    name: prometheus-web
    labels:
        app: prometheus
spec:
    type: NodePort
    ports:
        - port: 9090
          protocol: TCP
          targetPort: 9090
          nodePort: 30090
          name: webui
    selector:
        app: prometheus

NodePort在您拥有的所有节点上打开给定的端口。您应该可以使用http://localhost:30090/

查看前端

默认情况下,kubernetes允许端口30000到32767用作NodePort类型(https://kubernetes.io/docs/concepts/services-networking/service/#nodeport)。

请考虑阅读一般文档,以获取有关kubernetes中服务的更多信息:https://kubernetes.io/docs/concepts/services-networking/service/

答案 1 :(得分:1)

所以有2个不同的问题。开启:

  1. 您正在尝试连接到运行Prometheus的localhost:443,并希望与Kubernetes API服务器进行通信。显然,在localhost:443上没有监听。您是否正在将端口转发到您的kube-apiserver?

  2. 在这种情况下,您需要公开您的部署端口。像这样:

     kubectl expose deployment prmetheus-web --type=LoadBalancer # or 
     kubectl expose deployment prmetheus-web --type=NodePort
    

    取决于您要如何公开您的服务。 NodePort在服务中公开它,该服务映射到Kubernetes节点上的端口(IPAddress:Port),而LoadBalancer使用外部负载均衡器公开部署,该负载均衡器可能会因您所使用的云(AWS,GCP,OpenStack,Azure等)而异。有关公开部署或DaemonSet或StatefulSet here的更多信息。有关服务here

  3. 的更多信息

希望有帮助。