Kubernetes 出口网络策略不适用于所选的 pod

Kubernetes Egress Network Policy is not working on a pod selected

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

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

我有两个 pods:

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

hello-k8s-deploy pod 通过 NodePort 在端口 8080 上公开了一个 API。 我的 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: nginx

的广告连播

并且规则是允许流量流向带有标签 app: hello-k8s-deploy

的 pod

让我们通过查看 pods nginx 和 hello-k8s-deploy

的定义来验证它

nginx:

hello-k8s-deploy

我们可以看到两个标签都符合网络策略。

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

注意:

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

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

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

修复只是为所有 pods 创建一个出口资源,以连接到 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

在我的例子中,我标记了 kube-system 命名空间:

 kubectl label namespace kube-system networking/namespace=kube-system