k8sgpt集成Prometheus Grafana

k8sgpt 集成 Prometheus 和 Grafana

一、环境信息

组件 版本
Kubernetes 1.34.8
k8sgpt CLI v0.3.44
k8sgpt Operator v0.2.27
Prometheus 2.53.0
Grafana 11.1.0
DeepSeek 模型 deepseek-v4-flash
服务 地址
Prometheus http://192.168.48.100:9090
Grafana http://192.168.48.100:30030

二、k8sgpt 部署

2.1 安装 k8sgpt CLI

复制代码
cd /root/k8sgpt-operator/linux-amd64
tar -xvf k8sgpt_Linux_x86_64.tar.gz
mv k8sgpt /usr/local/bin/

2.2 配置 DeepSeek 认证

复制代码
k8sgpt auth add -b openai \
  --baseurl https://api.deepseek.com/v1 \
  -m deepseek-v4-flash \
  -p sk-c666666666666666666666666666666

2.3 安装 k8sgpt Operator

复制代码
# 添加 Helm 仓库
helm repo add k8sgpt https://charts.k8sgpt.ai/
helm repo update
​
# 搜索 chart
helm search repo k8sgpt/ -l
​
# 拉取并解压
helm pull k8sgpt/k8sgpt-operator --version 0.2.27
tar -xvf k8sgpt-operator-0.2.27.tgz
​
# 安装
helm install k8sgpt-operator k8sgpt-operator/ -n k8sgpt-operator-system --create-namespace

2.4 创建 DeepSeek API Secret

复制代码
kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: k8sgpt-deepseek-secret
  namespace: k8sgpt-operator-system
type: Opaque
data:
  openai-api-key: 6666666666666666666666666666666666
EOF

openai-api-key 的值是 API Key 的 base64 编码。

2.5 创建 K8sGPT 自定义资源

复制代码
# /root/k8sgpt-cr.yaml
apiVersion: core.k8sgpt.ai/v1alpha1
kind: K8sGPT
metadata:
  name: k8sgpt-deepseek
  namespace: k8sgpt-operator-system
spec:
  ai:
    enabled: true
    backend: openai
    baseUrl: https://api.deepseek.com/v1
    model: deepseek-v4-flash
    secret:
      name: k8sgpt-deepseek-secret
      key: openai-api-key
  noCache: false
  version: "v0.3.44"
复制代码
kubectl apply -f /root/k8sgpt-cr.yaml

2.6 验证部署

复制代码
# 检查 Pod 状态
kubectl get pods -n k8sgpt-operator-system
​
# 手动分析验证
k8sgpt analyze --explain

三、Prometheus 集成

3.1 问题背景

Prometheus 默认没有 k8sgpt 的服务发现配置,需要手动添加。

3.2 添加服务发现配置

编辑 Prometheus ConfigMap:

复制代码
kubectl edit cm prometheus -n monitoring

scrape_configs 中添加以下 job:

复制代码
- job_name: k8sgpt-operator
  scheme: https
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  tls_config:
    insecure_skip_verify: true
  kubernetes_sd_configs:
    - role: endpoints
      namespaces:
        names:
          - k8sgpt-operator-system
  relabel_configs:
    - source_labels: [__meta_kubernetes_service_name]
      action: keep
      regex: k8sgpt-operator-controller-manager-metrics-service
    - source_labels: [__meta_kubernetes_namespace]
      action: replace
      target_label: namespace
    - source_labels: [__meta_kubernetes_namespace]
      action: replace
      target_label: kubernetes_namespace
    - source_labels: [__meta_kubernetes_service_name]
      action: replace
      target_label: kubernetes_service
  metric_relabel_configs:
    - source_labels: [__name__, object_namespace]
      regex: "(k8sgpt_.*);(.+)"
      target_label: namespace
      replacement: "$2"
      action: replace

3.3 关键配置说明

relabel_configs(服务发现阶段)
规则 作用
__meta_kubernetes_service_name keep 只保留 k8sgpt operator 的 metrics service
__meta_kubernetes_namespacenamespace 添加 operator 命名空间标签
__meta_kubernetes_namespacekubernetes_namespace 备份原始命名空间
__meta_kubernetes_service_namekubernetes_service 添加服务名标签
metric_relabel_configs(指标处理阶段)
复制代码
metric_relabel_configs:
  - source_labels: [__name__, object_namespace]
    regex: "(k8sgpt_.*);(.+)"
    target_label: namespace
    replacement: "$2"
    action: replace

作用 :对 k8sgpt_* 开头的指标,将 object_namespace(问题资源所在命名空间)复制到 namespace 标签。

