使用端口隔离命名空间和 Pod 的网络策略

networkpolicy to isolate namespace and pod with port

kubernetes V19

创建一个名为 allow-port-from-namespace 的新 NetworkPolicy,允许内部现有命名空间中的 Pods 连接到同一命名空间中其他 Pods 的端口 80。

确保新的 NetworkPolicy:

不允许访问 Pods 不在端口 80 上侦听 不允许来自 Pods 不在内部命名空间

中的访问

我想知道我是否可以在不向 namspace 和 pod 添加标签的情况下做到这一点?

k8s networkpolicy docs 你读到:

By default, pods are non-isolated; they accept traffic from any source.

Pods become isolated by having a NetworkPolicy that selects them. Once there is any NetworkPolicy in a namespace selecting a particular pod, that pod will reject any connections that are not allowed by any NetworkPolicy. (Other pods in the namespace that are not selected by any NetworkPolicy will continue to accept all traffic.)

Network policies do not conflict; they are additive. If any policy or policies select a pod, the pod is restricted to what is allowed by the union of those policies' ingress/egress rules. Thus, order of evaluation does not affect the policy result

这意味着一旦您分配(select)一个具有网络策略的 pod,您就永远不会设置拒绝规则,因为默认情况下拒绝所有操作。您只指定允许规则。

这个蜂鸣解释让我们回到 k8s 文档,您可以在其中阅读以下内容:

There are four kinds of selectors that can be specified in an ingress from section or egress to section:

podSelector: This selects particular Pods in the same namespace as the NetworkPolicy which should be allowed as ingress sources or egress destinations.

namespaceSelector: This selects particular namespaces for which all Pods should be allowed as ingress sources or egress destinations.

namespaceSelector and podSelector: A single to/from entry that specifies both namespaceSelector and podSelector selects particular Pods within particular namespaces [...]

我不会在这里粘贴所有文档,检查其余部分 here


现在回答你的问题:"I need to know if i can do it without adding a labels to namspace and pod or not ?"

您在上述文档中应该注意的是,您只能使用标签定位命名空间和 pods。

并且当您不使用名称空间标签时 select或者,select 或默认为部署网络策略的名称空间。

所以,是的,只要您在要定位的命名空间中部署网络策略,就可以在不向命名空间添加标签的情况下执行此操作。您也可以在不向 pod 添加标签的情况下执行此操作,只要这是命名空间中唯一的 pod。

从这个问题来看,我并没有……完全糊涂。

声明 1 --> 在同一个命名空间上,pod 可以与端口 80 通信

声明 2 --> 不允许访问 Pods 不监听端口 80

那么,有人可以在这里澄清一下吗?

他们到底在问什么?我们是否需要提供对 pod 的 80 访问权限?

下面的 yaml 将帮助您解决问题,它对我有用。 重点主要是只使用入口数组的端口部分。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy
spec:
  podSelector: {}   #selects all the pods in the namespace deployed
  policyTypes:
  - Ingress
  ingress:
  - ports:          #in input traffic allowed only through 80 port only
    - protocol: TCP
      port: 80

声明 2 --> 不允许访问 Pods 不监听端口 80

当 pod 不侦听此服务器的 TCP 状态时如何不允许。您还可以 pods 不侦听同一命名空间上的端口 80。我认为这在您上面的 yaml 中没有解决。

  1. 您需要先标记命名空间

例如 kubectl label ns namespace-name env: testing

2.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-port-from-namespace
  namespace: staging
spec:
  podSelector: {} 
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          env: staging
    ports:
    - protocol: TCP
      port: 80