AWS EKS出口NetworkPolicy无法允许流量访问Redis服务Pod
问题分析与解决方案
一、Redis连接失败的核心原因
从VPC CNI日志可见,后端Pod的流量目标是Redis Service的ClusterIP(192.168.28.141),但你配置的后端Network Policy出口规则仅允许访问符合标签选择器的Redis Pod(目标IP为198.18.7.113)。
AWS VPC CNI的Network Policy是基于实际数据包的目标Pod IP做规则匹配的,而Service ClusterIP不属于任何Pod的IP范围,因此这条发往Service IP的流量无法匹配你的出口规则,最终被myapp-netpol-denyall-branch-develop的默认拒绝策略拦截。
二、修复方案
你需要在后端的Network Policy中添加允许访问Redis Service ClusterIP的出口规则,或放宽规则覆盖集群Service IP段:
方案1:允许访问Redis具体Service IP
修改myapp-netpol-allow-backend-branch-develop的Egress规则,新增针对Redis Service ClusterIP的规则:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: myapp-netpol-allow-backend-branch-develop namespace: mynamespace spec: podSelector: matchLabels: app: backend-branch-develop release-name: branch-develop software-name: myapp policyTypes: - Ingress - Egress ingress: # 保留原有Ingress规则 - ports: - port: 1337 protocol: TCP from: - podSelector: matchLabels: app.kubernetes.io/component: controller app.kubernetes.io/name: ingress-nginx egress: # 保留原有Redis Pod访问规则 - ports: - port: 6379 protocol: TCP to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: mynamespace podSelector: matchLabels: app: redis-branch-develop release-name: branch-develop software-name: myapp # 新增允许访问Redis Service IP的规则 - ports: - port: 6379 protocol: TCP to: - ipBlock: cidr: 192.168.28.141/32
方案2:允许访问集群Service CIDR段
若集群内有多个Service需要访问,可直接允许访问整个集群的Service CIDR(集群创建时指定,通常为类似192.168.0.0/16的网段):
# 在Egress规则中新增 - ports: - port: 6379 protocol: TCP to: - ipBlock: cidr: 192.168.0.0/16 # 替换为你的集群Service CIDR
三、查看Network Policy选择器匹配的Pod
kubectl没有直接通过describe networkpolicy展示匹配Pod的功能,但可通过以下原生命令实现:
- 查看Network Policy自身选中的Pod
针对Network Policy的podSelector,直接用标签筛选:
# 查看后端Network Policy选中的Pod kubectl get pods -n mynamespace -l app=backend-branch-develop,release-name=branch-develop,software-name=myapp # 查看Redis Network Policy选中的Pod kubectl get pods -n mynamespace -l app=redis-branch-develop,release-name=branch-develop,software-name=myapp
- 查看Ingress/Egress规则中To/From匹配的Pod
比如查看允许访问Redis的后端Pod:
kubectl get pods -n mynamespace -l app=backend-branch-develop,release-name=branch-develop,software-name=myapp
内容的提问来源于stack exchange,提问作者Skynet
相关产品推荐
相关产品推荐

