K8s监控部署(Prometheus+Grafana)

专栏:K8s

集群版本:v1.36

容器:containerd

部署监控只用在Master节点操作

需要科学上网

配置代理环境

#Master节点配置代理,后面要加入仓库时会用到。
export http_proxy=http://172.30.30.2:7897
export https_proxy=http://172.30.30.2:7897

#容器也要配置代理环境,否则拉取不到镜像(所有节点执行)。
#创建 containerd 服务配置目录并写入代理配置
mkdir -p /etc/systemd/system/containerd.service.d

cat > /etc/systemd/system/containerd.service.d/proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://172.30.30.1:7897"
Environment="HTTPS_PROXY=http://172.30.30.1:7897"
Environment="NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
EOF

# 重新加载 systemd 配置并重启 containerd
systemctl daemon-reload
systemctl restart containerd

下载所需软件包

yum install helm -y

创建单独的名称空间

#创建单独的名称空间,保持节点干净整洁,也方便后续管理。
kubectl create namespace monitoring

添加Helm仓库

#加入prometheus-community仓库,刚才的代理用到了。
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

安装kube-prometheus-stack

helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring  \
--set grafana.adminPassword=Admin@123

#--namespace 指定名称空间
#--set grafana.adminPassword grafana登录密码 

#这个命令会部署以下组件:
prometheus-prometheus-oper-prometheus: Prometheus Server
prometheus-grafana: Grafana 服务器
prometheus-prometheus-oper-alertmanager: Alertmanager
prometheus-kube-state-metrics: 用于监控 Kubernetes 资源对象(如 Deployment、Pod)的状态。
prometheus-prometheus-node-exporter: 用于收集集群每个节点的硬件和操作系统指标(DaemonSet)。

验证安装

# 检查 Pod 是否都正常运行
kubectl get pods -n monitoring

#检查 Service
kubectl get svc -n monitoring

暴露服务端口用于外部访问

#从外部浏览器访问,暴露两个即可,一个prometheus-grafana,一个prometheus-kube-prometheus-prometheus
kubectl edit svc -n monitoring prometheus-grafana
kubectl edit svc -n prometheus-kube-prometheus-prometheus
#将type模式改为NodePort

查看暴露的端口

kubectl get svc -n monitoring prometheus-grafana
kubectl get svc -n monitoring prometheus-kube-prometheus-prometheus

[root@master ~]# kubectl get svc -n monitoring prometheus-grafana
NAME                 TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
prometheus-grafana   NodePort   10.110.142.111   <none>        80:32022/TCP   172m
#端口也可不用随机,可以固定,同样的,用kubectl edit修改端口,将nodePort改为合适的端口。

访问

在外部浏览器输入集群任意网卡IP+端口,即可访问。

http://172.30.30.135:32022 grafana

http://172.30.30.135:32156 prometheus

删除代理

监控部署结束后,就可以删除系统代理和容器内部的代理了,若不关闭,当从外部关闭代理软件时,容器内部就会出问题,查看节点和Pod会出错。

rm -rf /etc/systemd/system/containerd.service.d/proxy.conf
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_PROXY

排错

在访问prometheus时,发现以下报错。

Server time is out of sync Detected a time difference of 1m 30.295s between your browser and the server. You may see unexpected time-shifted query results due to the time drift.

显示时间有问题。但集群明明已经做了时间同步,也确认过。此时则就是本地电脑的时间问题。

  • 右键任务栏右下角时间 → 调整日期/时间
  • 确保 自动设置时间 为 开
  • 点击 立即同步(或重新开关自动同步)
做完后刷新页面,就没问题了。

其他

因为此时无论访问集群的那个节点,都可以访问到监控,若是想固定下来,可以使用firewalld或者iptables的方法。禁止其他节点(node1、node2)响应 NodePort 端口的请求。

#firewalld方法
# 在 node1 和 node2 上分别执行
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 port port="32022" protocol="tcp" reject'
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 port port="32156" protocol="tcp" reject'
firewall-cmd --reload

#iptables
# 在 node1 和 node2 上分别执行
iptables -A INPUT -p tcp --dport 32022 -j REJECT
iptables -A INPUT -p tcp --dport 32156 -j REJECT
# 保存规则(以 iptables-save 持久化)

确保master节点允许访问。(此时已经打开了防火墙)

# 在 master 上执行
firewall-cmd --permanent --add-port=32022/tcp
firewall-cmd --permanent --add-port=32156/tcp
firewall-cmd --reload

替代方案(更 Kubernetes 原生)

如果希望从根本上不让 kube-proxy 在特定节点上监听 NodePort,目前标准 Kubernetes 不支持按节点禁用 NodePort。但可以:

1. 将 Service 改回 ClusterIP
2. 在 master 上部署一个 nginx 或 kubectl port-forward 作为入口,但会引入单点故障。

生产环境中,建议使用Ingress来做更好。为裸机集群提供负载均衡能力的 MetalLB 也是一个很好的选择。可以根据自己的实际情况来选择。

它的工作流程如下:

1. 外部请求访问集群的某个域名或路径。
2. 请求被该控制器接收,并根据预先定义的Ingress规则,判断应转发至哪个内部 Service。
3. 控制器在转发前,会根据配置执行白名单检查,只允许来源IP在列表中的请求通过。
4. 合法的请求被继续转发至对应的后端 Service,完成访问。

0 条评论

🔒

发表评论需要 登录

还没有账号?立即注册

💬
还没有评论,来抢沙发吧!

← 返回首页