Kubernetes网络策略实战:使用ahmetb/kubernetes-network-policy-recipes限制应用流量访问

Kubernetes网络策略实战:使用ahmetb/kubernetes-network-policy-recipes限制应用流量访问

【免费下载链接】kubernetes-network-policy-recipes Example recipes for Kubernetes Network Policies that you can just copy paste 【免费下载链接】kubernetes-network-policy-recipes 项目地址: https://gitcode.com/gh_mirrors/ku/kubernetes-network-policy-recipes

引言:为什么需要Kubernetes网络策略?

在现代微服务架构中,安全性已成为不可忽视的核心要素。随着应用规模的扩大,服务间的网络通信变得日益复杂,传统的网络安全边界逐渐模糊。Kubernetes Network Policies(网络策略)正是为了解决这一痛点而生,它允许您在Pod级别实施精细的网络访问控制。

想象一下这样的场景:您的电商平台数据库不应被前端Web服务器以外的任何服务访问,或者某些敏感的后台管理接口只允许特定IP段的运维人员访问。这些安全需求正是Kubernetes网络策略大显身手的舞台。

通过本文,您将掌握:

  • ✅ Kubernetes网络策略的核心概念和工作原理
  • ✅ 10+种常见网络策略场景的实战配置
  • ✅ 出站(egress)和入站(ingress)流量的精细化控制
  • ✅ 多命名空间环境下的网络隔离策略
  • ✅ 生产环境中网络策略的最佳实践

网络策略基础概念解析

NetworkPolicy核心组件

mermaid

关键特性对比表

特性描述默认行为
podSelector选择应用策略的Pod空选择器匹配所有Pod
ingress入站流量规则未指定时允许所有入站流量
egress出站流量规则未指定时允许所有出站流量
policyTypes策略类型默认为["Ingress"]
规则评估多策略处理策略规则是叠加的(union)

实战场景一:基础流量控制

1.1 拒绝所有流量到应用

这是网络策略的起点,先黑名单后白名单是最佳实践。

# web-deny-all.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: web-deny-all
spec:
  podSelector:
    matchLabels:
      app: web
  ingress: []  # 空数组表示拒绝所有入站流量

应用场景:

  • 初始化安全策略,为后续白名单做准备
  • 临时隔离故障服务进行调试
  • 保护敏感应用免受未经授权的访问

1.2 限制流量到特定应用

只允许带有特定标签的Pod访问目标应用。

# api-allow.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: api-allow
spec:
  podSelector:
    matchLabels:
      app: bookstore
      role: api
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: bookstore  # 只允许同应用的Pod访问

实战场景二:命名空间级别的网络隔离

2.1 拒绝其他命名空间的流量

mermaid

# deny-other-namespaces.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: deny-other-namespaces
spec:
  podSelector: {}  # 应用到所有Pod
  ingress:
  - from:
    - podSelector: {}  # 只允许同一命名空间内的Pod

2.2 允许特定命名空间的访问

# allow-production-namespace.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-production-access
spec:
  podSelector:
    matchLabels:
      app: database
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          environment: production  # 只允许生产环境命名空间

实战场景三:外部流量控制

3.1 允许外部客户端访问

# web-allow-external.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: web-allow-external
spec:
  podSelector:
    matchLabels:
      app: web
  ingress:
  - {}  # 空对象表示允许所有来源

3.2 限制外部访问端口

# web-allow-external-port80.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: web-allow-external-port80
spec:
  podSelector:
    matchLabels:
      app: web
  ingress:
  - ports:
    - port: 80
      protocol: TCP

实战场景四:出站(egress)流量控制

4.1 拒绝所有出站流量

# deny-all-egress.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: deny-all-egress
spec:
  podSelector:
    matchLabels:
      app: secure-app
  policyTypes:
  - Egress
  egress: []  # 空数组拒绝所有出站流量

4.2 允许DNS解析的出站策略