为什么需要这个配置

  • k8sgpt operator 的 k8sgpt_* 指标中,namespace 标签始终是 operator 自身命名空间(k8sgpt-operator-system

  • object_namespace 才是问题资源实际所在的命名空间(如 default

  • Grafana 仪表盘按命名空间过滤时需要使用 object_namespace 的值

  • 通过 metric_relabel_configsobject_namespace 复制到 namespace,仪表盘可以直接用 namespace 过滤

3.4 重载配置

复制代码
# 方式一:发送 SIGHUP 信号
kubectl exec -n monitoring deployment/prometheus -- kill -HUP 1

# 方式二:重启 Pod(如果 SIGHUP 不生效)
kubectl rollout restart deployment/prometheus -n monitoring

3.5 验证

复制代码
# 检查 k8sgpt 指标
curl -s -u admin:admin123 \
  "http://192.168.48.100:30030/api/datasources/proxy/1/api/v1/query?query=k8sgpt_number_of_results" \
  | python3 -m json.tool

# 预期输出:namespace 应该是问题资源的命名空间(如 default),而非 k8sgpt-operator-system

四、Grafana 仪表盘

4.1 仪表盘来源

k8sgpt operator 会自动创建一个 Grafana Dashboard CR,部署后 Grafana 中会出现 K8sGPT Overview 仪表盘。

4.2 导出仪表盘

复制代码
# 通过 Grafana API 导出
DASHBOARD_UID="U82QyO8Vz"
curl -s -u admin:admin123 \
  "http://192.168.48.100:30030/api/dashboards/uid/${DASHBOARD_UID}" \
  | python3 -c "
import json, sys
data = json.load(sys.stdin)
with open('k8sgpt-dashboard.json', 'w') as f:
    json.dump(data, f, indent=2)
"

4.3 仪表盘面板说明

Heads up 区域
面板 说明
Result Kind types 饼图,按资源类型(Pod、Service 等)展示分析结果分布
Analysis Results 当前集群中 k8sgpt 发现的分析结果总数
Results over time 分析结果随时间的变化趋势
Stats 区域
面板 说明
Total Reconciliation Count Per Controller Operator controller 的 Reconcile 次数
Work Queue Add Rate 工作队列的入队速率
Seconds For Items Stay In Queue 任务在队列中的等待时间

4.4 导入仪表盘

导入:

下载到本地后导入:k8sgpt-operator/grafana/k8sgpt-overview.json at main · k8sgpt-ai/k8sgpt-operator · GitHub

导出:

复制代码
# 导出为导入格式
python3 -c "
import json
with open('/root/k8sgpt-dashboard.json') as f:
    data = json.load(f)
payload = {'dashboard': data['dashboard'], 'overwrite': True}
with open('/tmp/dashboard-final.json', 'w') as f:
    json.dump(payload, f)
"

# 导入到 Grafana
curl -s -X POST -u admin:admin123 \
  http://192.168.48.100:30030/api/dashboards/db \
  -H "Content-Type: application/json" \
  -d @/tmp/dashboard-final.json

4.5 验证

访问 http://192.168.48.100:30030


五、Result CR 说明

5.1 查看分析结果

复制代码
# 查看所有结果
kubectl get results -A

# 查看详细信息
kubectl get results -A -o yaml

# 查看某个结果的详细内容(包含 AI 分析)
kubectl get result <name> -o yaml

5.2 Result 命名规则

Result CR 的名称由 namespace + resource name 拼接而成,去掉连字符:

Pod 名称 命名空间 Result 名称
test-bad-pod default defaulttestbadpod
unschedulable-test default defaultunschedulabletest

5.3 指标与 CR 的关系

指标 说明
k8sgpt_number_of_results 分析结果总数,按 k8sgptobject_namespace 分组
k8sgpt_number_of_results_by_type 按资源类型分组的分析结果数

注意k8sgpt_number_of_results 指标可能存在滞后,与实际 CR 数量不一致。重启 operator 可以同步。


六、常见问题

6.1 k8sgpt analyze 报 401 错误

原因:API Key 格式不正确或使用了错误的 baseurl。

解决 :确认使用正确的服务商地址,如 DeepSeek 使用 https://api.deepseek.com/v1

6.2 helm pull 报 improper constraint 错误

原因--version 参数中包含了不间断空格(Unicode \u00a0),通常是从网页复制时带入的。

解决:手动输入命令,确保使用普通空格。

6.3 Prometheus 抓取 k8sgpt 报 malformed HTTP response

原因 :k8sgpt server 的 8080 端口使用 HTTP/2 协议,且不提供 /metrics 端点。

解决:不要为 k8sgpt server 添加 Prometheus job,只需为 operator controller-manager 添加。

6.4 仪表盘显示 No data

原因

  1. Prometheus 配置未生效,需要重启 Pod

  2. 指标标签名不匹配(namespace vs object_namespace

  3. namespace 变量查询的指标不对

解决:按本文档第三章和第四章的配置重新应用。

6.5 k8sgpt 分析结果全是 ConfigMap 未使用

原因 :k8sgpt 只检查 ConfigMap 是否被 Pod 直接引用,系统级 ConfigMap(如 kube-root-ca.crtkubeadm-config)通过其他机制使用。

解决:这些是误报,可以忽略。如需减少误报,可在 CR 中配置过滤器排除系统命名空间。


七、配置文件清单

文件 说明
/root/k8sgpt-cr.yaml K8sGPT 自定义资源
/root/k8sgpt-dashboard.json Grafana 仪表盘 JSON
/tmp/prometheus-patch.yaml Prometheus ConfigMap patch 文件
/root/k8sgpt-operator-install.md k8sgpt 安装文档
/root/k8sgpt-monitoring-integration.md 本文档
相关推荐
有毒的教程2 小时前
Kubernetes进阶实战教程(生产落地完整版)
云原生·容器·kubernetes
xiucai_cs3 小时前
【无标题】opencode +GPT-5.x 频繁超时?一行配置解决 Provider response headers timed out
gpt·opencode
2601_955759626 小时前
code0 gpt-image-2 场景相关:广告投放素材快速生成流程
人工智能·gpt
h3guang Official7 小时前
K8s安全实战:从漏洞靶场到红蓝对抗
安全·容器·kubernetes
X1ao hu7 小时前
dashboard 动态卷 stateful
kubernetes
ward RINL9 小时前
# GPT-5.6-sol vs GPT-5.5 新题实测:非弹性碰撞物理题和稳定路由算法
网络·gpt·算法
only_Klein10 小时前
AI故障诊断工具—k8sGPT
人工智能·gpt·kubernetes
大龄牛码20 小时前
GPT-5.6 模型家族:分层矩阵与多智能体时代的全面开启
人工智能·gpt
摇滚侠20 小时前
Prometheus+Grafana+睿象云的监控告警系统 01-07
grafana·prometheus