如何配置Kubernetes网络策略以允许Ingress及VM流量访问容器
解决方案
要满足你的需求——保留原有同网段容器的443访问权限,同时允许VM经Ingress转发的流量到达Pod,你需要在现有NetworkPolicy的ingress部分添加额外规则,具体分两种常见场景处理:
场景1:Ingress Controller默认SNAT(集群内转发)
默认情况下,Ingress Controller会对转发到后端Pod的流量做SNAT,Pod接收到的流量源IP是Ingress Controller自身的Pod IP。这种情况下,你可以通过标签选择器放行Ingress Controller的Pod访问:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: labels: env: dev namespace: big-calculator-dev name: big-calculator-dev namespace: big-calculator-dev spec: ingress: # 原有规则:允许同网段容器的443端口访问 - from: - ipBlock: cidr: 172.18.0.0/21 ports: - port: 443 protocol: TCP # 新增规则:允许Ingress Controller的Pod访问(替换为你的Ingress实际标签/命名空间) - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system # 假设Ingress部署在kube-system命名空间 podSelector: matchLabels: app: nginx-ingress # 替换为你的Ingress Controller的Pod标签 ports: - port: 443 protocol: TCP podSelector: {} policyTypes: - Ingress
场景2:Ingress保留源IP(VM直接IP可见)
如果你的Ingress配置了源IP透传(比如启用hostNetwork: true、Proxy Protocol,或者使用云厂商负载均衡的源IP保留功能),Pod能直接看到发起请求的VM IP(10.194.65.4),这种情况直接添加VM的IP到允许列表即可:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: labels: env: dev namespace: big-calculator-dev name: big-calculator-dev namespace: big-calculator-dev spec: ingress: # 原有规则:允许同网段容器的443端口访问 - from: - ipBlock: cidr: 172.18.0.0/21 ports: - port: 443 protocol: TCP # 新增规则:允许VM的IP访问 - from: - ipBlock: cidr: 10.194.65.4/32 ports: - port: 443 protocol: TCP podSelector: {} policyTypes: - Ingress
注意事项
- 不确定Ingress Controller的标签或命名空间?执行
kubectl get pods -A -l <你的Ingress标签>就能查到,比如默认NGINX Ingress的标签是app=nginx-ingress; - 两种场景二选一即可,根据你的Ingress实际配置决定;
- 新增规则和原有规则是逻辑或的关系,满足任意一条规则的流量都能被放行。
内容的提问来源于stack exchange,提问作者Maurice Amar
相关产品推荐
相关产品推荐

