公众号关注 「奇妙的 Linux 世界」
设为「星标」,每天带你玩转 Linux !
如果你希望在 IP 地址或端口层面(OSI 第 3 层或第 4 层)控制网络流量, 则你可以考虑为集群中特定应用使用 Kubernetes 网络策略(NetworkPolicy)。NetworkPolicy 是一种以应用为中心的结构,允许你设置如何允许 Pod 与网络上的各类网络“实体” (我们这里使用实体以避免过度使用诸如“端点”和“服务”这类常用术语, 这些术语在 Kubernetes 中有特定含义)通信。 NetworkPolicy 适用于一端或两端与 Pod 的连接,与其他连接无关。
Pod 可以通信的 Pod 是通过如下三个标识符的组合来辩识的:
1. 其他被允许的 Pods(例外:Pod 无法阻塞对自身的访问)
2. 被允许的名字空间
3. IP 组块(例外:与 Pod 运行所在的节点的通信总是被允许的, 无论 Pod 或节点的 IP 地址)
在定义基于 Pod 或名字空间的 NetworkPolicy 时, 你会使用选择算符来设定哪些流量可以进入或离开与该算符匹配的 Pod。另外,当创建基于 IP 的 NetworkPolicy 时,我们基于 IP 组块(CIDR 范围)来定义策略。
NetworkPolicy 是一个 Kubernetes 对象,它允许使用 IP 地址、端口、协议和标签等各种因素创建策略来限制命名空间中 pod 与外部实体之间的通信。
该ingress
部分定义流入流量规则,而该egress
部分定义流出流量规则。NetworkPolicy 根据podSelector
标签选择 Pod、使用namespaceSelector
在特定命名空间中选择Pod,以及指定ipBlock
设置允许或拒绝访问 Pod 的IP 地址块。
入口和出口流量
入口流量是指定向到Kubernetes 集群中的一个 Pod 或一组 Pod 的传入网络流量。例如,如果集群外部的用户向集群内的 Pod 发送请求,则该流量将被视为该 Pod 的入口流量。
另一方面,出口流量是指Kubernetes 集群中一个或一组 pod 的传出网络流量。例如,如果集群中的 Pod 向集群外部的服务或外部端点发送请求,则该流量将被视为来自该 Pod 的出口流量。
网络策略
默认情况下,Kubernetes集群允许pod之间和外部访问不受限制的通信,这可能会带来安全风险,特别是在多个应用程序和团队共存的多租户环境中。
NetworkPolicy是一个Kubernetes 对象,允许你创建策略来定义 Pod 如何相互通信以及如何与特定命名空间内的外部实体通信。NetworkPolicy 规则可以基于 IP 地址、端口、协议和标签等各种因素,使你能够根据安全要求将流量限制到特定 Pod 或 Pod 组。
简称:netpol
$ kubectl api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
networkpolicies netpolnetworking.k8s.io/v1 true NetworkPolicy
网络策略示例
pod选择器
该podSelector
字段根据标签选择 Pod,并确定策略适用于哪些 Pod。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-network-policy
spec:
podSelector:
matchLabels:
name: backend
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
name: frontend
ports:
- port: 8080
protocol: TCP
egress:
- to:
- podSelector:
matchLabels:
name: database
ports:
- port: 5432
protocol: TCP
在这种情况下,此 NetworkPolicy 的目标是标签为name: backend
的 pod 。
ingress
部分表示允许--来自8080端口且带有标签为name: frontend
的pod的传入流量规则。
egress
部分表示允许--到达5432端口且带有标签为name: database
的pod的传出流量规则。
命名空间选择器
namespaceSelector
是一个允许你选择特定名称空间并将网络策略规则应用于这些名称空间内的所有 pod 的字段。
...
ingress:
- from:
- namespaceSelector:
matchLabels:
name: namespace1
ports:
- port: 8080
protocol: TCP
...
在这种情况下,它允许来自 带有namespace1
标签的命名空间中 pod 的流量。
ip块
ipBlock
选择器将选择特定的 IP CIDR 范围以用作入站流量来源或出站流量目的地。这些应该是集群外部 IP,因为 Pod IP 存在时间短暂的且随机产生。
...
ingress:
- from:
- ipBlock:
cidr: 192.168.0.0/16
ports:
- port: 8080
protocol: TCP
...
在本例中,该ipBlock
字段指定CIDR块为192.168.0.0/16
。这表示,仅当源 IP 地址位于此 CIDR 块内时, 才允许连接到 default
名字空间下的带有 name=backend
标签的所有 Pod 的 8080 TCP 端口 。
综合示例
下面是一个 NetworkPolicy 的综合示例:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
除非选择支持网络策略的网络解决方案,否则将上述示例发送到API服务器没有任何效果。
spec:NetworkPolicy 规约 中包含了在一个名字空间中定义特定网络策略所需的所有信息。
podSelector:每个 NetworkPolicy 都包括一个 podSelector
, 它对该策略所适用的一组 Pod 进行选择。示例中的策略选择带有 "role=db" 标签的 Pod。空的 podSelector
选择名字空间下的所有 Pod。
policyTypes:每个 NetworkPolicy 都包含一个 policyTypes
列表,其中包含 Ingress
或 Egress
或两者兼具。policyTypes
字段表示给定的策略是应用于进入所选 Pod 的入站流量还是来自所选 Pod 的出站流量,或两者兼有。 如果 NetworkPolicy 未指定 policyTypes
则默认情况下始终设置 Ingress
; 如果 NetworkPolicy 有任何出口规则的话则设置 Egress
。
ingress:每个 NetworkPolicy 可包含一个 ingress
规则的白名单列表。每个规则都允许同时匹配 from
和 ports
部分的流量。示例策略中包含一条简单的规则:它匹配某个特定端口,来自三个来源中的一个,第一个通过 ipBlock
指定,第二个通过 namespaceSelector
指定,第三个通过 podSelector
指定。
egress:每个 NetworkPolicy 可包含一个 egress
规则的白名单列表。每个规则都允许匹配 to
和 port
部分的流量。该示例策略包含一条规则, 该规则将指定端口上的流量匹配到 10.0.0.0/24
中的任何目的地。
所以,该网络策略示例的具体作用有:
1. 隔离
default
名字空间下role=db
的 Pod (如果它们不是已经被隔离的话)。2. (Ingress 规则)允许以下 Pod 连接到
default
名字空间下的带有role=db
标签的所有 Pod 的 6379 TCP 端口:
•
default
名字空间下带有role=frontend
标签的所有 Pod• 带有
project=myproject
标签的所有名字空间中的 Pod• IP 地址范围为 172.17.0.0–172.17.0.255 和 172.17.2.0–172.17.255.255 (即,除了 172.17.1.0/24 之外的所有 172.17.0.0/16)
3. (Egress 规则)允许 default
名字空间中任何带有标签 role=db
的 Pod 到 CIDR 10.0.0.0/24 下 5978 TCP 端口的连接。
本文转载自:「云原生百宝箱」,原文:https://url.hi-linux.com/sJ7ct,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。
最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。
你可能还喜欢
点击下方图片即可阅读
容器网络里的那些坑:记一次持续三个月的 Kubernetes DNS 排障过程
点击上方图片,『美团|饿了么』外卖红包天天免费领
更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!