部署Prometheus

1. 创建一个命名空间

首先,我们可以创建一个专门用于Prometheus的命名空间,以便管理和隔离资源。

kubectl create namespace monitoring

2. 配置Prometheus的ConfigMap

为了配置Prometheus的抓取目标(scrape targets),我们需要创建一个ConfigMap,用于存储prometheus.yml配置文件。

apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: monitoring
data:
prometheus.yml: |
global:
scrape_interval: 15s

scrape_configs:
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: false
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: kubernetes.default.svc:443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics

- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- action: replace
source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- action: replace
source_labels: [__meta_kubernetes_pod_name]
target_label: kubernetes_pod_name

将上述配置保存为prometheus-config.yaml文件,并应用它:

kubectl apply -f prometheus-config.yaml

3. 创建Prometheus Pod和Service

接下来,创建一个Pod来运行Prometheus,并通过NodePort暴露它的服务。

apiVersion: v1
kind: Pod
metadata:
name: prometheus-pod
namespace: monitoring
labels:
app: prometheus
spec:
containers:
- name: prometheus
image: quay.io/prometheus/prometheus:v2.44.0
args:
- --config.file=/etc/prometheus/prometheus.yml
- --storage.tsdb.path=/prometheus/
ports:
- containerPort: 9090
volumeMounts:
- name: prometheus-config-volume
mountPath: /etc/prometheus/
- name: prometheus-data-volume
mountPath: /prometheus/
volumes:
- name: prometheus-config-volume
configMap:
name: prometheus-config
- name: prometheus-data-volume
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: prometheus-service
namespace: monitoring
spec:
type: NodePort
ports:
- port: 9090
targetPort: 9090
nodePort: 30000
selector:
app: prometheus

将上述配置保存为prometheus-pod-service.yaml文件,并应用它:

kubectl apply -f prometheus-pod-service.yaml

4. 设置适当的权限

确保Prometheus有足够的权限访问Kubernetes API。创建一个ClusterRole和ClusterRoleBinding。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups: [""]
resources:
- nodes
- nodes/proxy
- services
- endpoints
- pods
verbs: ["get", "list", "watch"]
- apiGroups:
- extensions
- apps
resources:
- deployments
verbs: ["get", "list", "watch"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus
subjects:
- kind: ServiceAccount
name: default
namespace: monitoring

将上述配置保存为prometheus-rbac.yaml文件,并应用它:

kubectl apply -f prometheus-rbac.yaml

5. 访问Prometheus

你现在可以通过NodePort访问Prometheus的Web界面。假设你的集群中的节点IP为<Node-IP>,你可以通过以下URL访问Prometheus:

http://<Node-IP>:30000

6. 验证抓取目标

访问Prometheus Web界面后,在“Status” -> “Targets”页面查看Prometheus是否正确发现并抓取了Kubernetes节点和Pod的监控数据。