NetworkPolicy
NetworkPolicy 概述
- 网络策略,管控Pod间的通信流量;
- k8s的名称空间,仅用于为资源名称提供隔离机制,而默认Pod与Pod间通信都是放行的;
- egress:出站流量
- ingress:入站流量
NetworkPolicy Explain
apiVersion: networking.k8s.io/v1 # 资源隶属的API群组及版本号
kind: NetworkPolicy # 资源类型的名称,名称空间级别的资源;
metadata: # 资源元数据
name <string> # 资源名称标识
namespace <string> # NetworkPolicy是名称空间级别的资源
spec: # 期望的状态
podSelector <Object> # 当前规则生效的同一名称空间中的一组目标Pod对象,必选字段,空值表示当前名称空间中的所有Pod资源
policyTypes <[]string> # Ingress表示生效ingress字段;Egress表示生效egress字段,同时提供表示二者均有效
ingress <[]Object> # 入站流量源端点对象列表,白名单,空值表示“所有”
- from <[]Object> # 具体的端点对象列表,空值表示所有合法端点
- ipBlock <Object> # IP地址块范围内的端点,不能与另外两个字段同时使用
- namespaceSelector <Object> # 匹配的名称空间内的端点
podSelector <Object> # 由Pod标签选择器匹配到的端点,空值表示<none>
ports <[]Object> # 具体的端口对象列表,空值表示所有合法端口
egress <[]Object> # 出站流量目标端点对象列表,白名单,空值表示“所有”
- to <[]Object> # 具体的端点对象列表,空值表示所有合法端点,格式同ingres.from;
ports <[]Object> # 具体的端口对象列表,空值表示所有合法端口NetworkPolicy Example-1
-
定义允许的入站流量
-
netpol-dev-demoapp-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: demoapp-ingress
namespace: dev # 针对dev名称空间
spec:
podSelector:
matchLabels:
app: demoapp # 仅对dev名称空间中包含app: demoapp标签的pod有效
policyTypes: ["Ingress"] # 仅对入站流量生效
ingress: # 入站流量具体的规则定义(白名单)
- from: # 入站流量规则一
- namespaceSelector:
matchExpressions:
- key: name
operator: In
values: [dev, kube-system, logs, monitoring, kubernetes-dashboard] # 对这些名称空间中的入站流量予以放行
#- ipBlock:
# cidr: 192.168.0.0/16 # 来自此网段的流量也予以放行
- from: # 入站流量规则二
- namespaceSelector:
matchExpressions:
- {key: name, operator: NotIn, values: ["default"]} # 除default名称空间以外允许访问dev名称空间下的80端口
ports:
- protocol: TCP
port: 80NetworkPolicy Example-2
-
定义拒绝所有出站和入站规则
- 如果只定义了允许放行的入站流量,但流量依旧会被放行,因为默认是全部流量都允许放行的,所以还需定义默认的全部拒绝策略才能实现部分放行部分拒绝
-
netpol-dev-denyall.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
namespace: dev
spec:
podSelector: {}
policyTypes: ["Ingress", "Egress"]
egress:
- to:
- podSelector: {}
ingress:
- from:
- podSelector: {}NetworkPolicy Example-3
- 定义允许的出站流量
- netpol-dev-demoapp-egress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: demoapp-egress
namespace: dev
spec:
podSelector:
matchLabels:
app: demoapp
policyTypes: ["Egress"] # 策略类型出站规则
egress: # 出站规则具体定义(白名单);to与to之间是或逻辑,to中的内容是与逻辑(并且关系)
- to: # 访问外部UDP/53端口允许
ports:
- protocol: UDP
port: 53
- to: # 访问外部标签为redis的pod并且目标端口只能为TCP/6379的流量放行
- podSelector:
matchLabels:
app: redis
ports:
- protocol: TCP
port: 6379
- to: # 访问外部标签为demoapp的pod并且目标端口只能为TCP/80的流量放行
- podSelector:
matchLabels:
app: demoapp
ports:
- protocol: TCP
port: 80