Kubernetes 出口网络策略不适用于选定的 Pod

Rue*_*oel 1 nginx kubernetes weave

我在 kube 集群上设置出口网络策略时面临一个奇怪的问题。

基本上我希望我的 pod A 只能访问 pod B。

我有两个 Pod:

  1. 你好-k8s-部署
  2. nginx

hello-k8s-deploy pod 通过 NodePort 在端口上公开 API 8080。我的 nginx pod 只是一个访问 API 的镜像。

因此,让我们尝试登录 nginx pod 并访问 hello-k8s-deploy pod 公开的 API。

在此输入图像描述

上图显示 API 响应消息开头为Hello K8s!

现在,让我们在 nginx pod 上应用网络策略,以便它只能访问此 API,而不能访问其他内容。

网络政策:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: app
spec:
  podSelector:
    matchLabels:
      run: nginx
  egress:
    - to:
      - podSelector:
          matchLabels:
            app: hello-k8s-deploy
  policyTypes:
   - Egress
Run Code Online (Sandbox Code Playgroud)

以上政策将适用于带标签的 Podrun: nginx

规则是允许流量进入带标签的 Pod app: hello-k8s-deploy

让我们通过查看 pod nginx 和 hello-k8s-deploy 的定义来验证它

nginx:

在此输入图像描述

你好-k8s-部署

在此输入图像描述

正如我们所看到的,两个标签都匹配网络策略。

在我应用网络策略并再次访问 nginx 后,我希望能够以相同的方式工作并从 API 获得响应,但我收到以下错误。

在此输入图像描述

请注意:

  1. 所有资源都在同一个命名空间中app
  2. 我的网络插件是 weave-net,它根据文档支持网络策略。
  3. 我什至尝试指定命名空间选择器并添加端口 8080。

Rue*_*oel 7

我终于解决了这个问题,基本上我遇到的问题是could not resolve host hello-k8s-svc。这意味着 k8s 正在尝试使用该主机进行连接并通过 dns 名称(服务名称)进行解析。

由于我的 pod 只允许出口到 hello-k8s-deploy,因此它失败了,因为它还需要连接到 kube-dns 来解析 dns。因此,在应用出口之前,请确保命名空间中的 Pod 或所有 Pod 允许连接到 kube-dns 进行 DNS 解析。

修复方法只是为所有 Pod 创建一个出口资源,以在特定于 Pod 的出口配置之上连接到 kube-dns。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all-egress
spec:
  podSelector: {}
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          networking/namespace: kube-system
      podSelector:
        matchLabels:
          k8s-app: kube-dns
    ports:
    - protocol: TCP
      port: 53
    - protocol: UDP
      port: 53
  policyTypes:
  - Egress
Run Code Online (Sandbox Code Playgroud)

就我而言,我标记了 kube-system 命名空间:

 kubectl label namespace kube-system networking/namespace=kube-system
Run Code Online (Sandbox Code Playgroud)