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_namespace → namespace |
添加 operator 命名空间标签 |
__meta_kubernetes_namespace → kubernetes_namespace |
备份原始命名空间 |
__meta_kubernetes_service_name → kubernetes_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_configs将object_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 |
分析结果总数,按 k8sgpt 和 object_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
原因:
-
Prometheus 配置未生效,需要重启 Pod
-
指标标签名不匹配(
namespacevsobject_namespace) -
namespace 变量查询的指标不对
解决:按本文档第三章和第四章的配置重新应用。
6.5 k8sgpt 分析结果全是 ConfigMap 未使用
原因 :k8sgpt 只检查 ConfigMap 是否被 Pod 直接引用,系统级 ConfigMap(如 kube-root-ca.crt、kubeadm-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 |
本文档 |