阿里云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
-
现象:部署完成后无法从外部访问
prometheus
和grafana
,切换到 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:
你可能会看到类似:
查看其中一个规则:
大概率会看到 只允许来自相同 namespace、特定 label 的 Pod 访问 ingress,而没有允许外部 LoadBalancer ingress。
3. 解决方案
你有几种思路:
方案 A:修改/删除 NetworkPolicy
如果你是自己部署的 kube-prometheus(community manifests),可以直接删除 NetworkPolicy,或者放宽 ingress 规则:
修改成允许所有 ingress:
或者直接删掉:
这样 Canal 下就和 Flannel 一样了。
方案 B:补充一条允许 LoadBalancer 的 NetworkPolicy
更安全的做法是加一个允许来自 Service 的 ingress 规则:
Grafana 也类似创建一条。
4. 结论
-
这个 NetworkPolicy 不是你自己写的,是 kube-prometheus 官方清单里带的,社区默认就是限制 ingress,只让 Prometheus、Alertmanager 等组件内部访问。
-
在 Flannel 下这个策略形同虚设(不支持),所以你能访问。
-
在 Canal 下它生效了,所以被挡住。
要不要我帮你直接整理一份 适配 Canal 的修改版 kube-prometheus-0.9.0 NetworkPolicy YAML,让你直接 apply 解决访问问题?这样比手动编辑方便。