0%

K8S中的网络策略

怎样限制Pod中的网络流量?

已知pod名为 webapp ,label为 name=webapp 。现在想要模拟无法访问数据库,限制它的流量,禁止它访问 10.0.0.0/24 网段的所有3306端口,该怎么实现?

方法一:使用NetworkPolicy限流
方法二:开启pod特权模式,在pod内部使用iptables限流
方法三:登录pod所在宿主机,在pod所在ns中使用iptables限流

NetworkPolicy

网络策略(NetworkPolicy)是一种关于 Pod 间及与其他网络端点间所允许的通信规则的规范。
NetworkPolicy 资源使用 标签 选择 Pod,并定义选定 Pod 所允许的通信规则。

网络策略通过网络插件来实现。要使用网络策略,用户必须使用支持 NetworkPolicy 的网络解决方案。创建一个资源对象,而没有控制器来使它生效的话,是没有任何作用的。

默认情况下,Pod 是非隔离的,它们接受任何来源的流量。
Pod 可以通过相关的网络策略进行隔离。一旦命名空间中有网络策略选择了特定的 Pod,该 Pod 会拒绝网络策略所不允许的连接。 (命名空间下其他未被网络策略所选择的 Pod 会继续接收所有的流量)
网络策略不会冲突,它们是附加的。如果任何一个或多个策略选择了一个 Pod, 则该 Pod 受限于这些策略的 ingress/egress 规则的并集。因此评估的顺序并不会影响策略的结果。

更多内容参考网络策略NetworkPolicy最佳实践

基础规则:

  • 如果 Pod 没有被 NetworkPolicy 匹配到,那么它的流量是被允许的
  • 如果 Pod 被 NetworkPolicy 匹配到,但是没有出口/入口规则被匹配到,那么它的出口/入口流量是被禁止的
  • 只能指定规则来允许流量通行,而不能直接禁止流量通行
  • NetworkPolicy 中的 Rule 之间的匹配逻辑是 OR
  • NetworkPolicy 默认的作用域是 Pod 所在的 Namespace

1、创建np.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: webapp-network-policy
namespace: default
spec:
podSelector:
matchLabels:
name: webapp
policyTypes:
- Ingress
- Egress
ingress:
- {}
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 10.0.0.0/24

这种实现方式,其实有一个问题,就是限流时不止限制了3306端口,还限制了 10.0.0.0/24 网段的所有端口。
能不能只限制 10.0.0.0/24 网段的 3306 端口呢?理论上可以实现,然而我不会。。。

2、执行限流

1
kubectl apply -f np.yaml

3、解除限流

1
kubectl delete -f np.yaml

pod特权模式限流

1、在pod定义中添加:

1
2
3
securityContext:
privileged: true
#runAsUser: 0

2、在pod内部执行限流

1
iptables -A OUTPUT -p tcp --dport 3306 -j DROP

3、解除限流

1
2
iptables -t nat -nL --line-number
iptables -D OUTPUT 1

宿主机限流

1、登录宿主机

2、查找容器pid

1
2
docker ps | grep webapp
docker inspect <container_id> | grep pid -i

3、执行限流

1
nsenter -t <pid> -n iptables -A OUTPUT -p tcp --dport 3306 -j DROP

4、解除限流

1
2
nsenter -t <pid> -n iptables -t nat -nL --line-number
nsenter -t 8993 -n iptables -D OUTPUT 1