在云原生时代,Kubernetes(K8s)已成为企业容器化部署的标准。但随着集群规模扩大,组件复杂度、资源利用率、服务稳定性等问题也随之凸显。夜莺监控(Nightingale)作为国产开源的全栈可观测性工具,支持轻量级部署、多模态数据采集、AI 告警自愈,完美适配 K8s 环境。本文将带你从零开始,详细部署一套完整的夜莺监控系统!
一、部署前准备
1. 环境要求
• Kubernetes 集群(1.20+版本,建议 1.24+)
• 安装 kubectl 并配置集群访问权限
• 存储类(如 openebs、NFS 等,用于持久化存储)
2. 创建命名空间
kubectl create namespace nightingale-system
3. 安装依赖组件
• Prometheus:指标采集核心组件。
• kube-state-metrics:采集 K8s 对象元数据(Pod、Deployment 等)。
二、详细部署步骤
步骤 1:配置 RBAC 权限
夜莺需要访问 K8s API Server 和组件指标,需创建 ClusterRole 和 ServiceAccount:
1. 创建 ClusterRole(rbac.yaml)
cat >> /data/k8s/yy/rbac.yaml << \EOF
apiVersion: rbac.authorization.k8s.io/v1
kind:ClusterRole
metadata:
name:nightingale-role
rules:
# 采集 K8s 组件指标
-apiGroups: [""]
resources: ["nodes", "pods", "services", "endpoints"]
verbs: ["get", "list", "watch"]
# 采集 API Server 和 Controller Manager 指标
-nonResourceURLs: ["/metrics", "/metrics/cadvisor"]
verbs: ["get"]
EOF
2. 创建 ServiceAccount 并绑定权限
cat >> /data/k8s/yy/rbac.yaml << \EOF
apiVersion: v1
kind:ServiceAccount
metadata:
name:nightingale-sa
namespace:nightingale-system
---
apiVersion:rbac.authorization.k8s.io/v1
kind:ClusterRoleBinding
metadata:
name:nightingale-binding
roleRef:
apiGroup:rbac.authorization.k8s.io
kind:ClusterRole
name:nightingale-role
subjects:
-kind:ServiceAccount
name:nightingale-sa
namespace:nightingale-system
EOF
应用配置:
kubectl apply -f rbac.yaml -n nightingale-system
步骤 2:部署 Categraf(数据采集器)
Categraf 是夜莺的轻量级采集器,支持 Prometheus、K8s API 等数据源。
1. 创建 Categraf DaemonSet
cat >> /data/k8s/yy/categraf-daemonset.yaml << \EOF
apiVersion: apps/v1
kind:DaemonSet
metadata:
name:categraf
namespace:nightingale-system
spec:
selector:
matchLabels:
app:categraf
template:
metadata:
labels:
app:categraf
spec:
serviceAccountName:nightingale-sa
containers:
-name:categraf
image:flashcatcloud/categraf:latest
args:
-"-config"
-"/etc/categraf/categraf.yaml"
volumeMounts:
-name:config-volume
mountPath:/etc/categraf
volumes:
-name:config-volume
configMap:
name:categraf-config
EOF
2. 配置 Categraf 采集规则(categraf-config.yaml)
cat >> /data/k8s/yy/categraf-config.yaml << \EOF
apiVersion: v1
kind:ConfigMap
metadata:
name:categraf-config
namespace:nightingale-system
data:
categraf.yaml: |
inputs:
- name: kubernetes
type: kubernetes
interval: 10s
# 采集 kubelet 指标
kubelet:
host: "https://${NODE_NAME}:10250"
insecure_skip_verify: true
# 采集 Prometheus Exporter 指标
exporters:
- name: prometheus
type: prometheus
endpoint: "http://n9e-prometheus.monitoring:9090/api/v1/write"
EOF
应用配置:
kubectl apply -f categraf-daemonset.yaml -n nightingale-system
kubectl apply -f categraf-config.yaml -n nightingale-system
步骤 3:部署 kube-state-metrics
用于采集 K8s 对象元数据(如 Pod 状态、Deployment 副本数等)。
部署 YAML(kube-state-metrics.yaml):
cat >> /data/k8s/yy/kube-state-metrics.yaml << \EOF
apiVersion: apps/v1
kind:Deployment
metadata:
name:kube-state-metrics
namespace:nightingale-system
spec:
replicas:1
selector:
matchLabels:
app:kube-state-metrics
template:
metadata:
labels:
app:kube-state-metrics
spec:
containers:
-name:kube-state-metrics
image:gcr.io/google-containers/kube-state-metrics:v2.8.2
ports:
-containerPort:8080
args:
-"--enable-custom-metrics"
-"--metrics-prefix=kube_state_metrics_"
EOF
暴露 Service:
cat >> /data/k8s/yy/kube-state-metrics.yaml << \EOF
apiVersion: v1
kind:Service
metadata:
name:kube-state-metrics
namespace:nightingale-system
spec:
ports:
-port:80
targetPort:8080
selector:
app:kube-state-metrics
EOF
应用配置:
kubectl apply -f kube-state-metrics.yaml -n nightingale-system
步骤 4:部署 Nightingale Server
1. 拉取镜像并部署
# 创建持久化存储(以 openebs 为例)
kubectl apply -f https://openebs.github.io/charts/openebs-operator.yaml
kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
# 部署 Nightingale(使用 Helm)
helm repo add n9e https://n9e.github.io/charts
helm install nightingale n9e/nightingale \
--namespace nightingale-system \
--set persistence.storageClass=openebs-hostpath \
--set persistence.size=10Gi
2. 暴露 Web 界面
cat >> /data/k8s/yy/nightingale-web-service.yaml << \EOF
apiVersion: v1
kind:Service
metadata:
name:nightingale-web
namespace:nightingale-system
spec:
type:NodePort
ports:
-port:80
targetPort:17000
nodePort:30007# 可自定义端口
selector:
app:nightingale
EOF
应用配置:
kubectl apply -f nightingale-web-service.yaml -n nightingale-system
步骤 5:配置 Prometheus 采集指标
1. 编辑 Prometheus 配置
# 在 Nightingale 的 Prometheus 配置中添加以下 job
-job_name:"kubernetes"
kubernetes_sd_configs:
-role:node# 采集 kubelet 指标
relabel_configs:
-source_labels: [__address__]
target_label:__address__
replacement:"${1}:10250"
-job_name:"kube-state-metrics"
static_configs:
-targets: ["kube-state-metrics.nightingale-system:80"]
2. 重启 Prometheus
kubectl rollout restart deployment/nightingale -n nightingale-system
三、验证部署
1. 检查 Pod 状态
kubectl get pods -n nightingale-system
# 应显示 categraf、kube-state-metrics、nightingale 等 Pod 为 Running 状态
2. 访问 Web 界面
通过 NodePort 访问:
http://<K8s 节点 IP>:30007
默认账号/密码: root/root.2020
3. 验证数据采集
• 进入监控大盘,查看 K8s 节点资源(CPU/内存/存储)。
• 检查 kube-state-metrics 指标(如 kube_pod_status_phase)。
四、常见问题及解决方案
问题 1:权限不足(Forbidden 错误)
原因:未正确绑定 ServiceAccount 或 RBAC 权限不足。
解决:
1. 检查 ClusterRole 是否包含/metrics 访问权限。
2. 确保 ServiceAccount 与 ClusterRoleBinding 绑定正确。
问题 2:Categraf 无法采集 kubelet 指标
原因:K8s 1.24+版本需使用 PodIdentityWebhook。
解决:
# 在 DaemonSet 中添加注解
annotations:
“iam.amazonaws.com/role-arn”: “arn:aws:iam::123456789012:role/kubelet”
问题 3:Prometheus 无法获取指标
原因:Service 配置错误或端口未暴露。
解决:
1. 确保 kube-state-metrics 的 Service 端口正确(如 80→8080)。
2. 检查 Prometheus 配置的 target 是否可达。
五、扩展配置
1. 配置告警规则
# 示例:CPU 使用率超过 80%触发告警
groups:
-name:k8s-cpu-alarm
rules:
-alert:HighCPUUsage
expr:100-(avgby(node)(machine:node_cpu_utilisation:sum)*100)<80
for:5m
labels:
severity:warning
annotations:
summary:"Node {{ $labels.node }} CPU usage is too high!"
2. 导入监控模板
# 导入 K8s 集群大盘模板
kubectl exec -it -n nightingale-system \
-- /bin/sh -c "curl -o /etc/nightingale/dashboards/k8s-dashboard.json \
https://raw.githubusercontent.com/flashcatcloud/categraf/main/k8s/pod-dash.json"
3. 远程访问(可选)
使用 cpolar 或 Nginx Ingress 穿透内网:
# 使用 cpolar 映射端口
cpolar --subdomain my-n9e http://localhost:30007