网络通信 频道

掌握K8s网络策略的关键要点

  网络策略(NetworkPolicy)是Kubernetes中的一种资源对象,用于定义和控制Pod之间的网络通信规则。它允许您在Kubernetes集群中定义详细的网络规则,以控制哪些Pod可以相互通信,以及允许或禁止的流量。网络策略提供了一种实现细粒度网络访问控制的方式,帮助管理员和开发者确保集群中的网络通信符合特定的安全性和策略需求。

  一、Pod隔离的两种类型

  Pod 有两种隔离:

  出口隔离

  入口隔离

  它们涉及到可以建立哪些连接。这里的“隔离”不是绝对的,而是意味着“有一些限制”。另外的,“非隔离方向”意味着在所述方向上没有限制。这两种隔离(或不隔离)是独立声明的, 并且都与从一个 Pod 到另一个 Pod 的连接有关。

  默认情况下,一个 Pod 的出口是非隔离的,即所有外向连接都是被允许的。如果有任何的 NetworkPolicy 选择该 Pod 并在其policyTypes 中包含 Egress,则该 Pod 是出口隔离的, 称这样的策略适用于该 Pod 的出口。当一个 Pod 的出口被隔离时, 唯一允许的来自 Pod 的连接是适用于出口的 Pod 的某个 NetworkPolicy 的 egress 列表所允许的连接。这些 egress 列表的效果是相加的。

  默认情况下,一个 Pod 对入口是非隔离的,即所有入站连接都是被允许的。如果有任何的 NetworkPolicy 选择该 Pod 并在其 policyTypes 中包含 Ingress,则该 Pod 被隔离入口, 称这种策略适用于该 Pod 的入口。当一个 Pod 的入口被隔离时,唯一允许进入该 Pod 的连接是来自该 Pod 节点的连接和适用于入口的 Pod 的某个 NetworkPolicy 的 ingress 列表所允许的连接。这些 ingress 列表的效果是相加的。

  网络策略是相加的,所以不会产生冲突。如果策略适用于 Pod 某一特定方向的流量,Pod 在对应方向所允许的连接是适用的网络策略所允许的集合。因此,评估的顺序不影响策略的结果。要允许从源 Pod 到目的 Pod 的连接,源 Pod 的出口策略和目的 Pod 的入口策略都需要允许连接。如果任何一方不允许连接,建立连接将会失败。

  二、NetworkPolicy 配置详解

  以下是一个NetworkPolicy的示例,参阅 NetworkPolicy[1] 来了解资源的完整定义。

  三、应用场景

  它是一个kuebenetes资源,用于限制pod出入流量,提供pod级别和namespace级别网络访问控制。

  应用程序间的访问控制,例如项目A不能访问项目B的pod

  开发环境命名空间不能访问测试环境命名空间Pod

  当pod暴露到外部时,需要做Pod白名单

  多租户网络环境隔离

  四、网络访问控制案例

  案例1

  拒绝命名空间下所有pod入、出站流量:

  上述网络策略是禁止test命名空间的所有pod进出流量。

  在没有创建网络策略时,test命名空间的Pod都能访问外网,如下:

  测试

  在deny-all网络策略后,test命名空间下的容器就不能访问外网:

  测试

  外部Pod之间相互也不能访问了。这里在test命名空间启动一个nginx容器作为测试。

  测试

  案例2

  拒绝其他命名空间pod访问:

  在生成环境中或许有这样的需求,运行相同命名空间的pod相互访问,拒绝其他命名空间访问该命名空间的所有Pod。

  这里用两个命名空间进行模拟,一个是开发环境dev,一个是生成环境pro。现在有这样一个需求,生成环境的pro下的所有Pod不能访问dev开发环境的所有Pod。

  先创建两个命名空间

  创建命名空间

  分别在两个命名空间启动三个测试pod:

  查看pod的状态:

  Pod的状态

  在没有做网络策略时,pro命名空间下的pod可以与dev命名空间下的Pod相互通讯,如下:

  测试Pod

  创建网络策略,如下:

  验证结果,如下,dev命名空间下的pod不能访问pro命名空间下的所有pod,dev命名空间的pod可以相互访问:

  验证结果

  案例3

  允许其他命名空间pod访问指定应用 现在有这样一个需求,允许其他命名空间访问pro命名空间指定pod,pod标签app=web。先给pro-web pod 添加上标签,如下:

  创建网络策略,网络策略内容如下,创建之前把之前测试的网络测试删除。

  即所有名称空间的pod都可以访问pro名称空间下的app=web的pod,和K8s默认一样,没意义。但和案列1搭配即可实现一个可访问,一个不可访问。单独此规则,和K8S默认一样的,如下:

  结合案例1拒绝命名空间所以pod入,出站流量规则,如下:

  CKA真题

  (1) 题目1:

  真题

  切换 k8s 集群环境:kubectl config use-context hk8s

  Task:

  在现有的 namespace internal 中创建一个名为 allow-port-from-namespace 的新 NetworkPolicy。

  确保新的 NetworkPolicy 允许 namespace 中的 Pods 连接到 namespace internal 中的Pods 的 9000 端口。

  进一步确保新的NetworkPolicy:

  不允许对没有在监听端口 9000 的 Pods 的访问

  不允许不来自namespace internal的pods的访问

  (2) 题目2

  [candidate@node-1] $ kubectl config use-context hk8s

  Task:

  在现有的 namespace my-app 中创建一个名为 allow-port-from-namespace 的新 NetworkPolicy。

  确保新的 NetworkPolicy 允许 namespace echo 中的 Pods 连接到 namespace my-app 中的 Pods 的 9000 端口。

  进一步确保新的 NetworkPolicy:

  不允许对没有在监听 端口 9000 的 Pods 的访问

  不允许非来自 namespace echo 中的 Pods 的访问

  参考资料:

  [1]NetworkPolicy: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#networkpolicy-v1-networking-k8s-io

0
相关文章