Kubernetes Pod 流量又超负载了,NetworkPolicy 助你轻松搞定它!

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

fb7b2d3a275984824a830dcea9d51dc4.jpeg

如果你希望在 IP 地址或端口层面(OSI 第 3 层或第 4 层)控制网络流量, 则你可以考虑为集群中特定应用使用 Kubernetes 网络策略(NetworkPolicy)。NetworkPolicy 是一种以应用为中心的结构,允许你设置如何允许 Pod 与网络上的各类网络“实体” (我们这里使用实体以避免过度使用诸如“端点”和“服务”这类常用术语, 这些术语在 Kubernetes 中有特定含义)通信。 NetworkPolicy 适用于一端或两端与 Pod 的连接,与其他连接无关。

Pod 可以通信的 Pod 是通过如下三个标识符的组合来辩识的:

  1. 1. 其他被允许的 Pods(例外:Pod 无法阻塞对自身的访问)

  2. 2. 被允许的名字空间

  3. 3. IP 组块(例外:与 Pod 运行所在的节点的通信总是被允许的, 无论 Pod 或节点的 IP 地址)

在定义基于 Pod 或名字空间的 NetworkPolicy 时, 你会使用选择算符来设定哪些流量可以进入或离开与该算符匹配的 Pod。另外,当创建基于 IP 的 NetworkPolicy 时,我们基于 IP 组块(CIDR 范围)来定义策略。

a7f9381aac4e8314aa3b79e4eb0b179b.png
Kubernetes:网络策略

NetworkPolicy 是一个 Kubernetes 对象,它允许使用 IP 地址、端口、协议和标签等各种因素创建策略来限制命名空间中 pod 与外部实体之间的通信。

ingress部分定义流入流量规则,而该egress部分定义流出流量规则。NetworkPolicy 根据podSelector标签选择 Pod、使用namespaceSelector在特定命名空间中选择Pod,以及指定ipBlock设置允许或拒绝访问 Pod 的IP 地址块。

入口和出口流量

cf0631a557e3bb7f5198480b0aaca6c1.png
Ingress and Egress Traffic

入口流量是指定向到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。

b6a120cf89f7e9d3bde27c1dd848c7b5.png
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 的字段。

6b180f1dbdae97be51b7d8c64bd35973.png
命名空间选择器
...
ingress:
  - from:
      - namespaceSelector:
          matchLabels:
          name: namespace1
    ports:
      - port: 8080
        protocol: TCP
...

在这种情况下,它允许来自 带有namespace1标签的命名空间中 pod 的流量。

ip块

ipBlock选择器将选择特定的 IP CIDR 范围以用作入站流量来源或出站流量目的地。这些应该是集群外部 IP,因为 Pod IP 存在时间短暂的且随机产生。

9d9876e835a7ebb95f4fe0fbbd934e19.png
ipBlock
...
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. 1. 隔离 default 名字空间下 role=db 的 Pod (如果它们不是已经被隔离的话)。

  2. 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。

4e6782c9d6e593b5441f7352dfb7de49.gif

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

3d49f06712232b075f78209203db1672.png

你可能还喜欢

点击下方图片即可阅读

69e9bd83868bf6864ae2837ffb8c8896.jpeg

容器网络里的那些坑:记一次持续三个月的 Kubernetes DNS 排障过程

d7e927c3b2542c0a53bc2261f6b8a393.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

4d50159d769e332476a991b3e648ded9.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值