Kubernetes NetworkPolicy是一种使用标签选择器来定义Pod级别的网络管理策略,而ACK GlobalNetworkPolicy在此基础之上,增加了集群层面的网络策略功能,实现集群维度的网络策略管理。如果您需要对集群的网络安全执行细致化的管理策略,本文档将介绍如何使用ACK GlobalNetworkPolicy来实现这一需求。
前提条件
步骤一:安装Poseidon组件
Poseidon是容器NetworkPolicy组件,支持Kubernetes标准的NetworkPolicy功能。
安装Poseidon组件0.5.1及以上版本,并开启ACK NetworkPolicy功能选项。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在组件管理页面,单击网络页签,在Poseidon组件卡片的右下角,单击安装。
在安装组件Poseidon对话框,勾选启用ACK NetworkPolicy,然后单击确定。
步骤二:使用ACK GlobalNetworkPolicy
ACK GlobalNetworkPolicy的定义和使用方法与Kubernetes NetworkPolicy类似。而它的规则在没有明确指定的情况下,将默认影响整个集群的节点和Pod。
语法说明
ACK GlobalNetworkPolicy基本的结构如下:
apiVersion: network.alibabacloud.com/v1beta2
kind: GlobalNetworkPolicy
metadata:
name: example
spec:
podSelector: # NetworkPolicy作用的Pod范围,默认:匹配所有Pod。
matchLabels:
foo: bar # 选择带有标签foo:bar的Pod。
namespaceSelector: # NetworkPolicy作用的Namespace范围。默认:匹配所有Namespace,此规则与podSelector为And关系。
matchLabels:
foo: bar # 选择带有标签foo:bar的命名空间。
policyTypes: # NetworkPolicy生效的方向。
- Ingress # 策略将应用于入站流量。
- Egress # 策略将应用于出站流量。
ingress: [] # 入站规则。
egress: [] # 出站规则。
使用限制
在单个集群中,规则使用限制如下:
GlobalNetworkPolicy资源数量应少于100个。
单个GlobalNetworkPolicy中的入站
ingress
和出站egress
规则数量应少于20个。单个入站或出站规则中的端口
ports
数量应少于10个。
ingress/egress规则
ingress
和egress
规则设定了允许通过NetworkPolicy的流量的源地址和目的地址。两者的规则结构相同,通过from
(对于ingress
)和to
(对于egress
)明确指定允许的通信范围。
apiVersion: network.alibabacloud.com/v1beta2
kind: GlobalNetworkPolicy
metadata:
name: example # 策略名称
spec:
podSelector: {}
namespaceSelector: null
policyTypes:
- Ingress # 策略包括入站规则
- Egress # 策略包括出站规则
ingress:
- from:
- namespaceSelector: # 允许具有匹配标签的命名空间中的Pod入站。
matchLabels:
foo: bar
podSelector: # 允许具有匹配标签的Pod入站。
matchLabels:
foo: bar
ports:
- protocol: TCP # 允许TCP流量,取值为TCP或UDP。
port: 443 # 允许端口443。
- from:
- ipBlock: # 定义允许集群外发起入站请求的CIDR范围。
cidr: "172.16.0.0/16"
except:
- "172.16.1.0/24" # 从允许集群外的入站来源范围中排除CIDR范围"172.16.1.0/24"。
egress:
- to:
- namespaceSelector: # 允许出站到具有匹配标签的命名空间中的Pod。
matchLabels:
foo: bar
podSelector: # 允许出站到具有匹配标签的Pod。
matchLabels:
foo: bar
- to:
- ipBlock: # 定义策略允许集群外出站到的CIDR范围。
cidr: "172.16.0.0/16"
except:
- "172.16.1.0/24" # 从允许集群外的出站目的地范围中排除CIDR范围"172.16.1.0/24"。
字段 | 描述 |
ipBlock | 静态的CIDR网段,用于描述集群外部的流量地址。该网段定义允许或拒绝哪些集群外的IP地址范围进入或离开集群内部的Pod。 |
podSelector | 通过label动态选择地址。用于描述集群内Pod的地址。 |
在创建网络策略时,您不能在同一条规则内同时使用ipBlock
和podSelector
或者namespaceSelector
。正确的方式是将ipBlock
和podSelector
分开如下:
ingress:
- from:
- ipBlock: # 第一个来源条件是ipBlock。
cidr: "192.168.0.0/16"
- podSelector: # 第二个来源条件是podSelector。
matchLabels:
key: value
ports:
- protocol: TCP
port: 80
下面是一个错误的示例,它将导致互斥。
使用示例
本文示例中均包含podSelector
配置,请根据实际使用需求进行调整。
配置GlobalNetworkPolicy
时请谨慎操作。如果未指定podSelector
和namespaceSelector
,该策略将应用于集群内的所有Pod。
拒绝指定应用Pod所有流量规则
以下YAML文件定义了一个GlobalNetworkPolicy,该策略仅作用于具有foo: bar
标签的Pod,拒绝所有入站与出站网络流量。
apiVersion: network.alibabacloud.com/v1beta2
kind: GlobalNetworkPolicy
metadata:
name: default-deny
spec:
podSelector:
matchLabels:
foo: bar
namespaceSelector: null
policyTypes:
- Ingress
- Egress
ingress: []
egress: []
允许指定应用Pod访问DNS
以下YAML文件定义了一个GlobalNetworkPolicy,该策略仅用于具有foo: bar
标签的Pod,允许这些Pod与集群内运行的DNS服务通信。
apiVersion: network.alibabacloud.com/v1beta2
kind: GlobalNetworkPolicy
metadata:
name: allow-dns
spec:
podSelector:
matchLabels:
foo: bar
namespaceSelector: null
policyTypes:
- Egress
egress:
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
podSelector:
matchLabels:
k8s-app: kube-dns