Kubernetes NetworkPolicies 阻止 DNS

问题描述

我有一个 AKS 集群 (Azure CNI),我正在尝试在其上实施 NetworkPolicies。我创建的网络策略是

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
Metadata:
  name: myserver
spec:
  podSelector:
    matchLabels:
      service: my-server
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          service: myotherserver
    - podSelector:
        matchLabels:
          service: gateway
    - podSelector:
        matchLabels:
          service: yetanotherserver
    ports:
     - port: 8080
       protocol: TCP
  egress:
    - to:
      ports:
       - port: 53
         protocol: UDP
       - port: 53
         protocol: TCP
       - port: 5432
         protocol: TCP
       - port: 8080
         protocol: TCP

但是当我应用该策略时,我看到重复出现的消息表明无法解析主机名。我已经在 myserver pod 上安装了 dnsutils;并且可以看到 DNS 请求超时;我也试过在同一个 pod 上安装 tcpdump;我可以看到从 myserver 到 kube-dns 的请求。我没有看到任何回复

如果我删除 networkpolicy DNS 会直接回来;所以我确定我的网络策略存在问题,但找不到允许 DNS 流量的方法。如果有人能阐明我哪里出错了,将不胜感激!

解决方法

为避免重复,请创建单独的网络策略以开放 DNS 流量。首先我们标记 kube-system 命名空间。然后允许从所有 pod 到 kube-system 命名空间的 DNS 流量。

kubectl label namespace kube-system name=kube-system

kubectl create -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-dns-access
  namespace: <your-namespacename>
spec:
  podSelector:
    matchLabels: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          name: kube-system
    ports:
    - protocol: UDP
      port: 53

EOF