在 Kubernetes 集群中,为了保证系统稳定性和性能,我们经常需要对集群进行监控。而 Prometheus 和 Grafana 是常用的监控方案,本文将介绍如何在 Kubernetes 中安装和配置 Prometheus 和 Grafana。
Prometheus
安装 Prometheus
- 创建一个 Prometheus 的命名空间:
$ kubectl create namespace prometheus
- 创建一个 Prometheus 的配置文件
prometheus-config.yaml
:
// javascriptcn.com 代码示例 apiVersion: v1 kind: ConfigMap metadata: name: prometheus-config namespace: prometheus data: prometheus.yml: |- global: scrape_interval: 15s scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'kubernetes-apiservers' kubernetes_sd_configs: - role: endpoints namespaces: names: - kube-system port: 443 scheme: https bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true relabel_configs: - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] separator: ; regex: default;kubernetes;https replacement: $1 target_label: kubernetes_namespace - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] separator: ; regex: default;kubernetes;https replacement: $2 target_label: kubernetes_name - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] separator: ; regex: default;kubernetes;https replacement: $3 target_label: kubernetes_port_name - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_address] separator: ; regex: (.+);(.+) target_label: kubernetes_address replacement: $1 - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_address] separator: ; regex: (.+);(.+) target_label: kubernetes_port replacement: $2
- 创建一个 Prometheus 的 Deployment:
// javascriptcn.com 代码示例 apiVersion: apps/v1 kind: Deployment metadata: name: prometheus namespace: prometheus spec: selector: matchLabels: app: prometheus replicas: 1 template: metadata: labels: app: prometheus spec: containers: - name: prometheus image: prom/prometheus:v2.22.0 args: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' ports: - containerPort: 9090 name: http volumeMounts: - name: prometheus-config mountPath: /etc/prometheus readOnly: true - name: prometheus-storage mountPath: /prometheus volumes: - name: prometheus-config configMap: name: prometheus-config - name: prometheus-storage emptyDir: {}
- 创建一个 Prometheus 的 Service:
// javascriptcn.com 代码示例 apiVersion: v1 kind: Service metadata: name: prometheus namespace: prometheus spec: selector: app: prometheus ports: - name: http port: 9090 targetPort: http
- 应用配置:
$ kubectl apply -f prometheus-config.yaml $ kubectl apply -f prometheus-deployment.yaml $ kubectl apply -f prometheus-service.yaml
配置 Prometheus
在 Prometheus 中,我们需要配置一些监控规则和告警规则。这里我们以监控 Kubernetes API Server 为例。
- 创建一个
kube-apiserver.rules
文件,定义监控规则:
// javascriptcn.com 代码示例 $ cat <<EOF > kube-apiserver.rules groups: - name: kubernetes-apiserver.rules rules: - alert: KubeAPIErrorsHigh expr: rate(kubernetesapiserver_request_count{code="500"}[5m]) > 10 for: 1m labels: severity: critical annotations: summary: "High error rate on Kube API Server" description: "The Kube API Server has a high error rate ({{ $value }} errors / 5 minutes)." EOF
- 创建一个 ConfigMap,将规则文件注入 Prometheus 中:
apiVersion: v1 kind: ConfigMap metadata: name: prometheus-rules namespace: prometheus data: kube-apiserver.rules: |- # Contents of kube-apiserver.rules
- 在 Prometheus 的配置文件中,添加规则文件:
// javascriptcn.com 代码示例 apiVersion: v1 kind: ConfigMap metadata: name: prometheus-config namespace: prometheus data: prometheus.yml: |- # Contents of prometheus.yml rule_files: - /etc/prometheus/rules/*.rules
- 应用配置:
$ kubectl apply -f prometheus-rules.yaml $ kubectl apply -f prometheus-config.yaml
Grafana
安装 Grafana
- 创建一个 Grafana 的命名空间:
$ kubectl create namespace grafana
- 创建一个 Grafana 的 Deployment:
// javascriptcn.com 代码示例 apiVersion: apps/v1 kind: Deployment metadata: name: grafana namespace: grafana spec: selector: matchLabels: app: grafana replicas: 1 template: metadata: labels: app: grafana spec: containers: - name: grafana image: grafana/grafana:7.3.7 ports: - containerPort: 3000 name: http volumeMounts: - name: grafana-storage mountPath: /var/lib/grafana volumes: - name: grafana-storage emptyDir: {}
- 创建一个 Grafana 的 Service:
// javascriptcn.com 代码示例 apiVersion: v1 kind: Service metadata: name: grafana namespace: grafana spec: selector: app: grafana ports: - name: http port: 80 targetPort: http
- 应用配置:
$ kubectl apply -f grafana-deployment.yaml $ kubectl apply -f grafana-service.yaml
配置 Grafana
- 打开 Grafana 界面,登录后进入首页,点击左侧菜单的“Configuration”->“Data Sources”,点击“Add data source”按钮,选择“Prometheus”作为数据源类型,填入 Prometheus 的服务地址:
点击“Save & Test”按钮测试连接是否成功。
点击左侧菜单的“Create”->“Dashboard”,创建一个新的 Dashboard。
点击“Add panel”按钮,选择“Graph”类型的面板,填入 Prometheus 的查询语句:
- 点击“Save”按钮保存 Dashboard。
总结
本文介绍了如何在 Kubernetes 中安装和配置 Prometheus 和 Grafana 监控方案,包括 Prometheus 的安装和配置、Grafana 的安装和配置以及如何创建一个监控 Dashboard。通过本文的学习,读者可以学会如何在 Kubernetes 中进行监控,并且可以根据自己的需求对监控方案进行定制化。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65586bc2d2f5e1655d299bae