k8s 中使用 Service 访问时NetworkPolicy不生效问题排查

背景

针对一个服务如下NetworkPolicy, 表示只有n9e命名空间的POD才能访问 k8s-man 服务

yaml 复制代码
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: k8s-man
  namespace: n9e
  labels:
    app: k8s-man
    version: v1
spec:
  podSelector:
    matchLabels:
      app: k8s-man
      version: v1
  ingress:
    - ports:
        - protocol: TCP
      from:
        - namespaceSelector:
            matchLabels:
              project: n9e
        - ipBlock:
            cidr: 172.16.239.0/24
        - ipBlock:
            cidr: 172.16.46.0/24
  policyTypes:
    - Ingress

NetworkPolicy 创建后, 在n9e命名空间中发现使用POD的IP访问 k8s-man服务是可以的, 但是使用 service 不行

排查过程

进入 k8s-man所在的Node节点.

执行 iptables -L | grep k8s-man

找到

复制代码
MARK       tcp  --  anywhere             anywhere             /* cali:vXxAzmXgtXdiHYG_ */ /* Policy n9e/knp.default.k8s-man ingress */ match-set cali40s:SgNpHWMUr8ifdpNh8A29AuF src MARK or 0x10000

确认使用的式cali40s:SgNpHWMUr8ifdpNh8A29AuF 这个ipset

执行 ipset list cali40s:SgNpHWMUr8ifdpNh8A29AuF

得到如下结果:

复制代码
[root@node3 ~]# ipset list cali40s:SgNpHWMUr8ifdpNh8A29AuF
Name: cali40s:SgNpHWMUr8ifdpNh8A29AuF
Type: hash:net
Revision: 6
Header: family inet hashsize 1024 maxelem 1048576
Size in memory: 888
References: 1
Number of entries: 8
Members:
172.16.139.213
172.16.143.67
172.16.178.43
172.16.178.37
172.16.239.190
172.16.85.24
172.16.46.157
172.16.139.237

发现对应的Ip是n9e 命名空间下pod的IP。

猜测是经过service 后发生了NAT转换,Ip成了源POD所在节点的的容器IP端。

修改网络策略如下, 172.16.239.0/24 和 172.16.46.0/24 是源POD节点的容器网段:

yaml 复制代码
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: k8s-man
  namespace: n9e
  labels:
    app: k8s-man
    version: v1
spec:
  podSelector:
    matchLabels:
      app: k8s-man
      version: v1
  ingress:
    - ports:
        - protocol: TCP
      from:
        - namespaceSelector:
            matchLabels:
              project: n9e
        - ipBlock:
            cidr: 172.16.239.0/24
        - ipBlock:
            cidr: 172.16.46.0/24
  policyTypes:
    - Ingress

说明通过service访问的话,源IP经过的NAT转换成了源POD所在节点上的容器IP,导致 NetworkPolicy不生效。

相关推荐
运维全栈笔记几秒前
Harbor生产级部署实战:PostgreSQL+Redis+MinIO全解耦架构详解
linux·运维·服务器·笔记·架构·kubernetes·k8s
程序员老邢15 分钟前
【技术底稿 36】Docker Compose 微服务迁移 K3s:离线导入、镜像挂载、Nginx 重定向全踩坑复盘
nginx·docker·云原生·k3s·微服务迁移·技术底稿·容器运维
不做无法实现的梦~24 分钟前
Docker 新手到团队协作指南
运维·docker·容器
SPC的存折39 分钟前
22、K8S-Helm
云原生·容器·kubernetes
nix.gnehc1 小时前
Langfuse v3 Docker 部署
运维·人工智能·docker·容器·langfuse
行者-全栈开发1 小时前
【前端安全】CVE-2026-44578:Next.js SSRF 漏洞深度解析与修复实战指南
websocket·云原生·next.js·安全防护·vercel·cve-2026-44578·中间件绕过
Elastic 中国社区官方博客1 小时前
在 Kubernetes 上的 Elastic Cloud:简化的可用区感知、重启和 mTLS
大数据·数据库·搜索引擎·云原生·容器·kubernetes·全文检索
蜀道山老天师1 小时前
Prometheus监控Hadoop集群(实操完整版,含避坑指南)
大数据·linux·运维·hadoop·云原生·prometheus
sbjdhjd1 小时前
01| 裸机部署 K8S:从零搭建生产可用集群
运维·经验分享·云原生·kubernetes·开源·kubelet·kubeless
jran-1 小时前
Docker 容器化技术&docker安装
运维·docker·容器