夜莺监控部署到Kubernetes集群

在云原生时代,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  
© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...