在命名空间之间隔离 k8s pods 网络

Isolate k8s pods network between namespaces

我需要在命名空间之间隔离 k8s pods 网络。

命名空间 ns-1 中的 pod-1 运行 无法从命名空间 ns-2.

中的 pod-2 访问网络

它的目的是在命名空间之间创建一个沙箱,并防止基于它的标签的特定 pods 之间的网络通信。

我正在尝试 NetworkPolicy 来做到这一点,但我对 k8s 的了解有点“粗糙”。

这可能吗?有人可以举个例子吗?


我正在尝试阻止所有 Intranet 通信并允许使用此互联网:

spec:
  egress:
  - ports:
    - port: 53
      protocol: UDP
    to:
    - ipBlock:
    cidr: 0.0.0.0/0
        except:
        - 10.0.0.0/8
        - 192.168.0.0/16
        - 172.16.0.0/12
        - 172.40.0.0/16
    - namespaceSelector: {}
      podSelector:
        matchLabels:
          k8s-app: kube-dns
  podSelector:
    matchExpressions:
    - key: camel.apache.org/integration
      operator: Exists
  policyTypes:
  - Egress

但是当我访问 google.com 之类的东西时,它正确解析了 DNS 但没有连接导致超时。

政策意图是:

我做错了什么?

Network Policies are very flexible, and you can configure it in different way. If we look to your case, then you have to create 2 policies for your cluster. First it is namespace network policy for your production and second one is for your sandbox. Of course, before to start to modify your network be sure that you choose, install, and configure network provider.的设置 它是用于隔离您的名称 NameSpace:

的 NetworkPolicy .yaml 文件示例
# You can create a "default" policy for a namespace which prevents all ingress
# AND egress traffic by creating the following NetworkPolicy in that namespace.
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: YourSandbox
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

然后您可以在此命名空间中创建您的 pod,它将被隔离。只需将名称空间名称添加到您的配置文件字符串:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: service-c
  namespace: YourSandbox

在这个例子中,我们添加了连接外部和内部到特定命名空间和服务的访问权限:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: access-service-c
  namespace: YourSandbox
spec:
  podSelector:
    matchLabels:
      app: YourSandboxService
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          env: YourProdactionNameSpase
    - podSelector:
        matchLabels:
          app: NameOfYourService
   egress:
   - to:
     - namespaceSelector:
         matchLabels:
           name: YourProdactionNameSpase
     - podSelector:
         matchLabels:
           app: NameOfYourService

使用此网络策略 ip Block 来配置出口阻止默认的本地专用网络 IP,并允许其余的互联网访问开放。

egress:
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
        except: 192.168.40.0/24 #Your pul of local private network IPs

如果您使用子网前缀的长度 /32,则表示您将规则的范围限制为仅此一个 IP 地址。