Kubernetes 监控与日志
一体部署:Prometheus + Grafana + Alertmanager(指标)与 Loki + Promtail(日志)。
配置集中在 config.yaml,由 install.sh 串行安装(降低 etcd 压力)。
1. 架构
指标 ──► Prometheus ────────┐
告警 ──► Alertmanager ──────┼──► Grafana ──► Dashboard / Explore
日志 ──► Promtail ──► Loki ─┘
| 组件 | 作用 |
|---|---|
| Prometheus | 采集、存储指标 |
| Grafana | 可视化(指标 + 日志) |
| Alertmanager | 告警路由 |
| Loki | 日志存储与查询(默认保留 60 天,到期自动删) |
| Promtail | 各节点采集容器日志 |
命名空间:monitoring
2. 目录文件
| 文件 | 说明 |
|---|---|
config.yaml |
唯一业务配置(NFS、镜像、端口、Helm values) |
install.sh |
安装 / 升级 / 删除 / 重建 |
README.md |
本文档 |
.generated/ |
脚本生成的临时清单(可忽略) |
3. 安装与卸载
3.1 依赖
# 控制面可执行 kubectl / helm
helm version
kubectl get node
# 脚本依赖
apt-get install -y python3-yaml
# 或:pip3 install pyyaml
3.2 NFS 准备(必做)
NFS 服务器:172.16.10.120(以 config.yaml 中 nfs.server 为准)
mkdir -p /data/nfs/monitoring/{prometheus,grafana,alertmanager,loki}
chown -R 472:472 /data/nfs/monitoring/grafana
chown -R 1000:2000 /data/nfs/monitoring/prometheus
chown -R 1000:2000 /data/nfs/monitoring/alertmanager
chown -R 10001:10001 /data/nfs/monitoring/loki
| 目录 | 用途 | 属主 (UID:GID) |
|---|---|---|
.../grafana |
Grafana 数据 | 472:472 |
.../prometheus |
Prometheus 数据 | 1000:2000 |
.../alertmanager |
Alertmanager 数据 | 1000:2000 |
.../loki |
Loki 数据 | 10001:10001 |
Loki 的 PVC 名固定为
storage-loki-0(StatefulSet 约定),由脚本预建并绑定pv-mon-loki。
3.3 执行安装
cd /opt/service/k8s/monitoring # 或本仓库 install-k8s-1.33/monitoring
bash install.sh # 安装 / 升级
bash install.sh reinstall # 全部删除后重建
bash install.sh destroy # 仅删除
脚本特点:
- 串行操作、步骤间等待,减轻 etcd 超时
- CRD 逐个 apply,Helm 失败自动重试
- Loki 先 0 副本,校正 PVC 后再拉起
- node-exporter 强制使用
v1.8.2(禁止*-distroless)
整次 reinstall 约 15~30 分钟,请勿中断。
3.4 修改配置
只改 config.yaml,再执行:
bash install.sh
结构说明:
nfs: # NFS 地址与根路径
kubePrometheus: # 指标栈 + Grafana(含 Loki 数据源)
loki: # 日志存储
promtail: # 日志采集
4. 访问入口
先查 NodePort(以实际为准):
kubectl -n monitoring get svc
| 服务 | 默认 NodePort | 地址示例 | 账号 |
|---|---|---|---|
| Grafana | 30300 | http://<节点IP>:30300 |
admin / admin123456 |
| Prometheus | 30390 | http://<节点IP>:30390 |
- |
| Alertmanager | 30303 | http://<节点IP>:30303 |
- |
查 Grafana 密码:
kubectl -n monitoring get secret kube-prometheus-grafana \
-o jsonpath="{.data.admin-password}" | base64 -d; echo
建议首次登录后修改密码。界面可设中文:头像 → Profile → Language → 简体中文(config.yaml 中已默认 zh-Hans)。
5. 使用 Grafana
5.1 看指标(Prometheus)
- 打开 Grafana
- 左侧 Dashboards,使用自带 Kubernetes / Node 等看板
- 或 Explore → 数据源选 Prometheus → 写 PromQL
5.2 看日志(Loki)
- 左侧 Explore
- 右上角数据源选 Loki(不要选 Prometheus)
- 用 Label browser 选择
namespace/pod/container - 示例查询:
{namespace="monitoring"}
{namespace="default"}
{namespace="default"} |= "error"
{pod=~"loki-.*"}
历史日志与保留:
- Grafana Explore 右上角改时间范围(如 Last 30 days / Absolute)即可查历史
- Loki 默认保留 1440h(60 天,约 2 个月),到期由 Compactor 自动删除
- 修改:
config.yaml→loki.loki.limits_config.retention_period,再执行bash install.sh - 磁盘约 50Gi;量很大时可加大 PVC / NFS,否则未到 60 天也可能写满
说明:
- 只有产生过日志的 namespace 才会出现在标签列表里
default若搜不到:先确认该命名空间有 Running 的 Pod,并放大时间范围(如 Last 24h)- 测试造日志:
kubectl -n default run log-test --image=busybox:1.36 --restart=Never \
-- /bin/sh -c 'for i in 1 2 3 4 5; do echo hello-default-$i; sleep 1; done'
# Grafana 查询:{namespace="default"} |= "hello-default"
6. 日常运维命令
# 状态
kubectl -n monitoring get pod,svc,pvc
kubectl get pv | grep pv-mon
helm -n monitoring list
# 日志
kubectl -n monitoring logs -l app.kubernetes.io/name=grafana --tail=100
kubectl -n monitoring logs prometheus-monitoring-prometheus-0 -c prometheus --tail=100
kubectl -n monitoring logs loki-0 -c loki --tail=100
kubectl -n monitoring logs -l app.kubernetes.io/name=promtail --tail=50
# 健康
curl -sS "http://<节点IP>:30390/-/healthy"
7. 镜像说明
内网优先使用私有仓 registry.cn-chengdu.aliyuncs.com/obsbot/(在 config.yaml 中配置)。
| 注意 | 说明 |
|---|---|
| node-exporter | 使用 v1.8.2,不要用 *-distroless(源上常没有) |
| Grafana + NFS | 关闭 initChownData,目录属主提前设为 472 |
| Prometheus 权限 | 数据目录必须 1000:2000 |
| Loki 权限 | 数据目录必须 10001:10001 |
8. 常见问题
8.1 Helm / etcd:etcdserver: request timed out
集群 API 压力过大。脚本已串行重试;若仍失败:
kubectl get --raw='/readyz?verbose' | head -30
# 确认 etcd、磁盘、内存正常后,再执行:
bash install.sh
8.2 Pod Pending:unbound PersistentVolumeClaims
- 一块 PV 只能绑一个 PVC
- Loki 必须使用已 Bound 的
storage-loki-0(50Gi / RWX) - 不要手建
data-prometheus与 Operator PVC 抢同一块盘
kubectl -n monitoring get pvc
kubectl get pv | grep pv-mon
8.3 Prometheus Crash:permission denied / queries.active
# 在 NFS 服务器
chown -R 1000:2000 /data/nfs/monitoring/prometheus
rm -f /data/nfs/monitoring/prometheus/queries.active
kubectl -n monitoring delete pod prometheus-monitoring-prometheus-0 --force --grace-period=0
8.4 Grafana Init:chown: Operation not permitted
NFS 不支持容器内 chown。保持 initChownData.enabled: false,并:
chown -R 472:472 /data/nfs/monitoring/grafana
8.5 node-exporter ImagePullBackOff(*-distroless)
kubectl -n monitoring set image ds/kube-prometheus-prometheus-node-exporter \
node-exporter=registry.cn-chengdu.aliyuncs.com/obsbot/node-exporter:v1.8.2
或重新执行 bash install.sh(脚本会强制校正)。
8.6 Loki 一直 Pending / PVC 冲突
StatefulSet 会创建 storage-loki-0。错误的 10Gi/RWO PVC 需删掉重建。推荐:
bash install.sh reinstall
8.7 Explore 里没有某个 namespace
该命名空间无 Pod 或尚无新日志时,Loki 不会出现对应 namespace 标签。用第 5.2 节方法造日志验证。
9. 验收清单
-
kubectl -n monitoring get pod主要组件 Ready - PVC 均为 Bound;
storage-loki-0→pv-mon-loki - Grafana 可登录
- Dashboards 有节点/集群指标
- Explore → Loki 可查
{namespace="monitoring"} - Prometheus
/healthy、Alertmanager 页面可打开
10. 快速参考
# 安装
bash install.sh
# 重建
bash install.sh reinstall
# 状态
kubectl -n monitoring get pod,svc,pvc
# Grafana 密码
kubectl -n monitoring get secret kube-prometheus-grafana \
-o jsonpath="{.data.admin-password}" | base64 -d; echo
| 入口 | URL |
|---|---|
| Grafana | http://<节点IP>:30300 |
| Prometheus | http://<节点IP>:30390 |
| Alertmanager | http://<节点IP>:30303 |
| 查日志 | Grafana → Explore → Loki |
11. 下载地址
git clone https://github.com/web-starbucket/k8s-script.git
Comments & discussion
The first comment in each thread opens a topic. Signed-in readers can keep the conversation going under that topic.
No comments yet. Sign in to start a topic.
Start a new topic
Sign in to start a topic or join the discussion.