网络策略(NetworkPolicy)
# NetworkPolicy 常用配置项
# 1NetworkPolicy示例
注意
- 网络策略有命名空间限制,默认只作用于当前命名空间中的 Pod。
- 如果在某个命名空间里,没有任何策略的话,则允许所有数据包通过。
- 如果设置了网络策略,但是策略里没有任何规则的话,则拒绝所有数据包通过。
# (1)允许来自特定标签的客户端访问
示例,只允许当前命名空间中具有xx=xx
标签的 Pod,去访问具有run=pod1
的另一些 Pod(限定为 TCP 协议的 80 端口)。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: mypolicy
spec:
podSelector:
matchLabels:
run: pod1 # 当前策略应用到哪些 Pod 上
policyTypes: # 策略类型(入策略/出策略)
- Ingress
ingress: # 入流量策略
- from: # 只允许来自(具有标签 xx=xx 的源客户端)以 TCP 协议访问被保护 Pod 的 80 端口
- podSelector:
matchLabels:
xx: xx
ports:
- protocol: TCP
port: 80
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# (2)允许来自特定网段的客户端访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: mypolicy
spec:
podSelector:
matchLabels:
run: pod1
policyTypes:
- Ingress
ingress:
- from:
- ipBlock: # 只允许来自网段 192.168.80.0/24 的客户端访问被保护的 Pod
cidr: 192.168.80.0/24
ports:
- protocol: TCP
port: 80
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# (3)允许来自指定命名空间的客户端访问
注:需要提前为命名空间设置标签,按标签的追踪命名空间。
kubectl label ns default name=default
1
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: mypolicy
spec:
podSelector:
matchLabels: # 空标签,保护当前命名空间中的所有 Pod
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector: # 允许具有标签(name=default)的命名空间中的客户端进行访问
matchLabels:
name: default
ports:
- protocol: TCP
port: 80
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# (4)允许访问指定的目标服务端
Egress 策略控制 Pod 的出口流量。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: mypolicy2
spec:
podSelector:
matchLabels: # 限制当前命名空间中的所有 Pod
policyTypes:
- Egress
egress:
- to:
- podSelector: # 只允许访问具有特定标签的目标服务端
matchLabels:
run: pod2
ports:
- protocol: TCP
port: 80
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
允许访问集群的 coreDNS 服务:
省略...
spec:
省略...
egress:
- to:
- namespaceSelector:
matchLabels:
name: kube-system
ports:
- protocol: UDP
port: 53
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
只允许访问谷歌 DNS 服务:
- 还得设置允许访问的网站,不然的话你就只能访问 DNS,永远 DNS,进不去网站
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: p3
spec:
podSelector:
matchLabels:
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 8.8.8.8/32
ports:
- protocol: UDP
port: 53
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# (5)例外-拒绝所有访问
此策略里没有任何的规则,则拒绝所有数据包通过。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# spec.podSelector(保护哪些Pod)
当前网络策略要作用于哪些 Pod 身上(要保护哪些 Pod)。保护具有指定标签的 Pod(限当前命名空间)。
# spec.policyTypes(策略类型)
当前网络策略的类型,可以是多种,但建议分开设置。
Ingress
:入口策略Egress
:出口策略
spec:
policyTypes:
- Ingress
- Egress
1
2
3
4
2
3
4
# spec.ingress(具体的入口策略)
# spec.ingress.from(允许哪些客户端来访问)
# spec.ingress.from.podSelector(客户端白名单-标签)
通过标签来定义客户端白名单。
如果 podSelector 下的字段为空,则表示允许来自所有的客户端访问。
spec:
ingress:
- from:
- podSelector:
matchLabels: # 空标签,允许来自所有客户端的访问
1
2
3
4
5
2
3
4
5
或:
spec:
ingress:
- from:
- podSelector:
matchExpressions: # 空表达式,允许来自所有客户端的访问
1
2
3
4
5
2
3
4
5
注意
如果spec.ingress.from.podSelector
和spec.ingress.from.ipBlock
同时存在,则它们是 “或” 的关系。
# spec.ingress.from.ipBlock(客户端白名单-网段)
允许来自网段192.168.80.0/24
的客户端进行访问。
spec:
ingress:
- from:
- ipBlock:
cidr: 192.168.80.0/24
1
2
3
4
5
2
3
4
5
注意
如果spec.ingress.from.podSelector
和spec.ingress.from.ipBlock
同时存在,则它们是 “或” 的关系。
# spec.ingress.from.namespaceSelector(客户端白名单-命名空间的标签)
# spec.ingress.ports(允许访问的端口)
# spec.egress(具体的出口策略)
# spec.egress.to(允许访问哪些目标服务器)
具体配置和ingress.from
策略相同。
编辑 (opens new window)