# allow-dns-egress.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-dns-egress
spec:
  podSelector:
    matchLabels:
      app: restricted-app
  policyTypes:
  - Egress
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: kube-system
      podSelector:
        matchLabels:
          k8s-app: kube-dns
    ports:
    - port: 53
      protocol: UDP
    - port: 53
      protocol: TCP

高级场景:多选择器和端口控制

5.1 使用多个选择器

# multi-selector-policy.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: multi-selector-policy
spec:
  podSelector:
    matchLabels:
      app: critical-api
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
      namespaceSelector:
        matchLabels:
          environment: production
    - podSelector:
        matchLabels:
          app: backend
    ports:
    - port: 8080
      protocol: TCP

5.2 端口级别的精细控制

# port-specific-policy.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: port-specific-policy
spec:
  podSelector:
    matchLabels:
      app: multi-port-service
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: web-client
    ports:
    - port: 80
      protocol: TCP
  - from:
    - podSelector:
        matchLabels:
          app: admin-client
    ports:
    - port: 8080
      protocol: TCP
    - port: 8443
      protocol: TCP

网络策略最佳实践指南

6.1 策略设计原则

原则描述示例
最小权限只授予必要的访问权限数据库只允许应用服务器访问
防御纵深多层安全策略叠加命名空间隔离+应用级别策略
明确拒绝先拒绝所有,再按需允许初始策略设置为ingress: []
标签一致性使用一致的标签策略app, environment, tier标签

6.2 策略部署流程

mermaid

6.3 常见陷阱与解决方案

陷阱1:DNS解析失败

# 错误配置:忘记允许DNS流量
egress: []  # 这会阻止Pod解析域名

# 正确配置:允许DNS流量
egress:
- to:
  - namespaceSelector:
      matchLabels:
        kubernetes.io/metadata.name: kube-system
    podSelector:
      matchLabels:
        k8s-app: kube-dns
  ports:
  - port: 53
    protocol: UDP
  - port: 53
    protocol: TCP

陷阱2:策略规则冲突

# 策略A:允许所有流量
ingress:
- {}

# 策略B:拒绝某些流量
ingress: []

# 结果:策略A优先,允许所有流量
# 解决方案:使用更具体的选择器

实战演练:电商平台网络策略设计

7.1 架构概述

假设我们有一个典型的电商平台,包含以下组件:

  • 前端Web服务 (app=web, tier=frontend)
  • 商品API服务 (app=product-api, tier=backend)
  • 用户API服务 (app=user-api, tier=backend)
  • 订单数据库 (app=order-db, tier=database)

7.2 分层策略配置

数据库层策略:

# order-db-policy.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: order-db-isolation
  namespace: database
spec:
  podSelector:
    matchLabels:
      app: order-db
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: order-api
      namespaceSelector:
        matchLabels:
          environment: production
    ports:
    - port: 5432
      protocol: TCP

API层策略:

# api-layer-policy.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: api-layer-protection
  namespace: backend
spec:
  podSelector:
    matchLabels:
      tier: backend
  ingress:
  - from:
    - podSelector:
        matchLabels:
          tier: frontend
      namespaceSelector:
        matchLabels:
          environment: production
    - podSelector:
        matchLabels:
          app: monitoring-agent
      namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: monitoring

监控与调试技巧

8.1 策略验证命令

# 查看当前命名空间的所有网络策略
kubectl get networkpolicies

# 查看特定网络策略的详细信息
kubectl describe networkpolicy <policy-name>

# 测试网络连通性
kubectl run test-pod --rm -it --image=alpine -- sh
# 在测试Pod中执行:
wget -qO- --timeout=2 http://target-service

【免费下载链接】kubernetes-network-policy-recipes Example recipes for Kubernetes Network Policies that you can just copy paste 【免费下载链接】kubernetes-network-policy-recipes 项目地址: https://gitcode.com/gh_mirrors/ku/kubernetes-network-policy-recipes

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值