Cilium Network Policy
2021-01-01 20:28
标签:namespace 排除 mes 大小 pattern 百度 man 标签 k8s 使用busybox启动三个pod:box-a,box-b,box-c,测试a->b,c->b联通性 配置基于label的策略:只允许a->b 以上配置使用了简单的入口规则来允许带有标签 配置允许所有的endpoints到 配置拒绝所有的endpoints到 配置基于label的策略,b只能到a 配置允许 配置拒绝 配置允许 *配置之后没有达到预期效果,反而是httpbox-b到其他所有的通信都被拒绝了 Cilium基于entities的策略由 Cilium定义了下列实体类型: 配置允许 配置允许 配置只允许本地主机到 CIDR策略用于定义往返于不受Cilium管理的endpoints的策略,因此没有与之关联的标签。这些通常是运行在特定子网中的外部服务,VM或金属机。CIDR策略还可以用于限制对外部服务的访问,例如,将外部访问限制为特定的IP范围。CIDR策略可以在入口或出口应用。 如果Cilium无法将源或目的地映射到由labels定义的endpoints的身份,则CIDR适用于CIDR。例如,CIDR规则将适用于连接一侧为: 相反,CIDR规则不适用于连接的两端都由Cilium管理或使用属于群集中某个节点的IP(包括主机联网Pod)的流量。如上所述,可以使用基于labels, services或者entities的策略来允许该流量。 Cilium CIDR定义了以下几种类型的策略 入口策略 fromCIDR:允许与 出口策略 toCIDR:允许与 定义一个允许到外部CIDR网段的通信 该策略定义了标签 配置CIDR策略前 策略未配置前 策略配置生效后 DNS策略用于为不受Cilium管理但具有DNS可查询域名的endpoints定义第3层策略。Cilium允许从DNS响应中提供的IP地址,其方式类似于基于CIDR的策略中的IP 。当远程IP可能更改或事先不知道时,或者DNS更方便时,它是一种替代方案。要对DNS请求本身实施策略,需要使用第七层的策略。 *需要注意的是,基于DNS的规则旨在用于外部连接,其行为类似于基于CIDR的规则。 定义一个使用DNS的策略,httpbox-a只能访问百度的域名和IP 除了第3层策略外,还可以单独指定第4层的策略,它限制了endpoints使用特定协议在特定端口上收发数据包的能力。如果没有为endpoints指定第4层策略,则允许其在所有第4层端口和协议(包括ICMP)上发送和接收。如果指定了任何第4层策略,则ICMP将被阻止,除非它与该策略允许的连接相关。应用服务端口映射后,第4层策略将应用于端口。 配置一个简单的示例,httpbox-b对其他的所有服务只开启8000端口 策略未配置前 策略配置后,可以看到ICMP报文已经被禁止 与labels相关的4层配置,该策略定义了标签 第7层策略规则嵌入第4层示例规则中,并且可以为入口和出口指定。 目前第七层策略支持的有HTTP\DNS\Kafka(测试阶段)。 需要注意的是当前每个endpoints最多支持40个端口在第七层策略上,以及不支持节点选择的策略。 使用http类型的策略有以下字段可以选择: 配置示例:允许GET /_cat DNS策略可以通过以下方式应用: 注意事项:尽管可以在不使用任何其他第3层规则的情况下应用第7层DNS策略,但是第7层规则的存在将阻止其他的流量。 配置一个示例:httpbox-a只能访问baidu.com以及*.baidu.com Kafka策略可以定义的字段为: Cilium Network Policy 标签:namespace 排除 mes 大小 pattern 百度 man 标签 k8s 原文地址:https://blog.51cto.com/lullaby/25340291. 基于Label的策略
入口策略
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "a-to-b-allow"
spec:
endpointSelector:
matchLabels:
app: box-b
ingress:
- fromEndpoints:
- matchLabels:
app: box-a
app=box-a
的endpoint到带有标签app=box-b
的endpoint的通信,其他的默认拒绝。即:b只允许a的流量通过,其他拒绝app=box-b
的通信apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "all-to-b-allow"
spec:
endpointSelector:
matchLabels:
app: box-b
ingress:
- fromEndpoints:
- {}
app=box-b
的通信apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "all-to-b-deny"
spec:
endpointSelector:
matchLabels:
app: box-b
ingress:
- {}
出口策略
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "a-from-b-allow"
spec:
endpointSelector:
matchLabels:
app: box-b
egress:
- toEndpoints:
- matchLabels:
app: box-a
app=box-b
到所有的endpoints的通信apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "a-from-b-allow"
spec:
endpointSelector:
matchLabels:
app: box-b
egress:
- toEndpoints:
- {}
app=box-b
到所有的endpoints的通信apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "a-from-b-allow"
spec:
endpointSelector:
matchLabels:
app: box-b
egress:
- {}
2. 基于Service的策略
app=httpbox-b
的endpoint到default命名空间中的所有的serviceName=httpbox-a
的endpoint的通信apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "svc-a-from-b-allow"
spec:
endpointSelector:
matchLabels:
app: httpbox-b
egress:
- toServices:
- k8sService:
serviceName: httpbox-a
namespace: default
3. 基于Entities的策略
fromEntities
和toEntities
来定义;fromEntities
用于描述那些类型的实体可以访问所选择的endpoint;toEntities
用于描述所选择的endpoint可以访问的那些类型的实体。
host networking
模式运行的所有容器;host networking
模式运行的所有容器;network endpoints
的逻辑组。这包括本地集群的所有Cilium-managed endpoints
、本地集群中的unmanaged endpoints
以及 host, remote-node和init类型;health endpoints
;app=httpbox-a
的endpoint到本地主机的通信apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "a-to-host"
spec:
endpointSelector:
matchLabels:
app: httpbox-a
egress:
- toEntities:
- host
app=httpbox-a
的endpoint只到集群中其他节点,不到本地主机的通信apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "a-to-remote"
spec:
endpointSelector:
matchLabels:
app: httpbox-a
egress:
- toEntities:
- remote-node
app=httpbox-a
的endpoint的通信apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "a-from-host"
spec:
endpointSelector:
matchLabels:
app: httpbox-a
ingress:
- fromEntities:
- host
4. 基于IP/CIDR的策略
endpointSelector
选择的所有endpoints进行通信的源prefixes/CIDR列表。endpointSelector
所选择的所有endpoints进行通信的源prefixes/CIDR列表,但是这个列表中排除的部分子网是被禁止的。
endpointSelector
选择的endpoints进行通信的目标prefixes/CIDR列表 。需要注意的是,由一个fromEndpoints
选择的endpoints将自动允许回复给相应的目标endpoints。endpointSelector
所选择的所有endpoints进行通信的目标prefixes/CIDR列表,但是这个列表中排除的部分子网是被禁止的。apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "a-to-cidr"
spec:
endpointSelector:
matchLabels:
app: httpbox-a
egress:
- toCIDR:
- 114.114.114.114/32
- toCIDRSet:
- cidr: 223.0.0.0/8
except:
- 223.6.0.0/16
app=httpbox-a
所选择的endpoints只能访问114.114.114.114/32这个IP,和223.0.0.0/8中除了223.6.0.0/16这个子网的其他IP地址。5. 基于DNS的策略
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "a-to-baidu-dns"
spec:
endpointSelector:
matchLabels:
app: httpbox-a
egress:
- toEndpoints:
- matchLabels:
"k8s:io.kubernetes.pod.namespace": kube-system
"k8s:k8s-app": kube-dns
toPorts:
- ports:
- port: "53"
protocol: ANY
rules:
dns:
- matchPattern: "*"
- toFQDNs:
- matchName: "www.baidu.com"
二、第四层配置示例
1.Port
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "b-from-all-port"
spec:
endpointSelector:
matchLabels:
app: httpbox-b
ingress:
- toPorts:
- ports:
- port: "8000"
protocol: TCP
app=httpbox-c
所选择的endpoints才能访问httpbox-b的相应端口apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "b-from-c-port"
spec:
endpointSelector:
matchLabels:
app: httpbox-b
ingress:
- fromEndpoints:
- matchLabels:
app: httpbox-c
toPorts:
- ports:
- port: "8000"
protocol: TCP
三、第七层配置示例
L7Rules
结构是是一个包含协议特定字段枚举的基本类型。1.HTTP
GET
,POST
,PUT
,PATCH
,DELETE
等;foo.com
;apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "es-from-get"
spec:
endpointSelector:
matchLabels:
app: elasticsearch
release: ess
ingress:
- toCIDR:
- 10.11.92.33/32
toPorts:
- ports:
- port: "9200"
protocol: TCP
rules:
http:
- method: "GET"
path: "/_cat"
2.DNS
matchName
完全匹配的域。多个不同的名称可能会包含在单独的matchName
条目中,并且允许查询与matchName
匹配的域;matchPattern
模式中的域,并考虑通配符。模式中域名允许由a-z
,0-9
.
和-
这些字符组成;apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: "a-to-baidu-only-dns"
spec:
endpointSelector:
matchLabels:
app: httpbox-a
egress:
- toEndpoints:
- matchLabels:
"k8s:io.kubernetes.pod.namespace": kube-system
"k8s:k8s-app": kube-dns
toPorts:
- ports:
- port: "53"
protocol: ANY
rules:
dns:
- matchName: "baidu.com"
- matchPattern: "*.baidu.com"
- toFQDNs:
- matchName: "baidu.com"
- matchPattern: "*.baidu.com"
3.Kafka(测试阶段)
produce
, fetch
,createtopic
, deletetopic
,该字段与Role不兼容;apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "rule1"
spec:
endpointSelector:
matchLabels:
app: kafka
ingress:
- fromEndpoints:
- matchLabels:
app: empire-hq
toPorts:
- ports:
- port: "9092"
protocol: TCP
rules:
kafka:
- role: "produce"
topic: "deathstar-plans"
- role: "produce"
topic: "empire-announce"
文章标题:Cilium Network Policy
文章链接:http://soscw.com/index.php/essay/39420.html