阿里云k8s1.21.3 部署kube-prometheus-0.9.0,网络模型: Canal,使用平台loadbalance模式访问grafana,prometheus,部署完成网络不通

问题描述:阿里云k8s1.21.3 部署kube-prometheus-0.9.0,网络模型: Canal,使用平台loadbalance模式访问grafana,prometheus,部署完成网络不通,Flannel网络模型可以,什么原因,如何解决,咨询售后给的解释是,prometheus-k8s和grafana两个pod节点的网络策略都是pod的入口方向,只能从app.kubernetes.io/name: prometheus 的pod访问,访问不通就是这个策略导致的,您看看这个策略是您自己创建的还是promethuse社区带的呢

解决方案:

  • 环境:阿里云 ACK,Kubernetes 1.21.3

  • CNI:Canal(不通),Flannel(正常)

  • 部署kube-prometheus-0.9.0

  • 暴露方式:LoadBalancer

  • 现象:部署完成后无法从外部访问 prometheusgrafana,切换到 Flannel 就能访问

  • 阿里云售后反馈:Prometheus 和 Grafana Pod 上存在 NetworkPolicy,只允许来自 app.kubernetes.io/name=prometheus 的 Pod 访问。

也就是说,你的问题很可能不是 Canal 本身的问题,而是 NetworkPolicy 的隔离规则在 Canal 下被严格执行,导致外部 LoadBalancer 流量被拒绝。


1. 为什么 Flannel 正常 Canal 不通?

  • Flannel:默认不支持 NetworkPolicy,规则不起作用,等于全网互通。

  • Canal:支持 NetworkPolicy,会严格执行 kube-prometheus 清单里的 NetworkPolicy,导致只有特定 Pod 可以访问。

  • 所以,表现就是 Flannel 正常、Canal 阻断。


2. 验证 NetworkPolicy 是否存在

先确认 Prometheus Operator 生成的 NetworkPolicy:

 
kubectl get networkpolicy -n monitoring

你可能会看到类似:

 
NAME POD-SELECTOR AGE prometheus-k8s app.kubernetes.io/name=prometheus 3h grafana app.kubernetes.io/name=grafana 3h

查看其中一个规则:

 
kubectl get networkpolicy prometheus-k8s -n monitoring -o yaml

大概率会看到 只允许来自相同 namespace、特定 label 的 Pod 访问 ingress,而没有允许外部 LoadBalancer ingress。


3. 解决方案

你有几种思路:

方案 A:修改/删除 NetworkPolicy

如果你是自己部署的 kube-prometheus(community manifests),可以直接删除 NetworkPolicy,或者放宽 ingress 规则:

 
kubectl edit networkpolicy prometheus-k8s -n monitoring

修改成允许所有 ingress:

 
spec: ingress: - {} # 允许所有来源

或者直接删掉:

 
kubectl delete networkpolicy prometheus-k8s -n monitoring kubectl delete networkpolicy grafana -n monitoring

这样 Canal 下就和 Flannel 一样了。


方案 B:补充一条允许 LoadBalancer 的 NetworkPolicy

更安全的做法是加一个允许来自 Service 的 ingress 规则:

 
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-prometheus-lb namespace: monitoring spec: podSelector: matchLabels: app.kubernetes.io/name: prometheus ingress: - from: - ipBlock: cidr: 0.0.0.0/0 # 或者指定你的VPC CIDR

Grafana 也类似创建一条。


4. 结论

  • 这个 NetworkPolicy 不是你自己写的,是 kube-prometheus 官方清单里带的,社区默认就是限制 ingress,只让 Prometheus、Alertmanager 等组件内部访问。

  • 在 Flannel 下这个策略形同虚设(不支持),所以你能访问。

  • 在 Canal 下它生效了,所以被挡住。


要不要我帮你直接整理一份 适配 Canal 的修改版 kube-prometheus-0.9.0 NetworkPolicy YAML,让你直接 apply 解决访问问题?这样比手动编辑方便。

posted @ 2025-09-11 19:03  GaoYanbing  阅读(15)  评论(0)    收藏  举报