在 Kubernetes 下部署 Prometheus

在上一小节总我们介绍了与 Kubernetes 的应用管理模型,并且利用 MiniKube 在本地搭建了一个单节点的Kubernetes。这一部分我们将带领读者通过 Kubernetes 部署 Prometheus 实例。

使用 ConfigMaps 管理应用配置

当使用 Deployment 管理和部署应用程序时,用户可以方便了对应用进行扩容或者缩容,从而产生多个Pod实例。为了能够统一管理这些 Pod 的配置信息,在 Kubernetes 中可以使用 ConfigMaps 资源定义和管理这些配置,并且通过环境变量或者文件系统挂载的方式让容器使用这些配置。

这里将使用 ConfigMaps 管理 Prometheus 的配置文件,创建 prometheus-config.yml 文件,并写入以下内容:

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: prometheus-config
  5. data:
  6. prometheus.yml: |
  7. global:
  8. scrape_interval: 15s
  9. evaluation_interval: 15s
  10. scrape_configs:
  11. - job_name: 'prometheus'
  12. static_configs:
  13. - targets: ['localhost:9090']

使用 kubectl 命令行工具,在命名空间 default 创建 ConfigMap 资源:

  1. kubectl create -f prometheus-config.yml
  2. configmap "prometheus-config" created

使用 Deployment 部署 Prometheus

当 ConfigMap 资源创建成功后,我们就可以通过 Volume 挂载的方式,将 Prometheus 的配置文件挂载到容器中。 这里我们通过 Deployment 部署 Prometheus Server 实例,创建 prometheus-deployment.yml 文件,并写入以下内容:

  1. apiVersion: v1
  2. kind: "Service"
  3. metadata:
  4. name: prometheus
  5. labels:
  6. name: prometheus
  7. spec:
  8. ports:
  9. - name: prometheus
  10. protocol: TCP
  11. port: 9090
  12. targetPort: 9090
  13. selector:
  14. app: prometheus
  15. type: NodePort
  16. ---
  17. apiVersion: extensions/v1beta1
  18. kind: Deployment
  19. metadata:
  20. labels:
  21. name: prometheus
  22. name: prometheus
  23. spec:
  24. replicas: 1
  25. template:
  26. metadata:
  27. labels:
  28. app: prometheus
  29. spec:
  30. containers:
  31. - name: prometheus
  32. image: prom/prometheus:v2.2.1
  33. command:
  34. - "/bin/prometheus"
  35. args:
  36. - "--config.file=/etc/prometheus/prometheus.yml"
  37. ports:
  38. - containerPort: 9090
  39. protocol: TCP
  40. volumeMounts:
  41. - mountPath: "/etc/prometheus"
  42. name: prometheus-config
  43. volumes:
  44. - name: prometheus-config
  45. configMap:
  46. name: prometheus-config

该文件中分别定义了Service和Deployment,Service类型为NodePort,这样我们可以通过虚拟机IP和端口访问到Prometheus实例。为了能够让Prometheus实例使用ConfigMap中管理的配置文件,这里通过volumes声明了一个磁盘卷。并且通过volumeMounts将该磁盘卷挂载到了Prometheus实例的/etc/prometheus目录下。

使用以下命令创建资源,并查看资源的创建情况:

  1. $ kubectl create -f prometheus-deployment.yml
  2. service "prometheus" created
  3. deployment "prometheus" created
  4. $ kubectl get pods
  5. NAME READY STATUS RESTARTS AGE
  6. prometheus-55f655696d-wjqcl 1/1 Running 0 5s
  7. $ kubectl get svc
  8. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  9. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 131d
  10. prometheus NodePort 10.101.255.236 <none> 9090:32584/TCP 42s

至此,我们可以通过MiniKube虚拟机的IP地址和端口32584访问到Prometheus的服务。

Prometheus UI

Prometheus UI